{"version":3,"file":"bundle.js","sources":["../node_modules/.pnpm/@yuuza+webfx@1.10.4/node_modules/@yuuza/webfx/dist/webfx.esm.js","../src/Infra/utils.ts","../src/Infra/viewlib.ts","../src/I18n/I18n.ts","../src/Settings/Settings.ts","../src/API/Api.ts","../src/Player/PlayerFX.ts","../src/Player/PlayerCore.ts","../buildInfo","../src/Settings/AppVersion.ts","../src/API/UserStore.ts","../src/Infra/nanoid.ts","../src/Plugins/plugins.ts","../src/Plugins/pluginsUI.ts","../src/Settings/SettingsUI.tsx","../src/Infra/ui-views.tsx","../src/Infra/Router.ts","../src/Lyrics/Lyrics.ts","../src/Lyrics/SpanView.ts","../src/Lyrics/LineView.ts","../src/Infra/ListContentView.ts","../src/Lyrics/LyricsView.ts","../src/Lyrics/LyricsEdit.ts","../src/Track/Track.ts","../src/API/MessageClient.ts","../src/Track/TrackList.ts","../src/Track/Uploads.ts","../src/Track/ListIndex.ts","../src/API/User.ts","../src/Track/TrackContextMenu.ts","../src/Infra/desktopApi.ts","../src/Infra/BottomBar.tsx","../src/Infra/UI.ts","../src/Comments/CommentsView.tsx","../src/Comments/Discussion.tsx","../src/Track/NowPlaying.ts","../src/Player/ListenTogether.ts","../src/Track/Search.ts","../src/ServiceWorker/client.ts","../src/Overlay/infoProvider.ts","../src/main.ts"],"sourcesContent":["// file: utils.ts\nvar __awaiter$2 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nconst _object_assign = Object.assign;\nconst _object_hasOwnProperty = Object.prototype.hasOwnProperty;\n// Time & formatting utils:\nfunction strPadLeft(str, len, ch = ' ') {\n while (str.length < len) {\n str = ch + str;\n }\n return str;\n}\nfunction formatDuration(sec) {\n if (typeof sec !== 'number' || isNaN(sec))\n return '--:--';\n sec = Math.round(sec);\n var min = Math.floor(sec / 60);\n sec %= 60;\n return strPadLeft(min.toString(), 2, '0') + ':' + strPadLeft(sec.toString(), 2, '0');\n}\nconst fileSizeUnits = ['B', 'KB', 'MB', 'GB', 'TB'];\nfunction formatFileSize(size) {\n if (typeof size !== \"number\" || isNaN(size))\n return 'NaN';\n var unit = 0;\n while (unit < fileSizeUnits.length - 1 && size >= 1024) {\n unit++;\n size /= 1024;\n }\n return (unit > 0 ? size.toFixed(2) : size) + ' ' + fileSizeUnits[unit];\n}\nfunction formatDateTime(date) {\n var now = new Date();\n var sameday = date.getFullYear() === now.getFullYear()\n && date.getMonth() === now.getMonth()\n && date.getDate() === now.getDate();\n return sameday ? date.toLocaleTimeString() : date.toLocaleString();\n}\nfunction numLimit(num, min, max) {\n return (num < min || typeof num != 'number' || isNaN(num)) ? min :\n (num > max) ? max : num;\n}\nfunction createName(nameFunc, existsFunc) {\n for (let num = 0;; num++) {\n let str = nameFunc(num);\n if (!existsFunc(str))\n return str;\n }\n}\n/**\n * btoa, but supports Unicode and uses UTF-8 encoding.\n * @see https://stackoverflow.com/questions/30106476\n */\nfunction base64EncodeUtf8(str) {\n return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {\n return String.fromCharCode(('0x' + p1));\n }));\n}\nfunction sleepAsync(time) {\n return new Promise((resolve) => {\n setTimeout(resolve, time);\n });\n}\nfunction arrayRemove(array, val) {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === val) {\n array.splice(i, 1);\n i--;\n }\n }\n}\nfunction arrayInsert(array, val, pos) {\n if (pos === undefined)\n array.push(val);\n else\n array.splice(pos, 0, val);\n}\nfunction arrayMap(arr, func) {\n if (arr instanceof Array)\n return arr.map(func);\n var idx = 0;\n var ret = new Array(arr.length);\n for (var item of arr) {\n ret[idx] = (func(item, idx));\n idx++;\n }\n return ret;\n}\nfunction arrayForeach(arr, func) {\n var idx = 0;\n for (var item of arr) {\n func(item, idx++);\n }\n}\nfunction foreachFlaten(arr, func) {\n for (const it of arr) {\n if (it instanceof Array) {\n foreachFlaten(it, func);\n }\n else {\n func(it);\n }\n }\n}\nfunction arrayFind(arr, func) {\n if (arr instanceof Array)\n return arr.find(func);\n var idx = 0;\n for (var item of arr) {\n if (func(item, idx++))\n return item;\n }\n return null;\n}\nfunction arraySum(arr, func) {\n var sum = 0;\n arrayForeach(arr, (x) => {\n var val = func(x);\n if (val)\n sum += val;\n });\n return sum;\n}\nfunction objectApply(obj, kv, keys) {\n if (kv) {\n if (!keys)\n return _object_assign(obj, kv);\n for (const key in kv) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key) >= 0)) {\n const val = kv[key];\n obj[key] = val;\n }\n }\n }\n return obj;\n}\nfunction objectInit(obj, kv, keys) {\n if (kv) {\n for (const key in kv) {\n if (_object_hasOwnProperty.call(kv, key) && (!keys || keys.indexOf(key) >= 0)) {\n const val = kv[key];\n if (key.startsWith(\"on\") && obj[key] instanceof Callbacks) {\n obj[key].add(val);\n }\n else {\n obj[key] = val;\n }\n }\n }\n }\n return obj;\n}\nfunction mod(a, b) {\n if (a < 0)\n a = b + a;\n return a % b;\n}\nfunction readBlobAsDataUrl(blob) {\n return new Promise((resolve, reject) => {\n var reader = new FileReader();\n reader.onload = (ev) => {\n resolve(reader.result);\n };\n reader.onerror = (ev) => reject();\n reader.readAsDataURL(blob);\n });\n}\nArray.prototype.remove = function (item) {\n arrayRemove(this, item);\n};\nclass CallbacksImpl {\n constructor() {\n this._cbs = undefined;\n this._cbs_invoking = undefined;\n this._hook = undefined;\n this._invoking = false;\n }\n get onChanged() {\n var _a;\n (_a = this._hook) !== null && _a !== void 0 ? _a : (this._hook = new Callbacks());\n return this._hook;\n }\n get length() { return this._cbs ? this._cbs.size : 0; }\n invoke(...args) {\n var _a;\n if (!this._cbs)\n return;\n if (this._invoking)\n throw new Error(\"Cannot invoke callbacks during invocation\");\n this._invoking = true;\n this._cbs.forEach((x) => {\n try {\n x.apply(this, args);\n }\n catch (error) {\n console.error(\"Error in callback\", error);\n }\n });\n if (this._cbs_invoking) {\n for (const x of this._cbs_invoking) {\n this._cbs.add(x);\n }\n }\n (_a = this._cbs_invoking) === null || _a === void 0 ? void 0 : _a.clear();\n this._invoking = false;\n }\n add(callback) {\n var _a, _b;\n if (this._cbs === undefined) {\n this._cbs = new Set();\n }\n if (this._invoking) {\n (_a = this._cbs_invoking) !== null && _a !== void 0 ? _a : (this._cbs_invoking = new Set());\n this._cbs_invoking.add(callback);\n }\n else {\n this._cbs.add(callback);\n }\n (_b = this._hook) === null || _b === void 0 ? void 0 : _b.invoke(true, callback);\n return callback;\n }\n remove(callback) {\n var _a, _b;\n if (this._cbs === undefined)\n return;\n if (this._invoking) {\n (_a = this._cbs_invoking) === null || _a === void 0 ? void 0 : _a.delete(callback);\n }\n this._cbs.delete(callback);\n (_b = this._hook) === null || _b === void 0 ? void 0 : _b.invoke(false, callback);\n }\n waitOnce(callback) {\n if (arguments.length === 0) {\n return new Promise((resolve, reject) => {\n const cb = ((...args) => {\n this.remove(cb);\n resolve(args);\n });\n this.add(cb);\n });\n }\n else if (callback) {\n const cb = ((...args) => {\n this.remove(cb);\n return callback(...args);\n });\n this.add(cb);\n }\n else {\n throw new Error(\"Invalid callback\");\n }\n }\n}\nconst Callbacks = CallbacksImpl;\nlet accessedRefs = null;\nfunction beginRefCollect() {\n accessedRefs = new Set();\n}\nfunction endRefCollect() {\n const result = accessedRefs;\n accessedRefs = null;\n return result;\n}\nclass Ref {\n constructor(value) {\n this._value = undefined;\n this._onChanged = undefined;\n this._value = value;\n }\n get onChanged() {\n if (!this._onChanged)\n this._onChanged = new Callbacks();\n return this._onChanged;\n }\n get value() {\n if (accessedRefs)\n accessedRefs.add(this);\n return this._value;\n }\n set value(val) {\n this._value = val;\n if (this._onChanged)\n this.onChanged.invoke(this);\n }\n static from(value) {\n const ref = new Ref();\n ref._value = value;\n return ref;\n }\n static computed(func) {\n const ref = new Ref();\n let deps = null;\n const updateValue = () => {\n if (deps) {\n for (const dep of deps) {\n dep.onChanged.remove(updateValue);\n }\n }\n beginRefCollect();\n const value = func();\n deps = endRefCollect();\n for (const dep of deps) {\n dep.onChanged.add(updateValue);\n }\n ref.value = value;\n };\n updateValue();\n return ref;\n }\n}\nclass Lazy {\n constructor(func) {\n this._func = func;\n this._value = undefined;\n }\n get computed() { return !this._func; }\n get rawValue() { return this._value; }\n get value() {\n if (this._func) {\n this._value = this._func();\n this._func = undefined;\n }\n return this._value;\n }\n}\nclass Semaphore {\n constructor(init) {\n this.queue = new Array();\n this.maxCount = 1;\n this.runningCount = 0;\n objectInit(this, init);\n }\n enter() {\n if (this.runningCount === this.maxCount) {\n var resolve;\n var prom = new Promise((res) => { resolve = res; });\n this.queue.push(resolve);\n return prom;\n }\n else {\n this.runningCount++;\n return Promise.resolve();\n }\n }\n exit() {\n if (this.runningCount === this.maxCount && this.queue.length) {\n if (window.queueMicrotask) {\n window.queueMicrotask(this.queue.shift());\n }\n else {\n setTimeout(this.queue.shift(), 0);\n }\n }\n else {\n this.runningCount--;\n }\n }\n run(func) {\n return __awaiter$2(this, void 0, void 0, function* () {\n yield this.enter();\n try {\n yield func();\n }\n finally {\n this.exit();\n }\n });\n }\n}\n/** Just like CancellationToken[Source] on .NET */\nclass CancelToken {\n constructor() {\n this.cancelled = false;\n this.onCancelled = new Callbacks();\n }\n cancel() {\n if (this.cancelled)\n return;\n this.cancelled = true;\n this.onCancelled.invoke();\n }\n throwIfCancelled() {\n if (this.cancelled)\n throw new Error(\"operation cancelled.\");\n }\n}\nclass AutoResetEvent {\n constructor() {\n this._whenNotify = null;\n this._callback = null;\n }\n wait() {\n if (!this._whenNotify) {\n this._whenNotify = new Promise(r => {\n this._callback = () => {\n this._callback = this._whenNotify = null;\n r();\n };\n });\n }\n return this._whenNotify;\n }\n set() {\n this._callback && this._callback();\n }\n}\nclass EventRegistrations {\n constructor() {\n this.list = [];\n }\n add(event, func) {\n this.list.push({ event, func });\n event.add(func);\n return func;\n }\n removeAll() {\n while (this.list.length) {\n var r = this.list.pop();\n r.event.remove(r.func);\n }\n }\n}\n\nclass View {\n constructor(dom) {\n this.parentView = undefined;\n this._position = undefined;\n this._domctx = new BuildDOMCtx();\n this._dom = undefined;\n this._baseView = undefined;\n this._mountState = MountState.Unmounted;\n this._onActive = undefined;\n this._childViews = undefined;\n this._domctx.view = this;\n if (dom)\n this.domExprCreated(dom);\n }\n static getView(obj) { return obj instanceof View ? obj : new View(obj); }\n get position() { return this._position; }\n get dom() {\n this.ensureDom();\n return this._dom;\n }\n get domCreated() { return !!this._dom; }\n get baseView() { return this._baseView; }\n get mountState() { return this._mountState; }\n get hidden() { return this.dom.hidden; }\n set hidden(val) { this.dom.hidden = val; }\n ensureDom() {\n if (!this._dom) {\n var r = this.createDom();\n this.domExprCreated(r);\n }\n }\n domExprCreated(r) {\n var view = buildView(r, this._domctx);\n if (view instanceof View) {\n this._baseView = view;\n this._dom = view.dom;\n }\n else {\n this._dom = view;\n }\n this.postCreateDom();\n this.updateDom();\n }\n createDom() {\n return document.createElement('div');\n }\n /** Will be called when the dom is created */\n postCreateDom() {\n if (View.debugging) {\n if (this.dom.dataset)\n this.dom.dataset['webfx'] = MountState[this._mountState];\n }\n }\n /** Will be called when the dom is created, after postCreateDom() */\n updateDom() {\n this._domctx.update();\n }\n /** Will be called when the mounting state is changed */\n mountStateChanged(state) {\n if (state == this._mountState) {\n console.trace(\"mountState unchanged\", state, this);\n return;\n }\n this._mountState = state;\n if (View.debugging) {\n if (!this._baseView && this.domCreated && this.dom.dataset) {\n if (this.dom.dataset['webfx'] == MountState[state]) {\n console.trace('mountState on the DOM is changed by other view', state, this);\n }\n this.dom.dataset['webfx'] = MountState[state];\n }\n }\n if (this._baseView) {\n // let the baseView do the rest\n this._baseView.mountStateChanged(state);\n return;\n }\n if (this._childViews)\n for (const child of this._childViews) {\n child.mountStateChanged(state);\n }\n }\n getDomById(id) {\n var _a, _b;\n this.ensureDom();\n return (_b = (_a = this._domctx.dict) === null || _a === void 0 ? void 0 : _a[id]) !== null && _b !== void 0 ? _b : null;\n }\n /** Assign key-values and call `updateDom()` */\n updateWith(kv) {\n objectApply(this, kv);\n this.updateDom();\n }\n updateAllWith(kv) {\n objectApply(this, kv);\n this.updateAll();\n }\n toggleClass(clsName, force) {\n toggleClass(this.dom, clsName, force);\n }\n // Implements `IDOMInstance`\n // appendView(view: View) { this.dom.appendChild(view.dom); }\n getDOM() { return this.dom; }\n addChild(child) {\n const view = buildView(child, this._domctx);\n if (view instanceof View) {\n this.appendView(view);\n }\n else {\n this.dom.appendChild(view);\n }\n }\n get onActive() {\n if (!this._onActive) {\n this._onActive = new Callbacks();\n this.dom.addEventListener('click', (e) => {\n this._onActive.invoke(e);\n });\n this.dom.addEventListener('keydown', (e) => {\n this.handleKeyDown(e);\n });\n }\n return this._onActive;\n }\n handleKeyDown(e) {\n var _a;\n if (e.code === 'Enter') {\n const rect = this.dom.getBoundingClientRect();\n (_a = this._onActive) === null || _a === void 0 ? void 0 : _a.invoke(new MouseEvent('click', {\n clientX: rect.x, clientY: rect.y,\n relatedTarget: this.dom\n }));\n e.preventDefault();\n }\n }\n get childViews() {\n // Return the childViews of the baseView if exists\n if (this._baseView) {\n return this._baseView.childViews;\n }\n // Lazy creating childViews array\n if (!this._childViews)\n this._childViews = [];\n return this._childViews;\n }\n appendView(view) {\n this.addView(view);\n }\n addView(view, pos) {\n this._registerChild(view, pos, false);\n if (this._mountState == MountState.Mounted)\n view.mountStateChanged(MountState.Mounting);\n this._insertToDom(view, pos);\n if (this._mountState != MountState.Unmounted)\n view.mountStateChanged(this._mountState);\n }\n _registerChild(view, pos, changeMountState = true) {\n const items = this.childViews;\n if (view.parentView)\n throw new Error('the view is already in a container view');\n view.parentView = this;\n if (pos === undefined) {\n view._position = items.length;\n items.push(view);\n }\n else {\n items.splice(pos, 0, view);\n for (let i = pos; i < items.length; i++) {\n items[i]._position = i;\n }\n }\n if (changeMountState && this._mountState != MountState.Unmounted) {\n view.mountStateChanged(this._mountState);\n }\n }\n removeView(view) {\n view = this._ensureItem(view);\n this._removeFromDom(view);\n var pos = view._position;\n view.parentView = view._position = undefined;\n this.childViews.splice(pos, 1);\n for (let i = pos; i < this.childViews.length; i++) {\n this.childViews[i]._position = i;\n }\n if (this._mountState != MountState.Unmounted) {\n view.mountStateChanged(MountState.Unmounted);\n }\n }\n removeAllView() {\n while (this.childViews.length)\n this.removeView(this.childViews.length - 1);\n }\n removeFromParent() {\n if (this.parentView)\n this.parentView.removeView(this);\n }\n /** updateDom() then updateChildren() */\n updateAll() {\n this.updateDom();\n if (this.baseView)\n return this.baseView.updateAll();\n this.updateChildren();\n }\n /** Call updateDom() on the whole tree */\n updateChildren() {\n if (this._childViews)\n for (const child of this._childViews) {\n child.updateAll();\n }\n }\n _insertToDom(item, pos) {\n var _a;\n if (pos == undefined)\n this.dom.appendChild(item.dom);\n else\n this.dom.insertBefore(item.dom, ((_a = this.childViews[pos + 1]) === null || _a === void 0 ? void 0 : _a.dom) || null);\n }\n _removeFromDom(item) {\n if (item.domCreated)\n item.dom.remove();\n }\n _ensureItem(item) {\n if (typeof item === 'number')\n item = this.childViews[item];\n else if (!item)\n throw new Error('item is null or undefined.');\n else if (item.parentView !== this)\n throw new Error('the item is not in this listview.');\n return item;\n }\n}\nView.debugging = false;\nfunction tryGetDOM(idom) {\n if (!idom)\n return idom;\n if (idom instanceof View) {\n return idom.getDOM();\n }\n else if (idom instanceof Node) {\n return idom;\n }\n else if (idom && \"getDOM\" in idom) {\n return idom.getDOM();\n }\n}\nfunction getDOM(idom) {\n var dom = tryGetDOM(idom);\n if (!dom) {\n console.error(\"getDOM():\", idom);\n throw new Error(\"getDOM(): unsupported parameter: \" + idom);\n }\n return dom;\n}\nfunction appendView(parent, childView) {\n warnMountingView(parent, childView);\n getDOM(parent).appendChild(childView.dom);\n}\nfunction addChild(parent, child) {\n // fast path\n if (parent instanceof View)\n parent.addChild(child);\n else if (parent instanceof Node) {\n warnMountingView(parent, child);\n parent.appendChild(buildDOM(child));\n }\n // slow path\n else if ('addChild' in parent) {\n parent.addChild(child);\n }\n else {\n console.error(\"addChild():\", { parent, child });\n throw new Error(\"addChild(): unsupported parent\");\n }\n}\nfunction warnMountingView(parent, child) {\n if (child instanceof View) {\n const data = { parent, child };\n if (parent instanceof Node)\n console.trace(\"Should use `mountView()` to mount a view to DOM.\", data);\n else\n console.trace(\"Should use `View.addChild()` or `View.appendView()` to add a view into another view.\", data);\n }\n}\nfunction mountView(parent, view) {\n view.mountStateChanged(MountState.Mounting);\n parent.appendChild(view.dom);\n view.mountStateChanged(MountState.Mounted);\n}\nfunction unmountView(parent, view) {\n view.dom.remove();\n view.mountStateChanged(MountState.Unmounted);\n}\nNode.prototype.getDOM = function () {\n console.trace(\"webfx: Node.getDOM() is deprecated. Please use the exported function `getDOM()` instead.\");\n return this;\n};\nNode.prototype.addChild = function (child) {\n console.trace(\"webfx: Node.addChild() is deprecated. Please use the exported function `addChild()` instead.\");\n addChild(this, child);\n};\nNode.prototype.appendView = function (view) {\n console.trace(\"webfx: Node.appendView() is deprecated. Please use the exported function `appendView()` instead.\");\n appendView(this, view);\n};\nclass ContainerView extends View {\n addView(view, pos) {\n return super.addView(view, pos);\n }\n removeView(view) {\n super.removeView(view);\n }\n _insertToDom(item, pos) {\n super._insertToDom(item, pos);\n }\n _removeFromDom(item) {\n super._removeFromDom(item);\n }\n _ensureItem(item) {\n return super._ensureItem(item);\n }\n get items() { return this.childViews; }\n [Symbol.iterator]() { return this.childViews[Symbol.iterator](); }\n get length() { return this.childViews.length; }\n get(idx) {\n return this.childViews[idx];\n }\n map(func) { return arrayMap(this, func); }\n find(func) { return arrayFind(this, func); }\n forEach(func) { return arrayForeach(this, func); }\n}\n\nvar MountState;\n(function (MountState) {\n /** The view is unmounted. */\n MountState[MountState[\"Unmounted\"] = 0] = \"Unmounted\";\n /** The view will be mounted soon. */\n MountState[MountState[\"Mounting\"] = 1] = \"Mounting\";\n /** The view is mounted (i.e. the DOM is in the document). */\n MountState[MountState[\"Mounted\"] = 2] = \"Mounted\";\n})(MountState || (MountState = {}));\nclass BuildDOMCtx {\n constructor() {\n this.dict = undefined;\n this.actions = undefined;\n this.view = undefined;\n }\n setDict(key, node) {\n if (!this.dict)\n this.dict = {};\n this.dict[key] = node;\n }\n addUpdateAction(action) {\n if (!this.actions)\n this.actions = [];\n this.actions.push(action);\n }\n update() {\n if (!this.actions)\n return;\n for (const a of this.actions) {\n a.run();\n }\n }\n}\nclass TextAction {\n constructor(node, func) {\n this.node = node;\n this.func = func;\n }\n run() {\n this.node.textContent = this.func();\n }\n}\nclass HiddenAction {\n constructor(node, func) {\n this.node = node;\n this.func = func;\n }\n run() {\n this.node.hidden = this.func();\n }\n}\nclass UpdateAction {\n constructor(node, func) {\n this.node = node;\n this.func = func;\n }\n run() {\n this.func(this.node);\n }\n}\nvar createElementFromTag = function (tag) {\n var reg = /[#\\.^]?[\\w\\-]+/y;\n var match;\n var ele;\n while (match = reg.exec(tag)) {\n var val = match[0];\n var ch = val[0];\n if (ch === '.') {\n ele.classList.add(val.substr(1));\n }\n else if (ch === '#') {\n ele.id = val.substr(1);\n }\n else {\n if (ele)\n throw new Error('unexpected multiple tags');\n ele = document.createElement(val);\n }\n }\n return ele;\n};\nfunction tryHandleValues(obj, ctx) {\n if (typeof (obj) === 'string') {\n return document.createTextNode(obj);\n }\n if (typeof obj === 'function') {\n const val = obj();\n if (!val || typeof val !== 'object') {\n const node = document.createTextNode(val);\n ctx === null || ctx === void 0 ? void 0 : ctx.addUpdateAction(new TextAction(node, obj));\n return node;\n }\n else {\n throw new Error('Unexpected function return value');\n }\n }\n if (Node && obj instanceof Node)\n return obj;\n return null;\n}\nvar buildDomCore = function (obj, ttl, ctx) {\n var _a;\n if (ttl-- < 0)\n throw new Error('ran out of TTL');\n var r = tryHandleValues(obj, ctx);\n if (r)\n return r;\n if (obj instanceof JsxNode) {\n obj = obj.buildView(ctx, ttl);\n if (!(obj instanceof View))\n return obj;\n }\n if (obj instanceof View) {\n (_a = ctx === null || ctx === void 0 ? void 0 : ctx.view) === null || _a === void 0 ? void 0 : _a._registerChild(obj);\n return obj.getDOM();\n }\n // if ('getDOM' in (obj as any)) return (obj as any).getDOM();\n const tag = obj.tag;\n if (!tag)\n throw new Error('no tag');\n var node = createElementFromTag(tag);\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n var val = obj[key];\n buildDOMHandleKey(key, val, node, ctx, ttl);\n }\n }\n const init = obj['init'];\n if (init)\n init(node);\n return node;\n};\nvar buildDOMHandleKey = function (key, val, node, ctx, ttl) {\n if (key === 'child') {\n if (val instanceof Array) {\n foreachFlaten(val, function (val) {\n node.appendChild(buildDomCore(val, ttl, ctx));\n });\n }\n else {\n node.appendChild(buildDomCore(val, ttl, ctx));\n }\n }\n else if (key === '_id' || key === '_key') {\n ctx.setDict(val, node);\n }\n else if (key === 'ref') {\n val.value = node;\n }\n else if (key === 'text') {\n if (typeof val === 'function') {\n ctx.addUpdateAction(new TextAction(node, val));\n }\n else {\n node.textContent = val;\n }\n }\n else if (key === 'class') {\n node.className = val;\n }\n else if (key === 'style' && typeof val === 'object') {\n for (const styleKey in val) {\n if (Object.prototype.hasOwnProperty.call(val, styleKey)) {\n const styleVal = val[styleKey];\n node.style[styleKey] = styleVal;\n }\n }\n }\n else if (key === 'hidden' && typeof val === 'function') {\n ctx.addUpdateAction(new HiddenAction(node, val));\n }\n else if (key === 'update' && typeof val === 'function') {\n ctx.addUpdateAction(new UpdateAction(node, val));\n }\n else if (key === 'init') ;\n else {\n node[key] = val;\n }\n};\n/**\n * Build a DOM tree from a JavaScript object.\n * @example\n * buildDOM({\n * tag: 'div.item#firstitem',\n * onclick: () => console.info('clicked'),\n * child: [\n * 'Name: ',\n * { tag: 'span.name', text: name },\n * ],\n * });\n */\nfunction buildDOM(obj, ctx) {\n return buildDomCore(obj, 32, ctx || null);\n}\n/** Get a View instance or a DOM Node. View is preferred. */\nfunction buildView(obj, ctx) {\n if (obj instanceof View) {\n return obj;\n }\n else if (obj instanceof JsxNode) {\n return obj.buildView(ctx, 64);\n }\n else {\n return buildDOM(obj, ctx);\n }\n}\nclass JsxNode {\n constructor(tag, attrs, childs) {\n this.tag = tag;\n this.attrs = attrs;\n this.child = childs;\n }\n getDOM() {\n return this.buildDom(null, 64);\n }\n buildDom(ctx, ttl) {\n return getDOM(this.buildView(ctx, ttl));\n }\n buildView(ctx, ttl) {\n if (ttl-- < 0)\n throw new Error('ran out of TTL');\n let view;\n if (typeof this.tag === 'string') {\n // tag is an HTML tag\n const dom = document.createElement(this.tag);\n view = dom;\n if (this.attrs) {\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n buildDOMHandleKey(key, val, dom, ctx, ttl);\n }\n }\n const init = this.attrs['init'];\n if (init)\n init(dom);\n }\n }\n else {\n // tag is a View\n view = this.tag;\n if (this.attrs) {\n let init = null;\n for (const key in this.attrs) {\n if (Object.prototype.hasOwnProperty.call(this.attrs, key)) {\n const val = this.attrs[key];\n if (key == \"init\") {\n init = val;\n }\n else if (key == \"ref\") {\n val.value = view;\n }\n else if (key.startsWith(\"on\") && view[key] instanceof Callbacks) {\n view[key].add(val);\n }\n else {\n view[key] = val;\n }\n }\n }\n if (init)\n init(view);\n }\n }\n if (this.child) {\n if (view instanceof View) {\n foreachFlaten(this.child, it => {\n view.addChild(jsxBuildCore(it, ttl, view['_domctx']));\n });\n }\n else {\n foreachFlaten(this.child, it => {\n var _a;\n const c = jsxBuildCore(it, ttl, ctx);\n if (c instanceof View) {\n view.appendChild(c.dom);\n (_a = ctx === null || ctx === void 0 ? void 0 : ctx.view) === null || _a === void 0 ? void 0 : _a._registerChild(c);\n }\n else {\n addChild(view, c);\n }\n });\n }\n }\n return view;\n }\n addChild(child) {\n if (this.child == null)\n this.child = [];\n this.child.push(child);\n }\n}\nfunction jsxBuildCore(node, ttl, ctx) {\n if (ttl-- < 0)\n throw new Error('ran out of TTL');\n if (node instanceof View)\n return node;\n var r = tryHandleValues(node, ctx);\n if (r)\n return r;\n if (node instanceof JsxNode) {\n return node.buildView(ctx, ttl);\n }\n else {\n console.error(\"Unknown node type\", node);\n throw new Error(\"Unknown node type\");\n }\n}\nfunction jsxBuild(node, ctx) {\n return jsxBuildCore(node, 64, ctx || new BuildDOMCtx());\n}\nfunction jsxFactory(tag, attrs, ...childs) {\n if (typeof tag === 'string') {\n return new JsxNode(tag, attrs, childs);\n }\n else {\n const view = (attrs === null || attrs === void 0 ? void 0 : attrs.args) ?\n new tag(...attrs.args) :\n new tag();\n return new JsxNode(view, attrs, childs);\n }\n}\nconst jsx = jsxFactory;\n\nfunction clearChildren(node) {\n while (node.lastChild)\n node.removeChild(node.lastChild);\n}\n/** Remove all children from the node (if needed) and append one (if present) */\nfunction replaceChild(node, newChild) {\n clearChildren(node);\n if (newChild)\n node.appendChild(newChild);\n}\n/** Add or remove a classname for the element\n * @param force - true -> add; false -> remove; undefined -> toggle.\n */\nfunction toggleClass(element, clsName, force) {\n var clsList = element.classList;\n if (clsList.toggle)\n return clsList.toggle(clsName, force);\n if (force === undefined)\n force = !clsList.contains(clsName);\n if (force)\n clsList.add(clsName);\n else\n clsList.remove(clsName);\n return force;\n}\n/** Fade out the element and remove it */\nfunction fadeout(element, options) {\n const { className = 'fading-out', duration = 500, remove = true } = options || {};\n element.classList.add(className);\n var cb = null;\n var end = (finish = true) => {\n if (!end)\n return; // use a random variable as flag ;)\n end = null;\n element.removeEventListener('transitionend', onTransitionend);\n element.classList.remove(className);\n if (remove && finish) {\n element.remove();\n }\n finish && (cb === null || cb === void 0 ? void 0 : cb());\n };\n var onTransitionend = function (e) {\n if (e.eventPhase === Event.AT_TARGET)\n end === null || end === void 0 ? void 0 : end();\n };\n element.addEventListener('transitionend', onTransitionend);\n setTimeout(end, duration); // failsafe\n return {\n get finished() { return !end; },\n onFinished(callback) {\n if (!end)\n callback();\n else\n cb = callback;\n return this;\n },\n cancel(finish = false) {\n end === null || end === void 0 ? void 0 : end(finish);\n }\n };\n}\nfunction startBlockingDetect(threshold = 20) {\n var begin = Date.now();\n var lastRun = Date.now();\n setInterval(() => {\n var now = Date.now();\n if (now - lastRun >= threshold) {\n console.info(`[Blocking] ${(now - begin) / 1000}s: blocked for ${now - lastRun} ms`);\n }\n lastRun = now;\n }, 1);\n}\nclass Timer {\n constructor(callback) {\n this.callback = callback;\n this.cancelFunc = undefined;\n }\n timeout(time) {\n this.tryCancel();\n var handle = setTimeout(this.callback, time);\n this.cancelFunc = () => window.clearTimeout(handle);\n }\n interval(time) {\n this.tryCancel();\n var handle = setInterval(this.callback, time);\n this.cancelFunc = () => window.clearInterval(handle);\n }\n animationFrame() {\n this.tryCancel();\n var handle = requestAnimationFrame(this.callback);\n this.cancelFunc = () => cancelAnimationFrame(handle);\n }\n tryCancel() {\n if (this.cancelFunc) {\n this.cancelFunc();\n this.cancelFunc = undefined;\n }\n }\n}\nfunction listenPointerEvents(element, callback, options) {\n var touchDown = false;\n var mouseDown = function (e) {\n if (callback({ type: 'mouse', ev: e, point: e, action: 'down' }) === 'track') {\n var mousemove = function (e) {\n callback({ type: 'mouse', ev: e, point: e, action: 'move' });\n };\n var mouseup = function (e) {\n document.removeEventListener('mousemove', mousemove, true);\n document.removeEventListener('mouseup', mouseup, true);\n callback({ type: 'mouse', ev: e, point: e, action: 'up' });\n };\n document.addEventListener('mousemove', mousemove, true);\n document.addEventListener('mouseup', mouseup, true);\n }\n };\n var touchStart = function (e) {\n var ct = e.changedTouches[0];\n var ret = callback({\n type: 'touch', touch: 'start', ev: e, point: ct,\n action: touchDown ? 'move' : 'down'\n });\n if (!touchDown && ret === 'track') {\n touchDown = true;\n var touchmove = function (e) {\n var ct = e.changedTouches[0];\n callback({ type: 'touch', touch: 'move', ev: e, point: ct, action: 'move' });\n };\n var touchend = function (e) {\n if (e.touches.length === 0) {\n touchDown = false;\n element.removeEventListener('touchmove', touchmove);\n element.removeEventListener('touchend', touchend);\n element.removeEventListener('touchcancel', touchend);\n }\n var ct = e.changedTouches[0];\n callback({\n type: 'touch', touch: 'end', ev: e, point: ct,\n action: touchDown ? 'move' : 'up'\n });\n };\n element.addEventListener('touchmove', touchmove, options);\n element.addEventListener('touchend', touchend, options);\n element.addEventListener('touchcancel', touchend, options);\n }\n };\n element.addEventListener('mousedown', mouseDown, options);\n element.addEventListener('touchstart', touchStart, options);\n return {\n remove: () => {\n element.removeEventListener('mousedown', mouseDown, options);\n element.removeEventListener('touchstart', touchStart, options);\n }\n };\n}\nfunction listenEvent(element, event, handler) {\n element.addEventListener(event, handler);\n return {\n remove: () => element.removeEventListener(event, handler)\n };\n}\nfunction listenEvents(element, events, handler) {\n events.forEach(event => element.addEventListener(event, handler));\n return {\n remove: () => events.forEach(event => element.removeEventListener(event, handler))\n };\n}\nfunction injectCss(css, options) {\n var _a, _b;\n const parent = (_a = options === null || options === void 0 ? void 0 : options.parent) !== null && _a !== void 0 ? _a : document.head;\n parent.appendChild(buildDOM({ tag: (_b = options === null || options === void 0 ? void 0 : options.tag) !== null && _b !== void 0 ? _b : 'style', text: css }));\n}\nclass TextCompositionWatcher {\n get isCompositing() { return this._isCompositing; }\n set isCompositing(val) {\n this._isCompositing = val;\n this.onCompositingChanged.invoke();\n }\n constructor(dom) {\n this.onCompositingChanged = new Callbacks();\n this._isCompositing = false;\n this.dom = getDOM(dom);\n this.dom.addEventListener('compositionstart', (ev) => {\n this.isCompositing = true;\n });\n this.dom.addEventListener('compositionend', (ev) => {\n this.isCompositing = false;\n });\n }\n}\nclass InputStateTracker {\n constructor(dom) {\n this.dom = dom;\n this.state = {\n mouseDown: false,\n mouseIn: false,\n focusIn: false,\n };\n this._removeEvents = null;\n this._removePointerEvents = null;\n this.onChanged = new Callbacks();\n this._removeEvents = listenEvents(dom, ['mouseenter', 'mouseleave', 'focusin', 'focusout'], (e) => {\n switch (e.type) {\n case 'mouseenter':\n this.stateChanged('mouseIn', true);\n break;\n case 'mouseleave':\n this.stateChanged('mouseIn', false);\n break;\n case 'focusin':\n this.stateChanged('focusIn', true);\n break;\n case 'focusout':\n this.stateChanged('focusIn', false);\n break;\n }\n }).remove;\n this._removePointerEvents = listenPointerEvents(dom, (e) => {\n if (e.action == 'down') {\n this.stateChanged('mouseDown', true);\n return 'track';\n }\n else if (e.action == 'up') {\n this.stateChanged('mouseDown', false);\n }\n }).remove;\n }\n stateChanged(state, val) {\n this.state[state] = val;\n this.onChanged.invoke(state);\n }\n removeListeners() {\n var _a, _b;\n (_a = this._removeEvents) === null || _a === void 0 ? void 0 : _a.call(this);\n (_b = this._removePointerEvents) === null || _b === void 0 ? void 0 : _b.call(this);\n this._removePointerEvents = this._removeEvents = null;\n }\n}\nclass DataUpdatingHelper {\n update(newData) {\n const oldData = this.items;\n var dataDict = {};\n for (const n of newData) {\n dataDict[this.dataSelectId(n)] = n;\n }\n var itemDict = {};\n var removed = [];\n for (const d of oldData) {\n const id = this.selectId(d);\n if (dataDict[id] !== undefined) {\n itemDict[id] = d;\n }\n else {\n removed.push(d);\n }\n }\n for (let i = removed.length - 1; i >= 0; i--)\n this.removeItem(removed[i]);\n var pos = 0;\n for (const n of newData) {\n const d = itemDict[this.dataSelectId(n)];\n if (d !== undefined) {\n this.updateItem(d, n);\n }\n else {\n this.addItem(n, pos);\n }\n pos++;\n }\n }\n updateOrRebuildAll(newData) {\n this.update(newData);\n if (!this.isSame(newData))\n this.rebuildAll(newData);\n }\n isSame(newData) {\n var t = this.items[Symbol.iterator]();\n for (const n of newData) {\n var d = t.next();\n if (d.done)\n return false;\n if (this.selectId(d.value) !== this.dataSelectId(n))\n return false;\n }\n if (!t.next().done)\n return false;\n return true;\n }\n rebuildAll(newData) {\n var oldData = this.items;\n if (oldData instanceof Array) {\n for (let i = oldData.length - 1; i >= 0; i--) {\n this.removeItem(oldData[i]);\n }\n }\n else {\n for (const o of oldData) {\n this.removeItem(o);\n }\n }\n let i = 0;\n for (const n of newData) {\n this.addItem(n, i++);\n }\n }\n selectId(obj) { return obj.id; }\n dataSelectId(obj) { return obj.id; }\n addItem(obj, pos) { }\n updateItem(old, data) { }\n removeItem(obj) { }\n}\n\n// file: I18n.ts\n/** Internationalization (aka i18n) helper class */\nclass I18n {\n constructor() {\n this.data = {};\n this.curLang = 'en';\n this.missing = new Map();\n }\n /** Get i18n string for `key`, return `key` when not found. */\n get(key, arg) {\n return this.get2(key, arg) || key;\n }\n /** Get i18n string for `key`, return `null` when not found. */\n get2(key, arg, lang) {\n lang = lang || this.curLang;\n var langObj = this.data[lang];\n if (!langObj) {\n console.log('i18n missing lang: ' + lang);\n return null;\n }\n var r = langObj[key];\n if (!r) {\n if (!this.missing.has(key)) {\n this.missing.set(key, 1);\n console.log('i18n missing key: ' + key);\n }\n return null;\n }\n if (arg) {\n for (const key in arg) {\n if (arg.hasOwnProperty(key)) {\n const val = arg[key];\n r = r.replace('{' + key + '}', val);\n // Note that it only replaces the first occurrence.\n }\n }\n }\n return r;\n }\n /** Fills data with an 2darray */\n add2dArray(array) {\n const langObjs = [];\n const langs = array[0];\n for (const lang of langs) {\n langObjs.push(this.data[lang] = this.data[lang] || {});\n }\n for (let i = 1; i < array.length; i++) {\n const line = array[i];\n const key = line[0];\n for (let j = 0; j < line.length; j++) {\n const val = line[j];\n langObjs[j][key] = val;\n }\n }\n }\n renderElements(elements) {\n console.log('i18n elements rendering');\n elements.forEach(x => {\n for (const node of x.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n // console.log('node', node);\n var r = this.get2(node.beforeI18n || node.textContent);\n if (r) {\n node.beforeI18n = node.beforeI18n || node.textContent;\n node.textContent = r;\n }\n else {\n if (node.beforeI18n) {\n node.textContent = node.beforeI18n;\n }\n console.log('missing key for node', node);\n }\n }\n }\n });\n }\n /**\n * Detect the best available language using\n * the user language preferences provided by the browser.\n * @param langs Available languages\n */\n static detectLanguage(langs) {\n var cur = null;\n var curIdx = -1;\n var languages = [];\n // ['en-US'] -> ['en-US', 'en']\n (navigator.languages || [navigator.language]).forEach(lang => {\n languages.push(lang);\n if (lang.indexOf('-') > 0)\n languages.push(lang.substr(0, lang.indexOf('-')));\n });\n langs.forEach((l) => {\n var idx = languages.indexOf(l);\n if (!cur || (idx !== -1 && idx < curIdx)) {\n cur = l;\n curIdx = idx;\n }\n });\n return cur || langs[0];\n }\n}\nfunction createStringBuilder(i18n) {\n var arrBuilder = createArrayBuilder(i18n);\n return function (literals, ...placeholders) {\n if (placeholders.length === 0) {\n return i18n.get(literals[0]);\n }\n return arrBuilder(literals, ...placeholders).join('');\n };\n}\nfunction createArrayBuilder(i18n) {\n var formatCache = new WeakMap();\n var parseCache = new Map();\n return function (literals, ...placeholders) {\n if (placeholders.length === 0) {\n return [i18n.get(literals[0])];\n }\n // Generate format string from template string if it's not cached:\n let format = formatCache.get(literals);\n if (format === undefined) {\n format = '';\n for (let i = 0; i < literals.length; i++) {\n const lit = literals[i];\n format += lit;\n if (i < placeholders.length) {\n format += '{' + i + '}';\n }\n }\n formatCache.set(literals, format);\n }\n const translatedFormat = i18n.get(format);\n // Also cache parsed template\n let parsed = parseCache.get(translatedFormat);\n if (parsed === undefined) {\n parsed = parseTemplate(translatedFormat);\n }\n return parsed.map(x => typeof x == 'number' ? placeholders[x] : x);\n };\n}\nfunction parseTemplate(template) {\n const result = [];\n let state = 0; // 0: normal / 1: after '{' / 2: after '}' / 3: after '{' and numbers\n let buf = '';\n for (let i = 0; i < template.length; i++) {\n const ch = template[i];\n switch (ch) {\n case '{':\n if (state == 0)\n state = 1;\n else if (state == 1) {\n state = 0;\n buf += '{';\n }\n else\n throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n case '}':\n if (state == 3) {\n state = 0;\n result.push(+buf);\n buf = '';\n }\n else if (state == 0) {\n state = 2;\n }\n else if (state == 2) {\n state = 0;\n buf += '}';\n }\n else\n throw new Error(`Expected number, got '${ch}' at ${i}`);\n break;\n default:\n if (state == 2)\n throw new Error(`Expected '}', got '${ch}' at ${i}`);\n else if (state == 1) {\n state = 3;\n if (buf)\n result.push(buf);\n buf = '';\n }\n buf += ch;\n }\n }\n if (state != 0)\n throw new Error(\"Unexpected end of template string\");\n if (buf)\n result.push(buf);\n return result;\n}\nvar i18n = new I18n();\nconst I = createStringBuilder(i18n);\n\nconst version = \"1.10.4\";\n\nvar css = \":root {\\n --color-bg: white;\\n --color-text: black;\\n --color-text-gray: #666;\\n --color-bg-selection: hsl(5, 100%, 85%);\\n --color-primary: hsl(5, 100%, 67%);\\n --color-primary-darker: hsl(5, 100%, 60%);\\n --color-primary-dark: hsl(5, 100%, 40%);\\n --color-primary-dark-depends: hsl(5, 100%, 40%);\\n --color-primary-verydark: hsl(5, 100%, 20%);\\n --color-primary-light: hsl(5, 100%, 83%);\\n --color-primary-lighter: hsl(5, 100%, 70%);\\n --color-fg-11: #111111;\\n --color-fg-22: #222222;\\n --color-fg-33: #333333;\\n --color-bg-cc: #cccccc;\\n --color-bg-dd: #dddddd;\\n --color-bg-ee: #eeeeee;\\n --color-bg-f8: #f8f8f8;\\n --color-shadow: rgba(0, 0, 0, .5);\\n}\\n\\n.no-selection {\\n user-select: none;\\n -ms-user-select: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n}\\n\\n/* listview item */\\n\\n.item {\\n display: block;\\n position: relative;\\n padding: 10px;\\n /* background: #ddd; */\\n /* animation: showing .3s forwards; */\\n text-decoration: none;\\n line-height: 1.2;\\n}\\n\\na.item {\\n color: inherit;\\n}\\n\\n.clickable, .item {\\n cursor: pointer;\\n transition: transform .3s;\\n -webkit-tap-highlight-color: transparent;\\n}\\n\\n.item:hover, .dragover {\\n background: var(--color-bg-ee);\\n}\\n\\n.keyboard-input .item:focus {\\n outline-offset: -2px;\\n}\\n\\n.dragover-placeholder {\\n /* border-top: 2px solid gray; */\\n position: relative;\\n}\\n\\n.dragover-placeholder::before {\\n content: \\\"\\\";\\n display: block;\\n position: absolute;\\n transform: translate(0, -1px);\\n height: 2px;\\n width: 100%;\\n background: gray;\\n z-index: 100;\\n pointer-events: none;\\n}\\n\\n.clickable:active, .item:active {\\n transition: transform .07s;\\n transform: scale(.97);\\n}\\n\\n.item:active {\\n background: var(--color-bg-dd);\\n}\\n\\n.item.no-transform:active {\\n transform: none;\\n}\\n\\n.item.active {\\n background: var(--color-bg-dd);\\n}\\n\\n.loading-indicator {\\n position: relative;\\n margin: .3em;\\n margin-top: 3em;\\n margin-bottom: 1em;\\n text-align: center;\\n white-space: pre-wrap;\\n cursor: default;\\n animation: loading-fadein .3s;\\n}\\n\\n.loading-indicator-text {\\n margin: 0 auto;\\n}\\n\\n.loading-indicator.running .loading-indicator-inner {\\n display: inline-block;\\n position: relative;\\n vertical-align: bottom;\\n}\\n\\n.loading-indicator.running .loading-indicator-inner::after {\\n content: \\\"\\\";\\n height: 1px;\\n margin: 0%;\\n background: var(--color-text);\\n display: block;\\n animation: fadein .5s 1s backwards;\\n}\\n\\n.loading-indicator.running .loading-indicator-text {\\n margin: 0 .5em;\\n animation: fadein .3s, loading-first .3s .5s cubic-bezier(0.55, 0.055, 0.675, 0.19) reverse, loading-second .3s .8s cubic-bezier(0.55, 0.055, 0.675, 0.19), loading .25s 1.1s cubic-bezier(0.55, 0.055, 0.675, 0.19) alternate-reverse infinite;\\n}\\n\\n.loading-indicator.error {\\n color: red;\\n}\\n\\n.loading-indicator.fading-out {\\n transition: max-height;\\n animation: loading-fadein .3s reverse;\\n}\\n\\n@keyframes loading-fadein {\\n 0% {\\n opacity: 0;\\n max-height: 0;\\n }\\n 100% {\\n opacity: 1;\\n max-height: 200px;\\n }\\n}\\n\\n@keyframes fadein {\\n 0% {\\n opacity: 0;\\n }\\n 100% {\\n opacity: 1;\\n }\\n}\\n\\n@keyframes loading-first {\\n 0% {\\n transform: translate(0, -2em) scale(1) rotate(360deg);\\n }\\n 100% {\\n transform: translate(0, 0) scale(1) rotate(0deg);\\n }\\n}\\n\\n@keyframes loading-second {\\n 0% {\\n transform: translate(0, -2em);\\n }\\n 100% {\\n transform: translate(0, 0);\\n }\\n}\\n\\n@keyframes loading {\\n 0% {\\n transform: translate(0, -1em);\\n }\\n 100% {\\n transform: translate(0, 0);\\n }\\n}\\n\\n@keyframes showing {\\n 0% {\\n opacity: .3;\\n transform: translate(-20px, 0)\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0)\\n }\\n}\\n\\n@keyframes showing-top {\\n 0% {\\n opacity: .3;\\n transform: translate(0, -20px)\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0)\\n }\\n}\\n\\n@keyframes showing-right {\\n 0% {\\n opacity: .3;\\n transform: translate(20px, 0)\\n }\\n 100% {\\n opacity: 1;\\n transform: translate(0, 0)\\n }\\n}\\n\\n.overlay {\\n background: rgba(0, 0, 0, .2);\\n position: absolute;\\n top: 0;\\n left: 0;\\n right: 0;\\n bottom: 0;\\n animation: fadein .3s;\\n z-index: 10001;\\n overflow: hidden;\\n contain: strict;\\n will-change: transform;\\n}\\n\\n.overlay.fixed {\\n position: fixed;\\n}\\n\\n.overlay.nobg {\\n background: none;\\n will-change: auto;\\n}\\n\\n.overlay.centerChild {\\n display: flex;\\n align-items: center;\\n justify-content: center;\\n}\\n\\n.overlay.clickThrough {\\n pointer-events: none;\\n}\\n\\n.dialog * {\\n box-sizing: border-box;\\n}\\n\\n.dialog {\\n font-size: 14px;\\n position: relative;\\n overflow: auto;\\n background: var(--color-bg);\\n border-radius: 5px;\\n box-shadow: 0 0 12px var(--color-shadow);\\n animation: dialogin .3s cubic-bezier(0,0,0,1);\\n z-index: 10001;\\n display: flex;\\n flex-direction: column;\\n max-height: 100%;\\n contain: content;\\n will-change: transform;\\n pointer-events: auto;\\n}\\n\\n.dialog.resize {\\n resize: both;\\n}\\n\\n.fading-out .dialog {\\n transition: transform .3s cubic-bezier(.5,0,1,1);\\n transform: scale(.7);\\n}\\n\\n.dialog-title, .dialog-content, .dialog-bottom {\\n padding: 10px;\\n}\\n\\n.dialog-title {\\n background: var(--color-bg-ee);\\n}\\n\\n.dialog-content {\\n flex: 1;\\n padding: 5px 10px;\\n overflow: auto;\\n}\\n\\n.dialog-content.flex {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.dialog-bottom {\\n padding: 5px 10px;\\n}\\n\\n@keyframes dialogin {\\n 0% {\\n transform: scale(.5);\\n }\\n 100% {\\n transform: scale(1);\\n }\\n}\\n\\n.input-label {\\n font-size: 80%;\\n color: var(--color-text-gray);\\n margin: 5px 0 3px 0;\\n}\\n\\n.input-text {\\n display: block;\\n width: 100%;\\n padding: 5px;\\n border: solid 1px gray;\\n background: var(--color-bg);\\n color: var(--color-text);\\n}\\n\\n.dialog .input-text {\\n margin: 5px 0;\\n}\\n\\ntextarea.input-text {\\n resize: vertical;\\n}\\n\\n.labeled-input {\\n display: flex;\\n flex-direction: column;\\n}\\n\\n.labeled-input .input-text {\\n flex: 1;\\n}\\n\\n.labeled-input:focus-within .input-label {\\n color: var(--color-primary-darker);\\n}\\n\\n.input-text:focus {\\n border-color: var(--color-primary-darker);\\n}\\n\\n.input-text:active {\\n border-color: var(--color-primary-dark);\\n}\\n\\n.btn {\\n display: block;\\n text-align: center;\\n transition: all .2s;\\n padding: 0 .4em;\\n min-width: 3em;\\n line-height: 1.5em;\\n background: var(--color-primary);\\n color: white;\\n text-shadow: 0 0 4px var(--color-primary-verydark);\\n box-shadow: 0 0 3px var(--color-shadow);\\n cursor: pointer;\\n -ms-user-select: none;\\n -moz-user-select: none;\\n -webkit-user-select: none;\\n user-select: none;\\n position: relative;\\n overflow: hidden;\\n}\\n\\n.btn:hover {\\n transition: all .05s;\\n background: var(--color-primary-darker);\\n}\\n\\n.btn.btn-down, .btn:active {\\n transition: all .05s;\\n background: var(--color-primary-dark);\\n box-shadow: 0 0 1px var(--color-shadow);\\n}\\n\\n.btn.disabled {\\n background: var(--color-primary-light);\\n}\\n\\n.dialog .btn {\\n margin: 10px 0;\\n}\\n\\n.btn-big {\\n padding: 5px;\\n}\\n\\n.btn-inline {\\n display: inline;\\n}\\n\\n.textbtn {\\n display: inline-block;\\n color: var(--color-text-gray);\\n margin: 0 5px;\\n}\\n\\n.textbtn.active {\\n color: var(--color-text);\\n}\\n\\n*[hidden] {\\n display: none !important;\\n}\\n\\n.context-menu {\\n position: absolute;\\n overflow-y: auto;\\n background: var(--color-bg);\\n border: solid 1px #777;\\n box-shadow: 0 0px 12px var(--color-shadow);\\n min-width: 100px;\\n max-width: 450px;\\n outline: none;\\n z-index: 10001;\\n animation: context-menu-in .2s ease-out forwards;\\n will-change: transform;\\n}\\n\\n.context-menu .item.dangerous {\\n transition: color .3s, background .3s;\\n color: red;\\n}\\n\\n.context-menu .item.dangerous:hover {\\n transition: color .1s, background .1s;\\n background: red;\\n color: white;\\n}\\n\\n@keyframes context-menu-in {\\n 0% {\\n transform: scale(.9);\\n }\\n 100% {\\n transform: scale(1);\\n }\\n}\\n\\n*.menu-shown {\\n background: var(--color-bg-dd);\\n}\\n\\n.menu-info {\\n white-space: pre-wrap;\\n color: var(--color-text-gray);\\n padding: 5px 10px;\\n /* animation: showing .3s; */\\n cursor: default;\\n}\\n\\n.toasts-container {\\n position: fixed;\\n bottom: 0;\\n right: 0;\\n padding: 5px;\\n width: 300px;\\n z-index: 10001;\\n overflow: hidden;\\n}\\n\\n.toast {\\n margin: 5px;\\n padding: 10px;\\n border-radius: 5px;\\n box-shadow: 0 0 10px var(--color-shadow);\\n background: var(--color-bg);\\n white-space: pre-wrap;\\n animation: showing-right .3s;\\n}\\n\\n.fading-out {\\n transition: opacity .3s;\\n opacity: 0;\\n pointer-events: none;\\n}\\n\\n.anchor-bottom {\\n transform: translate(-50%, -100%);\\n}\\n\\n.tooltip {\\n position: absolute;\\n background: var(--color-bg);\\n box-shadow: 0 0 5px var(--color-shadow);\\n border-radius: 5px;\\n padding: .2em .25em;\\n}\\n\";\n\n// file: viewlib.ts\nfunction getWebfxCss() {\n return css;\n}\nlet cssInjected = false;\nfunction injectWebfxCss(options) {\n if (!cssInjected) {\n injectCss(getWebfxCss(), Object.assign(Object.assign({}, options), { tag: \"style.webfx-injected-style\" }));\n cssInjected = true;\n }\n}\n// Views and helpers are moved to ../views/\n\nclass TextView extends View {\n constructor() {\n super(...arguments);\n this._text = \"\";\n this.textFunc = null;\n }\n get text() { var _a, _b; return (_b = (_a = this.dom) === null || _a === void 0 ? void 0 : _a.textContent) !== null && _b !== void 0 ? _b : this._text; }\n set text(val) {\n if (typeof val == 'function') {\n this._text = val();\n this.textFunc = val;\n }\n else {\n this._text = val;\n this.textFunc = null;\n }\n if (this.domCreated) {\n this.dom.textContent = this._text;\n }\n }\n postCreateDom() {\n super.postCreateDom();\n if (this._text)\n this.dom.textContent = this._text;\n }\n updateDom() {\n super.updateDom();\n if (this.textFunc) {\n this.dom.textContent = this.textFunc();\n }\n }\n}\nclass ButtonView extends TextView {\n constructor(init) {\n super();\n this.disabled = false;\n this.type = 'normal';\n objectInit(this, init);\n this.updateDom();\n }\n createDom() {\n return { tag: 'div.btn', tabIndex: 0 };\n }\n updateDom() {\n super.updateDom();\n this.toggleClass('disabled', this.disabled);\n this.toggleClass('btn-big', this.type === 'big');\n this.toggleClass('btn-inline', this.type === 'inline');\n }\n}\nclass TextBtn extends TextView {\n constructor(init) {\n super();\n this.clickable = true;\n this.active = false;\n this.right = false;\n objectInit(this, init);\n }\n createDom() {\n return {\n tag: 'span.textbtn.no-selection'\n };\n }\n updateDom() {\n super.updateDom();\n this.dom.tabIndex = this.clickable ? 0 : -1;\n this.toggleClass('clickable', this.clickable);\n this.toggleClass('active', this.active);\n this.dom.style.float = this.right ? 'right' : 'left';\n }\n}\n/** @deprecated Use `TextBtn` instead. */\nconst TabBtn = TextBtn;\n\nfunction setPosition(dom, options) {\n let { x = 0, y = 0, anchor = 'bottom' } = options;\n dom.style.left = x + 'px';\n dom.style.top = y + 'px';\n if (!dom.classList.contains('anchor-' + anchor)) {\n dom.classList.forEach(x => {\n if (x.startsWith('anchor-')) {\n dom.classList.remove(x);\n }\n });\n dom.classList.add('anchor-' + anchor);\n }\n}\n/** DragManager is used to help exchange information between views */\nvar dragManager = new class DragManager {\n constructor() {\n /** The item being dragged */\n this._currentItem = null;\n this._currentArray = null;\n this.onDragStart = new Callbacks();\n this.onDragEnd = new Callbacks();\n }\n get currentItem() { var _a, _b, _c; return (_c = (_a = this._currentItem) !== null && _a !== void 0 ? _a : (_b = this._currentArray) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : null; }\n ;\n get currentArray() {\n if (this._currentItem)\n return [this._currentItem];\n return this._currentArray;\n }\n start(item) {\n this._currentItem = item;\n console.log('drag start', item);\n this.onDragStart.invoke();\n }\n startArray(arr) {\n this._currentArray = arr;\n console.log('drag start array', arr);\n this.onDragStart.invoke();\n }\n end() {\n this._currentItem = null;\n this._currentArray = null;\n console.log('drag end');\n this.onDragEnd.invoke();\n }\n};\nclass EditableHelper {\n constructor(element) {\n this.editing = false;\n this.beforeEdit = null;\n this.onComplete = null;\n this.element = element;\n }\n startEdit(onComplete) {\n if (this.editing)\n return;\n this.editing = true;\n var ele = this.element;\n var beforeEdit = this.beforeEdit = ele.textContent;\n toggleClass(ele, 'editing', true);\n var input = buildDOM({\n tag: 'input', type: 'text', value: beforeEdit\n });\n while (ele.firstChild)\n ele.removeChild(ele.firstChild);\n ele.appendChild(input);\n input.select();\n input.focus();\n var stopEdit = () => {\n var _a;\n this.editing = false;\n toggleClass(ele, 'editing', false);\n events.forEach(x => x.remove());\n input.remove();\n (_a = this.onComplete) === null || _a === void 0 ? void 0 : _a.call(this, input.value);\n onComplete === null || onComplete === void 0 ? void 0 : onComplete(input.value);\n };\n var events = [\n listenEvent(input, 'keydown', (evv) => {\n if (evv.code === 'Enter') {\n stopEdit();\n evv.preventDefault();\n }\n }),\n listenEvent(input, 'focusout', (evv) => { stopEdit(); }),\n ];\n }\n startEditAsync() {\n return new Promise((resolve) => this.startEdit(resolve));\n }\n}\nclass ViewToggle {\n constructor(init) {\n this.shownKeys = [];\n this.toggleMode = 'remove';\n this.container = null;\n objectInit(this, init);\n this.setShownKeys(this.shownKeys);\n }\n add(key, view) {\n const oldVal = this.items[key];\n if (oldVal) {\n if (oldVal instanceof Array) {\n this.items[key].push(view);\n }\n else {\n this.items[key] = [oldVal, view];\n }\n }\n else {\n this.items[key] = view;\n }\n this.toggleView(view, this.shownKeys.indexOf(key) >= 0);\n }\n setShownKeys(keys) {\n this.shownKeys = keys;\n const items = this.items;\n for (const key in items) {\n const show = keys.indexOf(key) >= 0;\n if (Object.prototype.hasOwnProperty.call(items, key)) {\n const val = items[key];\n if (val) {\n if (val instanceof Array) {\n for (const v of val) {\n this.toggleView(v, show);\n }\n }\n else if (val) {\n this.toggleView(val, show);\n }\n }\n }\n }\n }\n toggleView(view, show, mode) {\n if (!mode)\n mode = this.toggleMode;\n if (mode == 'display') {\n view.dom.style.display = show ? '' : 'none';\n }\n else if (mode == 'hidden') {\n view.dom.hidden = !show;\n }\n else if (mode == 'remove') {\n if (show != !!view.parentView) {\n if (show) {\n this.container.appendView(view);\n }\n else {\n this.container.removeView(view);\n }\n }\n }\n else {\n throw new Error('Unknown toggle mode');\n }\n }\n}\nclass ItemActiveHelper {\n constructor(init) {\n this.funcSetActive = (item, val) => item.toggleClass('active', val);\n this.current = null;\n objectInit(this, init);\n }\n set(item) {\n if (this.current === item)\n return;\n if (this.current)\n this.funcSetActive(this.current, false);\n this.current = item;\n if (this.current)\n this.funcSetActive(this.current, true);\n }\n}\n\nclass ToolTip extends TextView {\n constructor() {\n super(...arguments);\n this._shown = false;\n this._timer = new Timer(() => this.close());\n this._cancelClose = null;\n }\n createDom() {\n return {\n tag: 'div.tooltip'\n };\n }\n get shown() { return this._shown; }\n show(options) {\n var _a;\n if (this.shown)\n return;\n this._shown = true;\n (_a = this._cancelClose) === null || _a === void 0 ? void 0 : _a.call(this);\n let { parent = document.body, timeout } = options;\n if (timeout)\n this._timer.timeout(timeout);\n const dom = this.dom;\n setPosition(dom, options);\n parent.appendChild(dom);\n }\n close(fadeOutOptions) {\n if (!this.shown)\n return;\n this._timer.tryCancel();\n this._shown = false;\n this._cancelClose = fadeout(this.dom, fadeOutOptions).cancel;\n }\n}\nvar FlagsInput;\n(function (FlagsInput_1) {\n class FlagsInput extends ContainerView {\n constructor(flags) {\n super();\n flags === null || flags === void 0 ? void 0 : flags.forEach(f => {\n var flag = f instanceof Flag ? f : new Flag({ text: Object.prototype.toString.call(f) });\n this.addView(flag);\n });\n }\n createDom() {\n return { tag: 'div.flags-input' };\n }\n }\n FlagsInput_1.FlagsInput = FlagsInput;\n class Flag extends TextView {\n get parentInput() { return this.parentView; }\n constructor(init) {\n super();\n objectInit(this, init);\n }\n createDom() {\n return { tag: 'div.flags-input-item' };\n }\n }\n FlagsInput_1.Flag = Flag;\n})(FlagsInput || (FlagsInput = {}));\n\nclass Overlay extends View {\n createDom() {\n return { tag: 'div.overlay' };\n }\n /** @deprecated Use `setFlags` instead. */\n setCenterChild(centerChild) {\n return this.setFlags({ centerChild });\n }\n /** @deprecated Use `setFlags` instead. */\n setNoBg(nobg) {\n return this.setFlags({ nobg });\n }\n /** @deprecated Use `setFlags` instead. */\n setFixed(fixed) {\n return this.setFlags({ fixed });\n }\n setFlags(flags) {\n for (const key in flags) {\n if (Object.prototype.hasOwnProperty.call(flags, key)) {\n this.toggleClass(key, flags[key]);\n }\n }\n return this;\n }\n}\n\nvar __awaiter$1 = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass Dialog extends View {\n get domheader() { return this.header.dom; }\n static get defaultParent() {\n if (!Dialog._defaultParent)\n Dialog._defaultParent = new DialogParent();\n return Dialog._defaultParent;\n }\n static set defaultParent(val) {\n Dialog._defaultParent = val;\n }\n get width() { return this.dom.style.width; }\n set width(val) { this.dom.style.width = val; }\n get contentFlex() { return this.content.dom.classList.contains('flex'); }\n set contentFlex(val) { this.content.toggleClass('flex', !!val); }\n get resizable() { return this.dom.classList.contains('resize'); }\n set resizable(val) { this.toggleClass('resize', !!val); }\n constructor() {\n super();\n this.parent = Dialog.defaultParent;\n this.overlay = new Overlay().setFlags({ centerChild: true, nobg: true });\n this.header = new View({ tag: 'div.dialog-title.clearfix' });\n this.content = new View({ tag: 'div.dialog-content' });\n this.shown = false;\n this.btnTitle = new TextBtn({ active: true, clickable: false });\n this.btnClose = new TextBtn({ text: I `Close`, right: true });\n this.title = 'Dialog';\n this.allowClose = true;\n this.showCloseButton = true;\n this.onShown = new Callbacks();\n this.onClose = new Callbacks();\n this.focusTrap = new View({ tag: 'div.focustrap', tabIndex: 0 });\n this.btnClose.onActive.add(() => this.allowClose && this.close());\n }\n createDom() {\n return {\n tag: 'div.dialog',\n tabIndex: 0,\n style: 'width: 300px',\n child: [\n this.header,\n this.content,\n this.focusTrap\n ]\n };\n }\n postCreateDom() {\n super.postCreateDom();\n this.addBtn(this.btnTitle);\n this.addBtn(this.btnClose);\n this.overlay.appendView(this);\n this.overlay.dom.addEventListener('mousedown', (ev) => {\n if (this.allowClose && ev.button === 0 && ev.target === this.overlay.dom) {\n ev.preventDefault();\n this.close();\n }\n });\n this.overlay.dom.addEventListener('keydown', (ev) => {\n if (this.allowClose && ev.keyCode === 27) { // ESC\n ev.preventDefault();\n this.close();\n }\n else if (ev.target === this.dom && ev.code === 'Tab' && ev.shiftKey) {\n ev.preventDefault();\n let tabables = this.dom.querySelectorAll('a, [tabindex]');\n if (tabables.length >= 2 && tabables[tabables.length - 2]['focus']) {\n // the last tabable is `focusTrap`, so the index used here is `length - 2`\n tabables[tabables.length - 2]['focus']();\n }\n }\n });\n // title bar pointer event handler:\n {\n let offset;\n listenPointerEvents(this.header.dom, (e) => {\n if (e.action === 'down') {\n if (e.ev.target !== this.header.dom && e.ev.target !== this.btnTitle.dom)\n return;\n e.ev.preventDefault();\n const rectOverlay = this.overlay.dom.getBoundingClientRect();\n const rect = this.dom.getBoundingClientRect();\n offset = {\n x: e.point.pageX - rectOverlay.x - rect.x,\n y: e.point.pageY - rectOverlay.y - rect.y\n };\n return 'track';\n }\n else if (e.action === 'move') {\n e.ev.preventDefault();\n const rect = this.overlay.dom.getBoundingClientRect();\n const pageX = numLimit(e.point.pageX, rect.left, rect.right);\n const pageY = numLimit(e.point.pageY, rect.top, rect.bottom);\n this.setOffset(pageX - offset.x, pageY - offset.y);\n }\n });\n }\n this.focusTrap.dom.addEventListener('focus', (ev) => {\n this.dom.focus();\n });\n }\n updateDom() {\n super.updateDom();\n this.btnTitle.updateWith({ text: this.title });\n this.btnTitle.hidden = !this.title;\n this.btnClose.hidden = !(this.allowClose && this.showCloseButton);\n }\n addBtn(btn) {\n this.ensureDom();\n this.header.appendView(btn);\n }\n addContent(view, replace) {\n this.ensureDom();\n if (replace)\n this.content.removeAllView();\n this.content.addChild(view);\n }\n addChild(view) {\n this.addContent(view);\n }\n setOffset(x, y) {\n this.dom.style.left = x ? x + 'px' : '';\n this.dom.style.top = y ? y + 'px' : '';\n this.overlay.setCenterChild(false);\n }\n getOffset() {\n var x = this.dom.style.left ? parseFloat(this.dom.style.left) : 0;\n var y = this.dom.style.top ? parseFloat(this.dom.style.top) : 0;\n return { x, y };\n }\n center() {\n this.setOffset(0, 0);\n this.overlay.setCenterChild(true);\n }\n show(ev) {\n var _a;\n if (this.shown)\n return;\n this.shown = true;\n (_a = this._cancelFadeout) === null || _a === void 0 ? void 0 : _a.call(this, true);\n this.ensureDom();\n this.parent.onDialogShowing(this);\n this.setTransformOrigin(ev);\n this.dom.focus();\n (this.autoFocus || this).dom.focus();\n this.onShown.invoke();\n }\n setTransformOrigin(ev) {\n if (ev) {\n const rect = this.dom.getBoundingClientRect();\n this.dom.style.transformOrigin = `${ev.x - rect.x}px ${ev.y - rect.y}px`;\n }\n else {\n this.dom.style.transformOrigin = '';\n }\n }\n close() {\n if (!this.shown)\n return;\n this.shown = false;\n this.setTransformOrigin(undefined);\n this.onClose.invoke();\n this._cancelFadeout = fadeout(this.overlay.dom)\n .onFinished(() => { var _a; return (_a = this.overlay.parentView) === null || _a === void 0 ? void 0 : _a.removeView(this.overlay); })\n .cancel;\n Dialog.defaultParent.onDialogClosing(this);\n }\n waitClose() {\n return new Promise((resolve) => {\n var cb = this.onClose.add(() => {\n this.onClose.remove(cb);\n resolve();\n });\n });\n }\n}\nDialog._defaultParent = null;\nclass MessageBox extends Dialog {\n constructor() {\n super(...arguments);\n this.allowClose = false;\n this.title = 'Message';\n this.result = 'none';\n }\n addResultBtns(results) {\n for (const r of results) {\n this.addBtnWithResult(new TextBtn({ text: i18n.get('msgbox_' + r), right: true }), r);\n }\n return this;\n }\n setTitle(title) {\n this.title = title;\n if (this.domCreated)\n this.updateDom();\n return this;\n }\n addText(text) {\n this.addContent(new TextView({ tag: 'div.messagebox-text', text }));\n return this;\n }\n allowCloseWithResult(result, showCloseButton) {\n this.result = result;\n this.allowClose = true;\n this.showCloseButton = !!showCloseButton;\n if (this.domCreated)\n this.updateDom();\n return this;\n }\n addBtnWithResult(btn, result) {\n btn.onActive.add(() => { this.result = result; this.close(); });\n this.addBtn(btn);\n return this;\n }\n showAndWaitResult() {\n return __awaiter$1(this, void 0, void 0, function* () {\n this.show();\n yield this.waitClose();\n return this.result;\n });\n }\n}\nclass DialogParent {\n constructor(view = document.body) {\n this.bgOverlay = new Overlay();\n this.dialogCount = 0;\n this.fixed = false;\n this._cancelFadeout = null;\n this.view = View.getView(view);\n if (view === document.body) {\n this.fixed = true;\n this.view.mountStateChanged(MountState.Mounted);\n }\n }\n onDialogShowing(dialog) {\n var _a;\n if (this.dialogCount++ === 0) {\n (_a = this._cancelFadeout) === null || _a === void 0 ? void 0 : _a.call(this, true);\n this.bgOverlay.setFlags({ fixed: this.fixed, clickThrough: true });\n this.view.appendView(this.bgOverlay);\n }\n dialog.overlay.setFlags({ fixed: this.fixed });\n this.view.appendView(dialog.overlay);\n }\n onDialogClosing(dialog) {\n if (--this.dialogCount === 0) {\n this._cancelFadeout = fadeout(this.bgOverlay.dom)\n .onFinished(() => this.view.removeView(this.bgOverlay))\n .cancel;\n }\n }\n}\n\nclass InputView extends View {\n get value() { return this.dom.value; }\n set value(val) { this.dom.value = val; }\n constructor(init) {\n super();\n this.multiline = false;\n this.type = 'text';\n this.placeholder = '';\n objectInit(this, init);\n }\n createDom() {\n return this.multiline ? { tag: 'textarea.input-text' } : { tag: 'input.input-text' };\n }\n updateDom() {\n super.updateDom();\n if (this.dom instanceof HTMLInputElement) {\n this.dom.type = this.type;\n this.dom.placeholder = this.placeholder;\n }\n }\n}\nclass LabeledInputBase extends View {\n get dominput() { return this.input.dom; }\n constructor(init) {\n super();\n this.label = '';\n objectInit(this, init);\n }\n createDom() {\n return {\n tag: 'div.labeled-input',\n child: [\n { tag: 'div.input-label', text: () => this.label },\n this.input\n ]\n };\n }\n updateDom() {\n super.updateDom();\n this.input.domCreated && this.input.updateDom();\n }\n}\nclass LabeledInput extends LabeledInputBase {\n get value() { return this.dominput.value; }\n set value(val) { this.dominput.value = val; }\n constructor(init) {\n super();\n objectInit(this, init);\n if (!this.input)\n this.input = new InputView();\n }\n updateDom() {\n this.input.type = this.type;\n super.updateDom();\n }\n}\n\nclass ListViewItem extends View {\n constructor() {\n super(...arguments);\n this.dragging = undefined;\n this._selected = false;\n this.onSelectedChanged = new Callbacks();\n // https://stackoverflow.com/questions/7110353\n this.enterctr = 0;\n this.dragoverPlaceholder = null;\n }\n get listview() { return this.parentView instanceof ListView ? this.parentView : null; }\n get selectionHelper() { var _a; return (_a = this.listview) === null || _a === void 0 ? void 0 : _a.selectionHelper; }\n get dragData() { return this.dom.textContent; }\n get selected() { return this._selected; }\n set selected(v) {\n this._selected = v;\n this.domCreated && this.updateDom();\n this.onSelectedChanged.invoke();\n }\n remove() {\n if (!this.listview)\n return;\n this.listview.remove(this);\n }\n postCreateDom() {\n super.postCreateDom();\n this.dom.setAttribute('role', 'listitem');\n this.dom.addEventListener('click', (ev) => {\n var _a, _b, _c;\n if ((_a = this.listview) === null || _a === void 0 ? void 0 : _a.selectionHelper.handleItemClicked(this, ev))\n return;\n (_c = (_b = this.listview) === null || _b === void 0 ? void 0 : _b.onItemClicked) === null || _c === void 0 ? void 0 : _c.call(_b, this);\n });\n this.dom.addEventListener('keydown', (ev) => {\n var _a, _b, _c, _d, _e, _f;\n if (ev.code === 'Enter') {\n if (ev.altKey) {\n const rect = this.dom.getBoundingClientRect();\n const mouseev = new MouseEvent('contextmenu', {\n clientX: rect.left, clientY: rect.top,\n relatedTarget: this.dom\n });\n (_c = ((_a = this.onContextMenu) !== null && _a !== void 0 ? _a : (_b = this.listview) === null || _b === void 0 ? void 0 : _b.onContextMenu)) === null || _c === void 0 ? void 0 : _c(this, mouseev);\n }\n else {\n if ((_d = this.listview) === null || _d === void 0 ? void 0 : _d.selectionHelper.handleItemClicked(this, ev))\n return;\n (_f = (_e = this.listview) === null || _e === void 0 ? void 0 : _e.onItemClicked) === null || _f === void 0 ? void 0 : _f.call(_e, this);\n }\n ev.preventDefault();\n }\n else if (this.listview && (ev.code === 'ArrowUp' || ev.code === 'ArrowDown')) {\n const direction = ev.code === 'ArrowUp' ? -1 : 1;\n const item = this.listview.get(this.position + direction);\n if (item) {\n item.dom.focus();\n ev.preventDefault();\n }\n }\n else if (this.listview && (ev.code === 'PageUp' || ev.code === 'PageDown')) {\n const dir = ev.code === 'PageUp' ? -1 : 1;\n const scrollBox = this.listview.scrollBox;\n const targetY = dir > 0 ? (this.dom.offsetTop + scrollBox.offsetHeight)\n : (this.dom.offsetTop + this.dom.offsetHeight - scrollBox.offsetHeight);\n const len = this.listview.length;\n let item = this;\n while (dir > 0 ? (targetY > item.dom.offsetTop + item.dom.offsetHeight)\n : (targetY < item.dom.offsetTop)) {\n const nextIdx = item.position + dir;\n if (nextIdx < 0 || nextIdx >= len)\n break;\n item = this.listview.get(nextIdx);\n }\n if (item && item !== this) {\n item.dom.focus();\n ev.preventDefault();\n }\n }\n else if (this.listview && (ev.code === 'Home' || ev.code === 'End')) {\n this.listview.get(ev.code == 'Home' ? 0 : (this.listview.length - 1)).dom.focus();\n ev.preventDefault();\n }\n else if (this.listview && this.listview.selectionHelper.handleItemKeyDown(this, ev)) ;\n });\n this.dom.addEventListener('contextmenu', (ev) => {\n var _a, _b, _c;\n (_c = ((_a = this.onContextMenu) !== null && _a !== void 0 ? _a : (_b = this.listview) === null || _b === void 0 ? void 0 : _b.onContextMenu)) === null || _c === void 0 ? void 0 : _c(this, ev);\n });\n this.dom.addEventListener('dragstart', (ev) => {\n var _a, _b;\n if (!((_a = this.dragging) !== null && _a !== void 0 ? _a : (_b = this.listview) === null || _b === void 0 ? void 0 : _b.dragging)) {\n ev.preventDefault();\n return;\n }\n var arr = [];\n if (this.selected && this.selectionHelper) {\n arr = [...this.selectionHelper.selectedItems];\n arr.sort((a, b) => a.position - b.position); // remove this line to get a new feature!\n }\n else {\n arr = [this];\n }\n dragManager.startArray(arr);\n ev.dataTransfer.setData('text/plain', arr.map(x => x.dragData).join('\\r\\n'));\n arr.forEach(x => x.dom.style.opacity = '.5');\n });\n this.dom.addEventListener('dragend', (ev) => {\n var arr = dragManager.currentArray;\n dragManager.end();\n ev.preventDefault();\n arr.forEach(x => x.dom.style.opacity = '');\n });\n this.dom.addEventListener('dragover', (ev) => {\n this.dragHandler(ev, 'dragover');\n });\n this.dom.addEventListener('dragenter', (ev) => {\n this.dragHandler(ev, 'dragenter');\n });\n this.dom.addEventListener('dragleave', (ev) => {\n this.dragHandler(ev, 'dragleave');\n });\n this.dom.addEventListener('drop', (ev) => {\n this.dragHandler(ev, 'drop');\n });\n }\n dragHandler(ev, type) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const item = dragManager.currentItem;\n let items = dragManager.currentArray;\n const drop = type === 'drop';\n const arg = {\n source: item, target: this,\n sourceItems: items,\n event: ev, drop: drop,\n accept: false\n };\n if (item instanceof ListViewItem) {\n if (((_a = this.listview) === null || _a === void 0 ? void 0 : _a.moveByDragging) && item.listview === this.listview) {\n ev.preventDefault();\n const selfInside = (items.indexOf(this) >= 0);\n const after = ev.clientY - this.dom.getBoundingClientRect().top > this.dom.offsetHeight / 2;\n if (!(selfInside && drop))\n arg.accept = after ? 'move-after' : 'move';\n if (!drop) {\n ev.dataTransfer.dropEffect = 'move';\n }\n else {\n if (items.indexOf(this) === -1) {\n let newpos = this.position;\n if (after)\n newpos++;\n for (const it of items) {\n if (it !== this) {\n if (newpos > it.position)\n newpos--;\n this.listview.move(it, newpos);\n newpos++;\n }\n }\n }\n }\n }\n }\n const onDragover = (_b = this.onDragover) !== null && _b !== void 0 ? _b : (_c = this.listview) === null || _c === void 0 ? void 0 : _c.onDragover;\n if (!arg.accept && onDragover) {\n onDragover(arg);\n if (drop || arg.accept)\n ev.preventDefault();\n }\n const onContextMenu = (_d = this.onContextMenu) !== null && _d !== void 0 ? _d : (_e = this.listview) === null || _e === void 0 ? void 0 : _e.onContextMenu;\n if (!arg.accept && items && items.indexOf(this) >= 0 && onContextMenu) {\n if (drop)\n onContextMenu(this, ev);\n else\n ev.preventDefault();\n }\n if (type === 'dragenter' || type == 'dragover' || type === 'dragleave' || drop) {\n if (type === 'dragenter') {\n this.enterctr++;\n }\n else if (type === 'dragleave') {\n this.enterctr--;\n }\n else if (type === 'drop') {\n this.enterctr = 0;\n }\n let hover = this.enterctr > 0;\n this.toggleClass('dragover', hover);\n let placeholder = hover && (arg.accept === 'move' || arg.accept === 'move-after') && arg.accept;\n if (placeholder != ((_g = (_f = this.dragoverPlaceholder) === null || _f === void 0 ? void 0 : _f[1]) !== null && _g !== void 0 ? _g : false)) {\n (_h = this.dragoverPlaceholder) === null || _h === void 0 ? void 0 : _h[0].remove();\n this.dragoverPlaceholder = null;\n if (placeholder) {\n this.dragoverPlaceholder = [\n buildDOM({ tag: 'div.dragover-placeholder' }),\n placeholder\n ];\n var before = this.dom;\n if (arg.accept === 'move-after')\n before = before.nextElementSibling;\n this.dom.parentElement.insertBefore(this.dragoverPlaceholder[0], before);\n }\n }\n }\n }\n ;\n}\nclass ListView extends ContainerView {\n get scrollBox() { return this._scrollBox || this.dom; }\n set scrollBox(val) { this._scrollBox = val; }\n constructor(container) {\n super(container);\n // private items: Array = [];\n this.onItemClicked = null;\n /**\n * Allow user to drag an item.\n */\n this.dragging = false;\n /**\n * Allow user to drag an item and change its position.\n */\n this.moveByDragging = false;\n this.selectionHelper = new SelectionHelper();\n this._scrollBox = null;\n this.onItemMoved = null;\n /**\n * When dragover or drop\n */\n this.onDragover = null;\n this.onContextMenu = null;\n this.selectionHelper.itemProvider = this;\n }\n postCreateDom() {\n super.postCreateDom();\n this.dom.setAttribute('role', 'list');\n }\n add(item, pos) {\n this.addView(item, pos);\n if (this.dragging)\n item.dom.draggable = true;\n }\n remove(item, keepSelected) {\n item = this._ensureItem(item);\n if (!keepSelected && item.selected)\n this.selectionHelper.toggleItemSelection(item);\n this.removeView(item);\n }\n move(item, newpos) {\n var _a;\n item = this._ensureItem(item);\n this.remove(item, true);\n this.add(item, newpos);\n (_a = this.onItemMoved) === null || _a === void 0 ? void 0 : _a.call(this, item, item.position);\n }\n /** Remove all items */\n removeAll() {\n while (this.length)\n this.remove(this.length - 1);\n }\n /** Remove all items and all DOM children */\n clear() {\n this.removeAll();\n clearChildren(this.dom);\n }\n ReplaceChild(dom) {\n this.clear();\n this.dom.appendChild(dom.getDOM());\n }\n}\nclass SelectionHelper {\n constructor() {\n this._enabled = false;\n this.onEnabledChanged = new Callbacks();\n this.itemProvider = null;\n this.ctrlForceSelect = false;\n this.selectedItems = [];\n this.onSelectedItemsChanged = new Callbacks();\n /** For shift-click */\n this.lastToggledItem = null;\n }\n get enabled() { return this._enabled; }\n set enabled(val) {\n if (!!val === !!this._enabled)\n return;\n this._enabled = val;\n while (this.selectedItems.length)\n this.toggleItemSelection(this.selectedItems[0], false);\n this.lastToggledItem = null;\n this.onEnabledChanged.invoke();\n }\n get count() { return this.selectedItems.length; }\n /** Returns true if it's handled by the helper. */\n handleItemClicked(item, ev) {\n if (!this.enabled) {\n if (!this.ctrlForceSelect || !ev.ctrlKey)\n return false;\n this.enabled = true;\n }\n if (ev.shiftKey && this.lastToggledItem && this.itemProvider) {\n var toSelect = !!this.lastToggledItem.selected;\n var start = item.position, end = this.lastToggledItem.position;\n if (start > end)\n [start, end] = [end, start];\n for (let i = start; i <= end; i++) {\n this.toggleItemSelection(this.itemProvider.get(i), toSelect);\n }\n this.lastToggledItem = item;\n }\n else {\n this.toggleItemSelection(item);\n }\n ev.preventDefault();\n return true;\n }\n /** Returns true if it's handled by the helper. */\n handleItemKeyDown(item, ev) {\n if (!this.enabled)\n return false;\n if (this.itemProvider && ev.ctrlKey && ev.code === 'KeyA') {\n const len = this.itemProvider.length;\n for (let i = 0; i < len; i++) {\n this.toggleItemSelection(this.itemProvider.get(i), true);\n }\n ev.preventDefault();\n return true;\n }\n return false;\n }\n toggleItemSelection(item, force) {\n if (force !== undefined && force === !!item.selected)\n return;\n if (item.selected) {\n item.selected = false;\n this.selectedItems.remove(item);\n this.onSelectedItemsChanged.invoke('remove', item);\n }\n else {\n item.selected = true;\n this.selectedItems.push(item);\n this.onSelectedItemsChanged.invoke('add', item);\n }\n this.lastToggledItem = item;\n if (this.count === 0 && this.ctrlForceSelect)\n this.enabled = false;\n }\n}\nclass LazyListView extends ListView {\n constructor() {\n super(...arguments);\n this._loaded = 0;\n this._lazy = false;\n this._slowLoading = null;\n this._autoLoad = null;\n }\n get loaded() { return this.loaded; }\n get slowLoading() { return this._slowLoading; }\n get autoLoad() { return this._autoLoad; }\n get lazy() { return this._lazy; }\n set lazy(val) {\n this._lazy = val;\n if (!val)\n this.ensureLoaded(this.length - 1);\n }\n ensureLoaded(pos) {\n if (pos >= this.length)\n pos = this.length - 1;\n while (this._loaded <= pos) {\n this.dom.appendChild(this.items[this._loaded].dom);\n this._loaded++;\n }\n }\n loadNext(batchSize = 50) {\n if (this._loaded < this.length) {\n this.ensureLoaded(Math.min(this.length - 1, this._loaded + batchSize - 1));\n return true;\n }\n return false;\n }\n slowlyLoad(interval = 30, batchSize = 50, autoLoad = false) {\n if (autoLoad)\n this.enableAutoLoad(interval, batchSize);\n if (this._slowLoading)\n return this._slowLoading;\n if (this._loaded >= this.length)\n return Promise.resolve(true);\n return this._slowLoading = new Promise((r) => {\n var cancel;\n var cont;\n var callback = () => {\n if (!this._slowLoading || !this.loadNext(batchSize)) {\n this.lazy = !!this._autoLoad;\n cancel();\n r(!!this._slowLoading);\n this._slowLoading = null;\n }\n else {\n cont();\n }\n };\n if (interval == -1 && window['requestIdleCallback']) {\n let handle;\n cancel = () => window['cancelIdleCallback'](handle);\n cont = () => {\n handle = window['requestIdleCallback'](callback);\n };\n cont();\n }\n else {\n if (interval == -1)\n interval = 30;\n let timer = setInterval(callback, interval);\n cancel = () => clearInterval(timer);\n cont = () => { };\n }\n });\n }\n enableAutoLoad(interval = 30, batchSize = 50) {\n this._autoLoad = { interval, batchSize };\n this.slowlyLoad(interval, batchSize);\n }\n stopLoading() {\n this._slowLoading = null;\n this._autoLoad = null;\n }\n unload() {\n this.stopLoading();\n for (let i = this._loaded - 1; i >= 0; i--) {\n this.items[i].dom.remove();\n }\n this.lazy = true;\n this._loaded = 0;\n }\n _insertToDom(item, pos) {\n if (!this.lazy || pos < this._loaded) {\n super._insertToDom(item, pos);\n this._loaded++;\n }\n else {\n if (this._autoLoad) {\n this.slowlyLoad(this._autoLoad.interval, this._autoLoad.batchSize);\n }\n }\n }\n _removeFromDom(item) {\n if (item.position < this._loaded) {\n super._removeFromDom(item);\n this._loaded--;\n }\n }\n}\n\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nclass LoadingIndicator extends View {\n constructor(init) {\n super();\n this._status = 'running';\n this.onclick = null;\n if (init)\n objectInit(this, init);\n }\n get state() { return this._status; }\n set state(val) {\n this._status = val;\n ['running', 'error', 'normal'].forEach(x => this.toggleClass(x, val === x));\n }\n get content() { return this._text; }\n set content(val) { this._text = val; this.ensureDom(); this._textdom.textContent = val; }\n reset() {\n this.state = 'running';\n this.content = I `Loading`;\n this.onclick = null;\n }\n error(err, retry) {\n this.state = 'error';\n this.content = I `Oh no! Something just goes wrong:` + '\\r\\n' + err;\n if (retry) {\n this.content += '\\r\\n' + I `[Click here to retry]`;\n }\n this.onclick = retry;\n }\n action(func) {\n return __awaiter(this, void 0, void 0, function* () {\n try {\n yield func();\n }\n catch (error) {\n this.error(error, () => this.action(func));\n }\n });\n }\n createDom() {\n return {\n tag: 'div.loading-indicator',\n child: [{\n tag: 'div.loading-indicator-inner',\n child: [{ tag: 'div.loading-indicator-text', _id: 'text' }]\n }],\n onclick: (e) => { var _a; return (_a = this.onclick) === null || _a === void 0 ? void 0 : _a.call(this, e); }\n };\n }\n postCreateDom() {\n this._textdom = this.getDomById('text');\n this.reset();\n }\n}\n\nclass MenuItem extends ListViewItem {\n constructor(init) {\n super();\n this.text = '';\n this.cls = 'normal';\n this.keepOpen = false;\n objectInit(this, init);\n }\n createDom() {\n return {\n tag: 'div.item.no-selection',\n tabIndex: 0\n };\n }\n postCreateDom() {\n super.postCreateDom();\n this.onActive.add((ev) => {\n if (this.parentView instanceof ContextMenu) {\n if (!this.keepOpen && !this.parentView.keepOpen)\n this.parentView.close();\n }\n });\n }\n updateDom() {\n super.updateDom();\n this.dom.textContent = this.text;\n if (this.cls !== this._lastcls) {\n if (this._lastcls)\n this.dom.classList.remove(this._lastcls);\n if (this.cls)\n this.dom.classList.add(this.cls);\n }\n }\n}\nclass MenuLinkItem extends MenuItem {\n constructor(init) {\n super(init);\n this.link = '';\n this.download = '';\n objectInit(this, init);\n }\n createDom() {\n var dom = super.createDom();\n dom.tag = 'a.item.no-selection';\n dom.target = \"_blank\";\n return dom;\n }\n updateDom() {\n super.updateDom();\n this.dom.href = this.link;\n this.dom.download = this.download;\n }\n}\nclass MenuInfoItem extends MenuItem {\n constructor(init) {\n super(init);\n this.text = '';\n this.keepOpen = true;\n objectInit(this, init);\n }\n createDom() {\n return {\n tag: 'div.menu-info'\n };\n }\n updateDom() {\n super.updateDom();\n this.dom.textContent = this.text;\n }\n}\nclass ContextMenu extends ListView {\n get visible() { return this._visible; }\n ;\n constructor(items) {\n super({ tag: 'div.context-menu', tabIndex: 0 });\n this.keepOpen = false;\n this.useOverlay = true;\n this._visible = false;\n this.overlay = null;\n this.onClose = new Callbacks();\n this._originalFocused = null;\n items === null || items === void 0 ? void 0 : items.forEach(x => this.add(x));\n }\n postCreateDom() {\n super.postCreateDom();\n this.dom.addEventListener('focusout', (e) => {\n !this.dom.contains(e.relatedTarget) && this.close();\n });\n this.dom.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') {\n e.preventDefault();\n this.close();\n }\n });\n }\n show(arg) {\n if (this._visible) {\n console.trace(\"[ContextMenu] show() called when it's already visible.\");\n return;\n }\n if ('ev' in arg)\n arg = {\n x: arg.ev.clientX,\n y: arg.ev.clientY\n };\n this._visible = true;\n if (this.useOverlay) {\n if (!this.overlay) {\n this.overlay = new Overlay().setFixed(true);\n this.overlay.dom.style.background = 'rgba(0, 0, 0, .1)';\n this.overlay.dom.addEventListener('mousedown', (ev) => {\n if (ev.eventPhase !== Event.AT_TARGET)\n return;\n ev.preventDefault();\n this.close();\n });\n }\n this.overlay.appendView(this);\n mountView(document.body, this.overlay);\n }\n else {\n mountView(document.body, this);\n }\n this._originalFocused = document.activeElement;\n this.setPosition(arg);\n this.dom.focus();\n }\n setPosition(arg) {\n if (!this._visible) {\n console.trace(\"[ContextMenu] setPosition() called when it's not visible.\");\n return;\n }\n this.dom.style.left = '0';\n this.dom.style.top = '0';\n var parentWidth = document.body.offsetWidth;\n var parentHeight = document.body.offsetHeight;\n if (this.useOverlay) {\n const overlayDom = this.overlay.dom;\n parentWidth = overlayDom.offsetWidth;\n parentHeight = overlayDom.offsetHeight;\n }\n this.dom.style.maxHeight = parentHeight + 'px';\n var width = this.dom.offsetWidth, height = this.dom.offsetHeight;\n var x = arg.x, y = arg.y;\n if (x + width > parentWidth)\n x -= width;\n if (y + height > parentHeight)\n y -= height;\n if (x < 0) {\n if (arg.x > parentWidth / 2)\n x = 0;\n else\n x = parentWidth - width;\n }\n if (y < 0) {\n if (arg.y > parentHeight / 2)\n y = 0;\n else\n y = parentHeight - height;\n }\n this.dom.style.left = x + 'px';\n this.dom.style.top = y + 'px';\n this.dom.style.transformOrigin = `${arg.x - x}px ${arg.y - y}px`;\n }\n close() {\n var _a, _b;\n if (this._visible) {\n this._visible = false;\n this.onClose.invoke();\n (_b = (_a = this._originalFocused) === null || _a === void 0 ? void 0 : _a['focus']) === null || _b === void 0 ? void 0 : _b.call(_a);\n this._originalFocused = null;\n if (this.overlay)\n fadeout(this.overlay.dom).onFinished(() => unmountView(document.body, this.overlay));\n fadeout(this.dom).onFinished(() => !this.overlay && unmountView(document.body, this));\n }\n }\n}\n\nclass Section extends View {\n constructor(arg) {\n super();\n this.titleView = new TextView({ tag: 'span.section-title' });\n this.headerView = new View({\n tag: 'div.section-header',\n child: [\n this.titleView\n ]\n });\n this.ensureDom();\n if (arg) {\n if (arg.title)\n this.setTitle(arg.title);\n if (arg.content)\n this.setContent(arg.content);\n if (arg.actions)\n arg.actions.forEach(x => this.addAction(x));\n }\n }\n createDom() {\n return {\n tag: 'div.section',\n child: [\n this.headerView\n ]\n };\n }\n setTitle(text) {\n this.titleView.removeAllView();\n this.titleView.addChild(text);\n }\n setContent(view) {\n if (this.content)\n this.removeView(this.content);\n this.content = View.getView(view);\n this.appendView(this.content);\n }\n addAction(arg) {\n var view = arg instanceof View ?\n arg :\n new SectionAction({ text: arg.text, onActive: arg.onclick });\n this.headerView.appendView(view);\n }\n}\nclass SectionAction extends TextView {\n constructor(init) {\n super();\n objectInit(this, init);\n }\n createDom() {\n return {\n tag: 'div.section-action.clickable',\n tabIndex: 0\n };\n }\n}\n\nclass ToastsContainer extends View {\n constructor() {\n super(...arguments);\n this.parentDom = null;\n this.toasts = [];\n }\n createDom() {\n return { tag: 'div.toasts-container' };\n }\n addToast(toast) {\n if (this.toasts.length === 0)\n this.show();\n this.toasts.push(toast);\n }\n removeToast(toast) {\n this.toasts.remove(toast);\n if (this.toasts.length === 0)\n this.remove();\n }\n show() {\n var parent = this.parentDom || document.body;\n parent.appendChild(this.dom);\n }\n remove() {\n this.dom.remove();\n }\n}\nToastsContainer.default = new ToastsContainer();\nclass Toast extends View {\n constructor(init) {\n super();\n this.text = '';\n this.shown = false;\n this.timer = new Timer(() => this.close());\n objectInit(this, init);\n if (!this.container)\n this.container = ToastsContainer.default;\n }\n show(timeout) {\n if (!this.shown) {\n this.container.addToast(this);\n this.container.appendView(this);\n this.shown = true;\n }\n if (timeout)\n this.timer.timeout(timeout);\n else\n this.timer.tryCancel();\n }\n close() {\n if (!this.shown)\n return;\n this.shown = false;\n fadeout(this.dom)\n .onFinished(() => this.container.removeToast(this));\n }\n createDom() {\n return { tag: 'div.toast' };\n }\n updateDom() {\n super.updateDom();\n this.dom.textContent = this.text;\n }\n static show(text, timeout) {\n var toast = new Toast({ text });\n toast.show(timeout);\n return toast;\n }\n}\n\nexport { AutoResetEvent, BuildDOMCtx, ButtonView, Callbacks, CancelToken, ContainerView, ContextMenu, DataUpdatingHelper, Dialog, DialogParent, EditableHelper, EventRegistrations, FlagsInput, I, I18n, InputStateTracker, InputView, ItemActiveHelper, JsxNode, LabeledInput, LabeledInputBase, Lazy, LazyListView, ListView, ListViewItem, LoadingIndicator, MenuInfoItem, MenuItem, MenuLinkItem, MessageBox, MountState, Overlay, Ref, Section, SectionAction, SelectionHelper, Semaphore, TabBtn, TextBtn, TextCompositionWatcher, TextView, Timer, Toast, ToastsContainer, ToolTip, View, ViewToggle, addChild, appendView, arrayFind, arrayForeach, arrayInsert, arrayMap, arrayRemove, arraySum, base64EncodeUtf8, buildDOM, buildView, clearChildren, createArrayBuilder, createName, createStringBuilder, dragManager, fadeout, foreachFlaten, formatDateTime, formatDuration, formatFileSize, getDOM, getWebfxCss, i18n, injectCss, injectWebfxCss, jsx, jsxBuild, jsxFactory, listenEvent, listenEvents, listenPointerEvents, mod, mountView, numLimit, objectApply, objectInit, readBlobAsDataUrl, replaceChild, setPosition, sleepAsync, startBlockingDetect, strPadLeft, toggleClass, tryGetDOM, unmountView, version };\n","import { Callbacks, Action, numLimit, View } from \"@yuuza/webfx\";\nexport * from \"@yuuza/webfx\";\n\nexport const isIOS = /\\s(iPhone|iPad|iPod)\\s/.test(navigator.userAgent);\n\nexport class ScrollAnimator {\n constructor(readonly view: View) {\n this.view.dom.addEventListener(\"scroll\", (e) => {\n if (e.target === view.dom) {\n if (this.scrollEventPending) {\n this.scrollEventPending = false;\n } else {\n this.onUserScroll.invoke(e);\n this.cancel();\n }\n }\n });\n }\n duration = 300;\n private beginTime = -1;\n beginPos = 0;\n lastPos = 0;\n targetPos = 0;\n private _rafHandle = -1;\n posType: \"top\" | \"center\" = \"top\";\n scrollEventPending = false; // position was changed by this animator\n onUserScroll = new Callbacks>();\n get currentPos() {\n if (this.posType == \"center\")\n return this.view.dom.scrollTop + this.view.dom.offsetHeight / 2;\n else return this.view.dom.scrollTop;\n }\n set currentPos(val: number) {\n var targetPos = val;\n if (this.posType == \"center\") targetPos -= this.view.dom.offsetHeight / 2;\n if (this.view.dom.scrollTop != targetPos) {\n this.scrollEventPending = true;\n this.view.dom.scrollTop = targetPos;\n }\n }\n cancel() {\n if (this._rafHandle >= 0) {\n cancelAnimationFrame(this._rafHandle);\n this._rafHandle = -1;\n }\n }\n scrollTo(pos: number) {\n this.targetPos = pos;\n this.lastPos = this.beginPos = this.currentPos;\n if (this._rafHandle < 0) {\n this._startRaf();\n }\n this.beginTime = performance.now();\n }\n private _rafCallback = null as Action | null;\n private _startRaf() {\n if (!this._rafCallback) {\n this._rafCallback = (now) => {\n if (this._render(now)) {\n this._rafHandle = requestAnimationFrame(this._rafCallback!);\n } else {\n this._rafHandle = -1;\n }\n };\n }\n this._rafHandle = requestAnimationFrame(this._rafCallback);\n }\n private _render(now: number): boolean {\n if (Math.abs(this.currentPos - this.lastPos) > 10) return false;\n\n const t = numLimit((now - this.beginTime) / this.duration, 0, 1);\n\n const pos =\n this.beginPos + (this.targetPos - this.beginPos) * this._easeInOutQuad(t);\n this.lastPos = pos;\n\n this.currentPos = pos;\n\n return t !== 1;\n }\n private _easeInOutQuad(t: number) {\n return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;\n }\n}\n\ninterface SiType {\n serialize: (obj: T) => string;\n deserialize: (str: string) => T;\n}\n\nexport class SettingItem {\n key: string;\n type: SiType;\n data: T;\n isInitial: boolean;\n onRender: Action | null = null;\n constructor(\n key: string,\n type: \"bool\" | \"str\" | \"json\" | SiType,\n initial: T\n ) {\n this.key = key;\n type = this.type =\n typeof type === \"string\" ? SettingItem.types[type] : type;\n if (!type || !type.serialize || !type.deserialize)\n throw new Error(\"invalid 'type' arugment\");\n this.readFromStorage(initial);\n }\n readFromStorage(initial: T) {\n var str = this.key ? localStorage.getItem(this.key) : null;\n this.isInitial = !str;\n this.set(str ? this.type.deserialize(str) : initial, true);\n }\n render(fn: (obj: T) => void, dontRaiseNow?: boolean) {\n if (!dontRaiseNow) fn(this.data);\n const oldFn = this.onRender;\n const newFn = fn;\n if (oldFn)\n fn = function (x) {\n oldFn(x);\n newFn(x);\n };\n this.onRender = fn;\n return this;\n }\n bindToBtn(btn: HTMLElement, prefix: string[]) {\n if ((this.type as any) !== SettingItem.types.bool)\n throw new Error(\"only for bool type\");\n var span = document.createElement(\"span\");\n btn.insertBefore(span, btn.firstChild);\n this.render(function (x) {\n btn.classList.toggle(\"disabled\", !x);\n prefix = prefix || [\"❌\", \"✅\"];\n span.textContent = prefix[+x];\n });\n var thiz = this;\n btn.addEventListener(\"click\", function () {\n thiz.toggle();\n });\n return this;\n }\n remove() {\n localStorage.removeItem(this.key);\n }\n save() {\n this.isInitial = false;\n localStorage.setItem(this.key, this.type.serialize(this.data));\n }\n set(data: T, dontSave?: boolean) {\n this.data = data;\n this.isInitial = false;\n this.onRender && this.onRender(data);\n if (!dontSave && this.key) this.save();\n }\n get() {\n return this.data;\n }\n toggle() {\n if ((this.type as any) !== SettingItem.types.bool)\n throw new Error(\"only for bool type\");\n this.set(!(this.data as any) as any);\n }\n loop(arr: any[]) {\n var curData = this.data;\n var oldIndex = arr.findIndex(function (x) {\n return x === curData;\n });\n var newData = arr[(oldIndex + 1) % arr.length];\n this.set(newData);\n }\n\n static types = {\n bool: {\n serialize: function (data) {\n return data ? \"true\" : \"false\";\n },\n deserialize: function (str) {\n return str === \"true\" ? true : str === \"false\" ? false : undefined;\n },\n },\n str: {\n serialize: function (x) {\n return x;\n },\n deserialize: function (x) {\n return x;\n },\n },\n json: {\n serialize: function (x) {\n return JSON.stringify(x);\n },\n deserialize: function (x) {\n return JSON.parse(x);\n },\n },\n };\n}\n","import { objectApply, Ref, View } from \"./utils\";\n\nexport * from \"@yuuza/webfx\";\n\nexport class FileSelector extends View {\n onfile: (file: File) => void;\n private domfile = new Ref();\n accept: string = \"*/*\";\n multiple = false;\n constructor(init: Partial) {\n super();\n objectApply(this, init);\n }\n createDom() {\n return {\n tag: \"input\",\n type: \"file\",\n ref: this.domfile,\n style: \"display: none; height: 0;\",\n accept: this.accept,\n multiple: this.multiple,\n };\n }\n postCreateDom() {\n this.domfile.value!.addEventListener(\"change\", (ev) => {\n if (this.domfile.value!.files)\n this.handleFiles(this.domfile.value!.files);\n });\n }\n open() {\n this.domfile.value!.click();\n }\n private handleFiles(files: FileList) {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n console.log(\"[Uploads] drop file\", { name: file.name, size: file.size });\n this.onfile?.(file);\n }\n }\n}\n","import { I18n, i18n, createArrayBuilder, I } from \"@yuuza/webfx\";\nimport data from \"./i18n-data.json\";\n\nexport { I18n, i18n, I };\n\nexport const IA = createArrayBuilder(i18n);\n\ndata.forEach((x) => i18n.add2dArray(x));\n","export const settings = {\n defaultApiBaseUrl: \"api/\",\n apiBaseUrl: \"\",\n debug: true,\n apiDebugDelay: 0,\n showDownloadOptions: true,\n showDiscussion: true,\n showNotes: true,\n\n init() {\n var server = localStorage.getItem(\"mcloud-server\");\n this.apiBaseUrl = server || this.defaultApiBaseUrl;\n },\n};\n","// file: Api.ts\n\nimport { settings } from \"../Settings/Settings\";\nimport { Callbacks, Action, CancelToken, sleepAsync } from \"../Infra/utils\";\nimport { Api } from \"./apidef\";\n\nfunction getAppBaseUrl() {\n var href = window.location.href;\n var queryStrStart = href.indexOf(\"?\");\n if (queryStrStart >= 0) return href.substring(0, queryStrStart);\n var hash = href.indexOf(\"#\");\n if (hash >= 0) return href.substring(0, hash);\n return href;\n}\n\nclass API {\n get baseUrl() {\n return settings.apiBaseUrl;\n }\n readonly appBaseUrl = getAppBaseUrl();\n storageUrlBase = \"\";\n debugSleep = settings.debug ? settings.apiDebugDelay : 0;\n defaultAuth: string | null = null;\n\n onTrackInfoChanged = new Callbacks>();\n onTrackDeleted = new Callbacks>();\n\n async _fetch(input: RequestInfo, init?: RequestInit) {\n if (this.debugSleep)\n await sleepAsync(this.debugSleep * (Math.random() + 1));\n return await fetch(input, {\n credentials: \"same-origin\",\n ...init,\n });\n }\n getHeaders(arg?: FetchOptions) {\n var headers = {};\n var auth = arg?.auth ?? this.defaultAuth;\n if (auth) headers[\"Authorization\"] = auth;\n if (arg?.cache != true) headers[\"Cache-Control\"] = \"no-store\";\n return headers;\n }\n async get(path: string, options?: FetchOptions): Promise {\n options = options || {};\n var resp = await this._fetch(this.baseUrl + path, {\n headers: { ...this.getHeaders(options) },\n });\n await this.checkResp(options, resp);\n if (resp.headers.get(\"Content-Type\")?.startsWith(\"application/json\"))\n return await resp.json();\n return resp as T;\n }\n async post(\n arg: { method?: \"POST\" | \"PUT\" | \"DELETE\" } & PostOptions & PostBodyOptions\n ): Promise {\n var body = arg.obj;\n if (arg.mode === undefined)\n arg.mode = body !== undefined ? \"json\" : \"empty\";\n if (arg.mode === \"json\")\n body = body !== undefined ? JSON.stringify(body) : undefined;\n else if (arg.mode === \"raw\") void 0; // noop\n else if (arg.mode === \"empty\") body = null;\n else throw new Error(\"Unknown arg.mode\");\n\n var headers = this.getHeaders(arg);\n if (arg.mode === \"json\") headers[\"Content-Type\"] = \"application/json\";\n\n headers = { ...headers, ...arg.headers };\n\n var resp = await this._fetch(this.baseUrl + arg.path, {\n body: body,\n method: arg.method ?? \"POST\",\n headers: headers,\n });\n await this.checkResp(arg, resp);\n var contentType = resp.headers.get(\"Content-Type\");\n if (contentType && /^application\\/json;?/.test(contentType))\n return await resp.json();\n return null as T;\n }\n put(arg: PostOptions & PostBodyOptions) {\n return this.post({ ...arg, method: \"PUT\" });\n }\n delete(arg: PostOptions) {\n return this.post({ ...arg, method: \"DELETE\" });\n }\n upload(arg: {\n method: \"POST\" | \"PUT\";\n url: string;\n body: any;\n auth?: string;\n contentType?: string;\n cancelToken?: CancelToken;\n onprogerss?: (e: ProgressEvent) => void;\n }) {\n const ct = arg.cancelToken;\n if (ct) {\n var cb = ct.onCancelled.add(function () {\n xhr.abort();\n });\n }\n\n const xhr = new XMLHttpRequest();\n const whenXhrComplete = new Promise((resolve, reject) => {\n xhr.onload = (ev) => resolve();\n xhr.onerror = (ev) => reject(\"XHR error\");\n xhr.onabort = (ev) => reject(\"XHR abort\");\n });\n xhr.upload.onprogress = arg.onprogerss || null;\n\n xhr.open(arg.method, this.processUrl(arg.url));\n\n if (arg.auth) xhr.setRequestHeader(\"Authorization\", arg.auth);\n if (arg.contentType) xhr.setRequestHeader(\"Content-Type\", arg.contentType);\n\n xhr.send(arg.body);\n const complete = (async function (checkStatus?: boolean) {\n try {\n await whenXhrComplete;\n } finally {\n if (ct) {\n ct.onCancelled.remove(cb!);\n ct.throwIfCancelled();\n }\n }\n\n if (checkStatus === undefined || checkStatus)\n if (xhr.status < 200 || xhr.status >= 300)\n throw new Error(\"HTTP status \" + xhr.status);\n return xhr;\n })();\n\n return {\n xhr,\n complete,\n };\n }\n async checkResp(options: { status?: number | false }, resp: Response) {\n if (\n options.status !== false &&\n ((options.status !== undefined && resp.status != options.status) ||\n resp.status >= 400)\n ) {\n if (resp.status === 450) {\n try {\n var resperr = (await resp.json()).error;\n } catch {}\n if (resperr) throw new Error(resperr);\n }\n throw new Error(\"HTTP status \" + resp.status);\n }\n }\n async getListAsync(id: number): Promise {\n return await this.get(\"lists/\" + id);\n }\n async getListIndexAsync(): Promise {\n return await this.get(\"lists/index\");\n }\n async putListAsync(\n list: Api.TrackListPut,\n creating: boolean = false\n ): Promise {\n return await this.post({\n path: \"lists/\" + list.id,\n method: creating ? \"POST\" : \"PUT\",\n obj: list,\n });\n }\n getTrack(id: number) {\n return this.get(\"tracks/\" + id) as Promise;\n }\n getList(id: number) {\n return this.get(\"lists/\" + id) as Promise;\n }\n processUrl(url: T): T {\n if (!url || url.match(\"^(https?:/)?/\")) return url;\n if (this.storageUrlBase && url.startsWith(\"storage/\"))\n return (this.storageUrlBase + url.substring(8)) as T;\n return (this.baseUrl + url) as T;\n }\n}\n\nexport const api = new API();\n\nexport interface PostOptions extends FetchOptions {\n path: string;\n headers?: Record;\n}\n\nexport interface FetchOptions {\n status?: number;\n auth?: string;\n cache?: boolean;\n}\n\nexport type PostBodyOptions =\n | {\n mode?: \"json\" | \"raw\";\n obj: any;\n }\n | {\n mode?: \"empty\";\n obj?: undefined;\n };\n","import { Dialog, Func, Timer, View } from \"../Infra/viewlib\";\nimport { playerCore } from \"./PlayerCore\";\n\nexport const playerFX = new (class PlayerFX {\n ctx: AudioContext;\n source: MediaElementAudioSourceNode;\n analyser: AnalyserNode;\n gainNode: GainNode;\n lastBuffers: Array> = []; // [history blocks (from old to new)][channel][sample index] -> sample value\n get webAudioInited() {\n return !!this.ctx;\n }\n init() {}\n async initWebAudio() {\n if (this.webAudioInited) return;\n console.info(\"[PlayerFX] switching to WebAudio\");\n this.ctx = new AudioContext({ latencyHint: \"playback\" });\n this.source = this.ctx.createMediaElementSource(playerCore.audio);\n chainNodes(this.source, [\n () => {\n this.analyser = this.ctx.createAnalyser();\n this.analyser.fftSize = 8192;\n return this.analyser;\n },\n (this.gainNode = this.ctx.createGain()),\n this.ctx.destination,\n ]);\n\n // iOS background playing fix\n this.ctx.addEventListener(\"statechange\", (e) => {\n console.info(\"[PlayerFX] audio ctx state\", this.ctx.state);\n if (\n this.ctx.state === (\"interrupted\" as any) &&\n playerCore.state === \"playing\"\n ) {\n console.info(\"[PlayerFX] try resuming\");\n this.ctx.resume();\n }\n });\n playerCore.onStateChanged.add(() => {\n if (playerCore.state === \"playing\" || playerCore.state === \"stalled\") {\n this.suspendTimer.tryCancel();\n if (this.ctx.state !== \"running\") {\n this.ctx.resume();\n }\n } else if (\n playerCore.state === \"paused\" &&\n this.ctx.state === \"running\"\n ) {\n this.suspendTimer.timeout(1000); // wait for fading effect\n }\n });\n\n const audioModule = () => {\n //@ts-ignore\n class AudioCollector extends (AudioWorkletProcessor as any) {\n process(inputs, outputs, parameters) {\n this.port.postMessage([...inputs[0]]);\n return true;\n }\n }\n\n //@ts-ignore\n registerProcessor(\"audio-collector\", AudioCollector);\n };\n\n await this.ctx.audioWorklet.addModule(\n URL.createObjectURL(\n new Blob([`(${audioModule.toString()})()`], {\n type: \"application/javascript\",\n }),\n ),\n );\n\n const workletNode = new AudioWorkletNode(this.ctx, \"audio-collector\");\n this.gainNode.connect(workletNode);\n workletNode.port.onmessage = (ev) => {\n this.lastBuffers.push(ev.data);\n if (this.lastBuffers.length > 10) {\n this.lastBuffers.shift();\n }\n };\n }\n suspendTimer = new Timer(() => this.ctx.suspend());\n showUI(ev?: MouseEvent) {\n this.initWebAudio();\n new FXDialog().show(ev);\n }\n})();\n\nconst WIDTH = 800;\nconst HEIGHT = 300;\n\nconst lines = true;\n\nclass FXDialog extends Dialog {\n title = \"WebAudio\";\n canvas = new View({\n tag: \"canvas\",\n height: HEIGHT,\n width: WIDTH,\n });\n constructor() {\n super();\n this.width = \"830px\";\n this.addContent(this.canvas);\n this.overlay.setFlags({ clickThrough: true });\n }\n postCreateDom() {\n super.postCreateDom();\n\n const ctx = this.canvas.dom.getContext(\"2d\")!;\n const imgData = ctx.createImageData(WIDTH, HEIGHT);\n const imgBuffer = imgData.data;\n\n const history: Uint8Array[] = [];\n\n console.info(history);\n\n const update = () => {\n if (!this.shown) return;\n requestAnimationFrame(update);\n const analyzer = playerFX.analyser;\n const freq = new Uint8Array(WIDTH);\n\n analyzer.getByteFrequencyData(freq);\n\n history.unshift(freq);\n if (history.length > HEIGHT) history.pop();\n\n const buffers = playerFX.lastBuffers;\n if (!buffers.length) return;\n const totalSamples = buffers.reduce((a, b) => a + b[0].length, 0);\n\n if (lines) {\n ctx.clearRect(0, 0, WIDTH, HEIGHT);\n for (let ch = 0; ch < 2; ch++) {\n let bufferIndex = 0;\n let sampleIndex = 0;\n ctx.strokeStyle = ch ? \"blue\" : \"red\";\n ctx.beginPath();\n for (let i = 0; i < totalSamples; i++) {\n const sample = buffers[bufferIndex][ch][sampleIndex];\n const x = (i / totalSamples) * WIDTH;\n const y = Math.floor((sample / 2) * HEIGHT + HEIGHT / 2);\n if (!bufferIndex && !sampleIndex) {\n ctx.moveTo(x, y);\n }\n ctx.lineTo(x, y);\n // buf[bufIdx + 3] = 255;\n if (sampleIndex + 1 < buffers[bufferIndex][ch].length) {\n sampleIndex++;\n } else if (bufferIndex + 1 < buffers.length) {\n bufferIndex++;\n sampleIndex = 0;\n } else {\n break;\n }\n }\n ctx.stroke();\n }\n } else {\n const buf = imgBuffer;\n for (let i = 0; i < buf.length; i++) {\n buf[i] = 255;\n }\n for (let ch = 0; ch < 2; ch++) {\n let bufferIndex = 0;\n let sampleIndex = 0;\n for (let x = 0; x < WIDTH; x++) {\n const sample = buffers[bufferIndex][ch][sampleIndex];\n const y = Math.floor((sample / 2) * HEIGHT + HEIGHT / 2);\n const bufIdx = 4 * (x + WIDTH * (HEIGHT - y - 1));\n buf[bufIdx + 1] -= 127;\n buf[bufIdx + (ch ? 0 : 2)] = 0;\n // buf[bufIdx + 3] = 255;\n if (sampleIndex + 1 < buffers[bufferIndex][ch].length) {\n sampleIndex++;\n } else if (bufferIndex + 1 < buffers.length) {\n bufferIndex++;\n sampleIndex = 0;\n } else {\n break;\n }\n }\n }\n\n ctx.putImageData(imgData, 0, 0);\n }\n };\n\n requestAnimationFrame(update);\n }\n}\n\nfunction chainNodes(source: AudioNode, nodes: (AudioNode | Func)[]) {\n let last = source;\n for (let node of nodes) {\n if (typeof node == \"function\") {\n node = node();\n if (!node) continue;\n }\n last.connect(node);\n last = node;\n }\n}\n","// file: PlayerCore.ts\n\nimport { Track } from \"../Track/Track\";\nimport {\n Callbacks,\n Action,\n SettingItem,\n CancelToken,\n Ref,\n isIOS,\n} from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { api } from \"../API/Api\";\nimport { Toast } from \"../Infra/viewlib\";\nimport { Api } from \"../API/apidef\";\nimport { Timer } from \"../Infra/utils\";\nimport { ui } from \"../Infra/UI\";\nimport { playerFX } from \"./PlayerFX\";\n\nexport const playerCore = new (class PlayerCore {\n audio: HTMLAudioElement | HTMLVideoElement;\n track: Track | null = null;\n trackProfile: Api.TrackFile | null = null;\n audioLoaded = false;\n objectUrl: string | null = null;\n onTrackChanged = new Callbacks();\n\n siPlayer = new SettingItem(\"mcloud-player\", \"json\", {\n loopMode: \"list-loop\" as PlayingLoopMode,\n volume: 1,\n preferBitrate: 256,\n loudnessNormalization: true,\n });\n get loopMode() {\n return this.siPlayer.data.loopMode;\n }\n set loopMode(val) {\n this.siPlayer.data.loopMode = val;\n this.siPlayer.save();\n this.onLoopModeChanged.invoke();\n }\n onLoopModeChanged = new Callbacks();\n\n get preferBitrate() {\n return this.siPlayer.data.preferBitrate;\n }\n\n private _state: \"none\" | \"playing\" | \"paused\" | \"stalled\" = \"none\";\n get state() {\n return this._state;\n }\n set state(val) {\n if (val === this._state) return;\n console.info(`[PlayerCore] state '${this._state}' -> '${val}'`);\n this._state = val;\n this.onStateChanged.invoke();\n }\n onStateChanged = new Callbacks();\n onAudioCreated = new Callbacks();\n\n _loadRetryCount = 0;\n _loadRetryTimer = new Timer(() => {\n this.play();\n });\n\n get currentTime() {\n return this.audio?.currentTime;\n }\n set currentTime(val) {\n this.audio.currentTime = val;\n this.onProgressChanged.invoke();\n }\n get duration() {\n if (\n this.audio &&\n this.audioLoaded &&\n this.audio.readyState >= HTMLMediaElement.HAVE_METADATA\n )\n return this.audio.duration;\n else return this.track?.length;\n }\n onProgressChanged = new Callbacks();\n\n get isVideo() {\n return this.track?.type == \"video\";\n }\n\n private _volume = new Ref(1);\n get volume() {\n return this._volume.value!;\n }\n set volume(val) {\n this._volume.value = val;\n }\n onVolumeChanged = new Callbacks();\n\n normalizingGain = new Ref(1);\n effectiveGain = Ref.computed(\n () => Math.pow(this.volume, 1.5) * this.normalizingGain.value!,\n );\n\n volumeByGainNode = false;\n\n get playbackRate() {\n return this.audio.playbackRate;\n }\n\n get isPlaying() {\n return this.audio && !!this.audio.duration && !this.audio.paused;\n }\n get isPaused() {\n return this.audio.paused;\n }\n get canPlay() {\n return this.audio.readyState >= 2;\n }\n init() {\n // migration\n var siLoop = new SettingItem(\"mcloud-loop\", \"str\", null!);\n if (siLoop.data !== null) {\n this.loopMode = siLoop.data;\n siLoop.remove();\n }\n\n this.audio = document.createElement(\"video\");\n this.initAudio();\n\n api.onTrackInfoChanged.add((newTrack) => {\n if (newTrack.id && newTrack.id === this.track?.id) {\n this.track.infoObj = newTrack;\n }\n });\n }\n initAudio() {\n this.audio.crossOrigin = \"anonymous\";\n this.audio.addEventListener(\"timeupdate\", () => {\n this.onProgressChanged.invoke();\n this.checkPreload();\n });\n this.audio.addEventListener(\"canplay\", () => {\n this._loadRetryCount = 0;\n this.onProgressChanged.invoke();\n });\n this.audio.addEventListener(\"seeking\", () => {\n if (!this.audio.paused) this.state = \"stalled\";\n });\n this.audio.addEventListener(\"stalled\", () => {\n if (!this.audio.paused) this.state = \"stalled\";\n });\n this.audio.addEventListener(\"play\", () => {\n this.state = \"stalled\";\n });\n this.audio.addEventListener(\"playing\", () => {\n this.state = \"playing\";\n });\n this.audio.addEventListener(\"pause\", () => {\n this.state = \"paused\";\n });\n this.audio.addEventListener(\"error\", (e) => {\n console.error(\"[PlayerCore] audio error\", e);\n var wasPlaying = this.state !== \"paused\" && this.state !== \"stalled\";\n if (this.track && this.track.url) {\n let msg = I`Player error:` + \"\\n\" + (e.message || I`Unknown error.`);\n if (\n wasPlaying &&\n this.state != \"playing\" &&\n this._loadRetryCount++ < 3\n ) {\n msg += \"\\n\" + I`Retry after ${3} sec...`;\n this._loadRetryTimer.timeout(3000);\n }\n Toast.show(msg, 3000);\n if (!ui.isVisible() && ui.notification.isEnabledFor(\"nowPlaying\")) {\n ui.notification.show(I`Music Cloud`, {\n body: msg,\n requireInteraction: false,\n });\n }\n }\n });\n this.audio.addEventListener(\"ended\", () => {\n this.next();\n });\n this.audio.addEventListener(\"volumechange\", () =>\n this.onVolumeChanged.invoke(),\n );\n\n // audio.volume doesn't work in iOS\n this.volumeByGainNode = isIOS;\n\n this._volume.onChanged.add((ref) => {\n this.siPlayer.data.volume = ref.value!;\n this.siPlayer.save();\n this.onVolumeChanged.invoke();\n });\n this.effectiveGain.onChanged.add((ref) => {\n if (this.volumeByGainNode) {\n if (playerFX.webAudioInited) {\n playerFX.gainNode.gain.value = ref.value!;\n }\n } else {\n this.audio.volume = ref.value!;\n }\n });\n\n this.volume = this.siPlayer.data.volume;\n this.onAudioCreated.invoke();\n }\n prev() {\n return this.next(-1);\n }\n next(offset?: number) {\n var nextTrack = this.getNextTrack(offset);\n if (nextTrack) this.playTrack(nextTrack, true);\n }\n\n getNextTrack(offset?: number) {\n return this.track?._bind?.list?.getNextTrack(\n this.track,\n this.loopMode,\n offset,\n );\n }\n\n loadUrl(src: Blob | string | null) {\n if (this.objectUrl) {\n URL.revokeObjectURL(this.objectUrl);\n this.objectUrl = null;\n }\n\n this.audioLoaded = !!src;\n if (src) {\n if (src instanceof Blob) {\n src = this.objectUrl = URL.createObjectURL(src);\n }\n this.audio.src = src;\n this.audio.load();\n } else {\n this.audio.pause();\n // this.audio.removeAttribute(\"src\");\n }\n }\n async setTrack(track: Track | null, playNow: boolean | number = false) {\n console.info(\n \"[PlayerCore] set track: \" +\n (track ? `id ${track.id}: ${track.name} - ${track.artist}` : \"(null)\"),\n );\n var oldTrack = this.track;\n this.track = track;\n this._loadRetryTimer.tryCancel();\n var sameTrack =\n oldTrack === track ||\n (track?.url && oldTrack?.url === track?.url) ||\n (track?.blob && track.blob === oldTrack?.blob);\n if (!sameTrack) {\n if (playNow !== false && track) {\n await this.loadTrack(track);\n } else {\n this.loadUrl(null);\n }\n this.currentTime = typeof playNow === \"number\" ? playNow : 0;\n this.state = !track ? \"none\" : playNow !== false ? \"stalled\" : \"paused\";\n }\n this.onTrackChanged.invoke();\n if (playNow !== false && track) await this.playTrack(track);\n }\n async playTrack(track: Track, forceStart?: boolean) {\n if (track !== this.track) {\n await this.setTrack(track, true);\n return;\n }\n if (forceStart) this.audio.currentTime = 0;\n await this.play();\n }\n private _loadct: CancelToken;\n private async loadTrack(track: Track) {\n this._loadct?.cancel();\n var ct = (this._loadct = new CancelToken());\n if (track.blob) {\n this.loadUrl(null); // unload current track before await\n ct.throwIfCancelled();\n this.trackProfile = null;\n this.loadUrl(track.blob);\n } else {\n const file = this.decideFileFromTrack(track);\n let url: string;\n if (file.size == -1) {\n this.loadUrl(null); // unload current track before await\n url = await track.requestFileUrl(file);\n ct.throwIfCancelled();\n } else {\n url = await track.requestFileUrl(file);\n }\n this.trackProfile = file;\n this.loadUrl(api.processUrl(url));\n }\n }\n decideFileFromTrack(track: Track) {\n let cur = { profile: \"\", bitrate: 0, size: track.size } as Api.TrackFile;\n if (track.type == \"video\") {\n cur = track.files![0];\n } else {\n var prefer = this.preferBitrate;\n if (prefer && track.files) {\n track.files.forEach((f) => {\n if (\n !cur.bitrate ||\n Math.abs(cur.bitrate - prefer) > Math.abs(f.bitrate - prefer)\n ) {\n cur = f;\n }\n });\n }\n }\n return cur;\n }\n async play() {\n await this.ensureLoaded();\n if (this.volumeByGainNode && !playerFX.webAudioInited) {\n playerFX.initWebAudio();\n playerFX.gainNode.gain.value = this.effectiveGain.value!;\n }\n try {\n this.audio.play();\n } catch (error) {\n console.error(\"audio.play() error\", error);\n this.state = \"none\";\n }\n }\n async ensureLoaded() {\n if (this.track) {\n await Promise.all([\n this.computeNormalizingGain(),\n !this.audioLoaded && this.loadTrack(this.track!),\n ]);\n }\n }\n async computeNormalizingGain() {\n if (this.siPlayer.data.loudnessNormalization === false) {\n this.normalizingGain.value = 1;\n return;\n }\n const data = await this.track?.getLoudnessMap();\n if (!data || data.length < 10) {\n this.normalizingGain.value = 1;\n return;\n }\n let sum = 0;\n for (let i = 0; i < data.length; i++) {\n sum += data[i];\n }\n const avg = sum / data.length;\n const sorted = data.slice().sort();\n const trackGain = sorted[Math.floor(sorted.length * (90 / 100))];\n const trackDb = Math.log10(trackGain / 128) * 10;\n const targetDb = -7;\n const gain = Math.pow(10, (targetDb - trackDb) / 10);\n console.info(\"[PlayerCore] computed normalizing gain\", this.track?.name, {\n avg,\n trackGain,\n trackDb,\n gain,\n });\n this.normalizingGain.value = Math.min(1, gain);\n }\n pause() {\n this.audio.pause();\n }\n\n preloadedTrack: Track | null = null;\n checkPreload() {\n if (\n this.currentTime &&\n this.duration &&\n this.currentTime >= this.duration - 20\n ) {\n const nextTrack = this.getNextTrack(1);\n if (\n nextTrack &&\n nextTrack !== this.track &&\n nextTrack !== this.preloadedTrack\n ) {\n this.preloadedTrack = nextTrack;\n console.info(`[PlayerCore] preload starting for ${nextTrack.name}`);\n const timeBegin = performance.now();\n nextTrack.preload().then(() => {\n const dur = performance.now() - timeBegin;\n console.info(`[PlayerCore] preload finished in ${dur}ms`);\n });\n }\n }\n }\n})();\n\nexport const playingLoopModes = [\n \"list-seq\",\n \"list-loop\",\n \"list-shuffle\",\n \"track-loop\",\n] as const;\n\nexport type PlayingLoopMode = (typeof playingLoopModes)[number];\n\nif (navigator[\"mediaSession\"]) {\n let mediaSession = navigator[\"mediaSession\"];\n playerCore.onTrackChanged.add(() => {\n try {\n var track = playerCore.track;\n if (!track) return;\n mediaSession.metadata = new MediaMetadata({\n title: track?.name,\n artist: track?.artist,\n artwork: !track?.picurl ? [] : [{ src: api.processUrl(track?.picurl) }],\n });\n } catch {}\n });\n playerCore.onStateChanged.add(() => {\n try {\n mediaSession.playbackState =\n playerCore.state === \"playing\" || playerCore.state === \"stalled\"\n ? \"playing\"\n : playerCore.state === \"none\"\n ? \"none\"\n : \"paused\";\n } catch {}\n });\n mediaSession.setActionHandler(\"play\", () => playerCore.play());\n mediaSession.setActionHandler(\"pause\", () => playerCore.pause());\n mediaSession.setActionHandler(\"previoustrack\", () => playerCore.prev());\n mediaSession.setActionHandler(\"nexttrack\", () => playerCore.next());\n}\n\nwindow.addEventListener(\"beforeunload\", (ev) => {\n if (!playerCore.track || playerCore.audio.paused) return;\n if (window[\"_mcDesktop\"]) return;\n ev.preventDefault();\n return (ev.returnValue = \"The player is running. Are you sure to leave?\");\n});\n","export default {\"version\":\"1.0.14\",\"buildDate\":\"2025-02-22T22:35:20.941Z\",\"commits\":[{\"id\":\"47c544c\",\"date\":\"2025-02-23T06:35:06+08:00\",\"message\":\"fix: iOS\"}]};","import { SettingItem } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { Toast } from \"../Infra/viewlib\";\nimport buildInfo from \"./buildInfo\";\nimport { ui } from \"../Infra/UI\";\n\nexport const appVersion = new (class {\n siVersion = new SettingItem(\"mcloud-ver\", \"str\", \"\");\n currentVersion = buildInfo.version;\n currentDate = buildInfo.buildDate;\n prevDate = \"\";\n versionChanged = false;\n init() {\n this.prevDate = this.siVersion.data;\n this.versionChanged = !!this.prevDate && this.prevDate != this.currentDate;\n this.siVersion.set(this.currentDate);\n }\n showUpdatedToast() {\n if (this.versionChanged) {\n const [prevDate, currentDate] = [this.prevDate, this.currentDate].map(\n (x) =>\n x ? new Date(x).toLocaleString(ui.lang.curLang) : I`[Unknown version]`\n );\n Toast.show(I`Client updated:\\n${prevDate}\\n =>\\n${currentDate}`, 5000);\n }\n }\n})();\n\nappVersion.init();\n","import { ObjectInit, objectInit, Ref, sleepAsync } from \"@yuuza/webfx\";\nimport { api } from \"./Api\";\n// import { msgcli } from \"./MessageClient\";\n\nconst TypedArray = Object.getPrototypeOf(Uint8Array);\n\nexport type UserStoreValueType = \"json\" | \"text\" | \"raw\";\n\nclass UserStore {\n async get(\n key: string,\n type?: \"json\",\n ): Promise;\n async get(\n key: string,\n type: \"text\",\n ): Promise;\n async get(\n key: string,\n type: \"raw\",\n ): Promise;\n async get(\n key: string,\n type: UserStoreValueType,\n ): Promise;\n\n async get(\n key: string,\n type: UserStoreValueType = \"json\",\n ): Promise {\n var resp = await api._fetch(`${api.baseUrl}my/store/${key}`, {\n headers: api.getHeaders(),\n });\n if (!resp.ok) return null;\n let value;\n if (type === \"json\") {\n value = await resp.json();\n } else if (type === \"text\") {\n value = await resp.text();\n } else if (type === \"raw\") {\n value = await resp.arrayBuffer();\n } else {\n throw new Error(\"unknown type\");\n }\n const fields = new URLSearchParams(\n resp.headers.get(\"x-mcloud-store-fields\")!,\n );\n const visibility = +fields.get(\"visibility\")!;\n const revision = +fields.get(\"revision\")!;\n return { value, visibility, revision };\n }\n\n async set(\n key: string,\n data: { value: any } & Partial,\n type?: UserStoreValueType,\n ): Promise {\n let { value } = data;\n if (\n !type &&\n !(\n value instanceof ArrayBuffer ||\n value instanceof TypedArray ||\n value instanceof Blob\n )\n ) {\n type = \"json\";\n }\n if (type === \"json\") {\n value = JSON.stringify(value);\n }\n const headers = api.getHeaders();\n if (data.revision != null || data.visibility != null) {\n const fields = new URLSearchParams();\n if (data.visibility != null) {\n fields.set(\"visibility\", \"\" + data.visibility);\n }\n if (data.revision != null) fields.set(\"revision\", \"\" + data.revision);\n headers[\"x-mcloud-store-fields\"] = fields.toString();\n }\n var resp = await api._fetch(`${api.baseUrl}my/store/${key}`, {\n method: \"PUT\",\n headers,\n body: value,\n });\n api.checkResp({}, resp);\n }\n\n async delete(key: string): Promise {\n var resp = await api._fetch(`${api.baseUrl}my/store/${key}`, {\n method: \"DELETE\",\n headers: api.getHeaders(),\n });\n api.checkResp({}, resp);\n }\n}\n\nexport const userStore = new UserStore();\n\nexport interface UserStoreFields {\n revision?: number;\n visibility?: number;\n}\n\nenum ChangeReason {\n Init,\n LocalSet,\n RemoteSet,\n}\n\nexport class UserStoreItem extends Ref implements UserStoreFields {\n key: string = undefined!;\n type: UserStoreValueType = \"json\";\n revision: number = 0;\n visibility: number = undefined!;\n remoteChangeReason: ChangeReason = ChangeReason.Init;\n remote = new Ref();\n fetched = false;\n\n private _putInProgress: Promise | null = null;\n private _putPending: Promise | null = null;\n\n constructor(init?: ObjectInit>) {\n super();\n objectInit(this, init);\n }\n\n async fetch() {\n const result = await userStore.get(this.key, this.type);\n if (result) {\n Object.assign(this, result);\n this.remote.value = result.value;\n }\n this.fetched = true;\n }\n\n async get() {\n if (!this.fetched) await this.fetch();\n return this.value!;\n }\n\n put() {\n if (this._putPending) return this._putPending;\n let pendingTask: Promise;\n pendingTask = (async () => {\n if (this._putInProgress) {\n this._putPending = pendingTask!;\n try {\n await this._putInProgress;\n } catch (error) {}\n this._putPending = null;\n }\n const putTask = (this._putInProgress = (async () => {\n const value = this.value; // can be changed during await\n await userStore.set(this.key, this, this.type);\n this.revision++;\n this.remoteChangeReason = ChangeReason.LocalSet;\n this.remote.value = value;\n this._putInProgress = null;\n })());\n await putTask;\n })();\n return pendingTask;\n }\n\n async concurrencyAwareUpdate(effect: (oldValue: T) => Promise | T) {\n if (!this.fetched) await this.fetch();\n let retries = 0;\n while (true) {\n this.value = await effect(this.value!);\n try {\n await this.put();\n } catch (error) {\n if (error.message == \"concurrency_error\") {\n retries++;\n if (retries == 5) {\n throw new Error(`Update failed after ${retries} retries`);\n }\n if (retries > 1) {\n await sleepAsync(500 + Math.random() * 2500);\n }\n console.info(`[UserStore] update retries=${retries} for ${this.key}`);\n await this.fetch();\n continue;\n } else {\n throw error;\n }\n }\n break;\n }\n }\n\n watchRemote() {\n // msgcli.listenEvent(\n // `store-changed-${this.key}`,\n // ({ key, value, revision }) => {\n // if (revision !== this.revision) {\n // this.value = value;\n // this.revision = revision;\n // this.remoteChangeReason = ChangeReason.RemoteSet;\n // this.remote.value = value;\n // }\n // },\n // );\n }\n}\n","let bytes: Uint8Array | null = null;\r\n\r\nexport function nanoid(size = 21) {\r\n let id = \"\";\r\n if (!bytes || bytes.length != size) {\r\n bytes = new Uint8Array(size);\r\n }\r\n crypto.getRandomValues(bytes);\r\n while (size--) {\r\n let byte = bytes[size] & 63;\r\n if (byte < 36) {\r\n id += byte.toString(36);\r\n } else if (byte < 62) {\r\n id += (byte - 26).toString(36).toUpperCase();\r\n } else if (byte < 63) {\r\n id += \"_\";\r\n } else {\r\n id += \"-\";\r\n }\r\n }\r\n return id;\r\n}\r\n","import { Action, buildDOM, I, Semaphore, sleepAsync, Toast } from \"@yuuza/webfx\";\nimport { UserStoreItem } from \"../API/UserStore\";\nimport { user, userStore } from \"../main\";\nimport { nanoid } from \"../Infra/nanoid\";\n\nexport interface PluginInfo {\n name: string;\n description: string;\n website: string;\n version: string;\n settings?: Action;\n}\n\nexport interface PluginListItem {\n url: string;\n name: string;\n description: string;\n enabled: boolean;\n}\n\nexport const plugins = new (class Plugins {\n private userPluginList = new UserStoreItem({\n key: \"plugins\",\n value: { plugins: [] as PluginListItem[] },\n revision: 0,\n });\n private loadedPlugin = new Map();\n private promiseLoadingPlugins: Promise | null = null;\n\n init() {\n this.promiseLoadingPlugins = user\n .waitLogin()\n .then(() => this.loadUserPlguins());\n }\n\n async waitPluginsLoading() {\n await this.promiseLoadingPlugins;\n }\n\n async getUserPlugins() {\n return (await this.userPluginList.get()).plugins;\n }\n\n getLoadedPlugins() {\n return this.loadedPlugin;\n }\n\n async loadUserPlguins() {\n const promises: Promise[] = [];\n for (const plugin of await this.getUserPlugins()) {\n if (plugin.enabled) {\n let loaded = false;\n const loadingTask = this.loadPlugin(plugin.url).finally(() => {\n loaded = true;\n });\n promises.push(loadingTask);\n Promise.race([sleepAsync(5000), loadingTask]).then(() => {\n if (!loaded) {\n const toast = Toast.show(I`Plugin \"${plugin.name}\" loading...`);\n loadingTask.finally(() => toast.close());\n }\n });\n }\n }\n await Promise.allSettled(promises);\n }\n\n async addUserPlugin(url: string) {\n const info = await this.loadPlugin(url);\n await this.userPluginList.concurrencyAwareUpdate((value) => {\n return {\n ...value,\n plugins: [\n ...value.plugins,\n {\n name: info.name,\n url,\n description: info.description,\n enabled: true,\n },\n ],\n };\n });\n }\n\n async removeUserPlugin(url: string) {\n await this.userPluginList.concurrencyAwareUpdate((value) => {\n return {\n ...value,\n plugins: value.plugins.filter((x) => x.url != url),\n };\n });\n const { type, key } = this.parsePluginURL(url);\n if (type === \"user-store\") {\n await this.deletePluginCode(key);\n }\n }\n\n async toggleUserPlugin(url: string, enabled: boolean) {\n await this.userPluginList.concurrencyAwareUpdate((value) => {\n return {\n ...value,\n plugins: value.plugins.map((x) =>\n x.url == url ? { ...x, enabled } : x,\n ),\n };\n });\n if (this.loadedPlugin.has(url)) {\n this.loadPlugin(url);\n }\n }\n\n parsePluginURL(url: string) {\n if (url.startsWith(\"user-store:\")) {\n return {\n type: \"user-store\" as const,\n key: url.substring(\"user-store:\".length),\n };\n } else {\n return { type: \"url\" as const, url };\n }\n }\n\n async loadPlugin(url: string) {\n const { type, key } = this.parsePluginURL(url);\n if (type === \"user-store\") {\n return await this.loadPluginFromUserStore(key);\n } else {\n return await this.loadPluginFromURL(url);\n }\n }\n\n private _currentRegisterCallback: null | ((info: PluginInfo) => void) = null;\n private _loadingLock = new Semaphore({ maxCount: 1 });\n\n // Load \"https://\" script\n async loadPluginFromURL(url: string) {\n // Prefetch the script before waiting for the lock\n try {\n await fetch(url);\n } catch (error) {\n // Network/CORS error\n }\n\n await this._loadingLock.enter();\n\n let info: PluginInfo = null!;\n this._currentRegisterCallback = (_info) => {\n info = _info;\n };\n\n try {\n await new Promise((res, rej) => {\n document.body.appendChild(\n buildDOM({\n tag: \"script\",\n src: url,\n onerror: (error) => {\n console.error(\"loading plugin script\", error);\n rej(error);\n },\n onload: () => {\n res();\n },\n }),\n );\n });\n } finally {\n this._currentRegisterCallback = null;\n this._loadingLock.exit();\n }\n\n this._afterPluginLoad(url, info);\n\n return info;\n }\n\n getUserStorePluginKey(key: string) {\n return \"plugins.\" + key;\n }\n\n getPluginCodeItem(key: string) {\n return new UserStoreItem({\n key: this.getUserStorePluginKey(key),\n type: \"text\",\n });\n }\n\n async setPluginCode(key: string, code: string) {\n await userStore.set(\n this.getUserStorePluginKey(key),\n { value: code },\n \"text\",\n );\n }\n\n async addPluginCode(code: string) {\n const key = nanoid();\n await this.setPluginCode(key, code);\n await this.addUserPlugin(\"user-store:\" + key);\n }\n\n async deletePluginCode(key: string) {\n await userStore.delete(this.getUserStorePluginKey(key));\n }\n\n // Load \"user-store:\" script\n async loadPluginFromUserStore(key: string) {\n const storeKey = this.getUserStorePluginKey(key);\n const keyValue = await userStore.get(storeKey, \"text\");\n if (!keyValue) throw new Error(\"userStore key not found: \" + storeKey);\n\n // It might be running between \"before\"/\"plugin\"/\"after\" scripts,\n // so we save the current callback and restore it later.\n const oldCallback = this._currentRegisterCallback;\n\n let info: PluginInfo = null!;\n this._currentRegisterCallback = (_info) => {\n info = _info;\n };\n\n try {\n (0, eval)(keyValue.value);\n } finally {\n this._currentRegisterCallback = oldCallback;\n }\n\n this._afterPluginLoad(\"user-store:\" + key, info);\n\n return info;\n }\n\n private _afterPluginLoad(url: string, info: PluginInfo | null) {\n if (!info) {\n throw new Error(\"registerPlugin is not called.\");\n }\n console.info(`Plugin loaded (${info.name} ${info.version}) from ${url}`);\n this.loadedPlugin.set(url, info);\n }\n\n /** Plugin must call this method when it is running. */\n registerPlugin(info: PluginInfo) {\n if (!this._currentRegisterCallback) {\n throw new Error(\n \"Currently no plugin loading task (registerPlugin must be\" +\n \" call during the script execution, usually in top level).\",\n );\n }\n this._currentRegisterCallback(info);\n this._currentRegisterCallback = null;\n }\n})();\n","import {\n Action,\n BuildDomExpr,\n ButtonView,\n Callbacks,\n Dialog,\n I,\n InputView,\n ListView,\n ListViewItem,\n MessageBox,\n TextBtn,\n} from \"@yuuza/webfx\";\nimport { PluginListItem, plugins } from \"./plugins\";\nimport { UserStoreItem } from \"../API/UserStore\";\n\nexport class PluginsUI extends Dialog {\n pluginListView = new ListView({ tag: \"div.plugin-list\" });\n\n constructor() {\n super();\n this.title = I`Plugins`;\n this.width = \"500px\";\n\n const addUrl = new ButtonView({\n text: I`Add plugin by URL`,\n onActive: (ev) => {\n const dialog = new AddByUrlDialog();\n dialog.onSubmit.add(this.fetchList);\n dialog.show(ev);\n },\n });\n const addCode = new ButtonView({\n text: I`Add plugin by code`,\n onActive: (ev) => {\n const dialog = new PluginCodeDialog(\"add\");\n dialog.onSubmit.add(this.fetchList);\n dialog.show(ev);\n },\n });\n this.addContent({\n tag: \"div.add-plugins\",\n child: [\n addUrl,\n addCode,\n ],\n });\n\n this.addContent(this.pluginListView);\n this.fetchList();\n }\n\n private _firstFetch = true;\n\n fetchList = () => {\n plugins.getUserPlugins().then((list) => {\n // Move enabled plugins to the top, but prevent moving them after changing\n // the plugin state from the UI here.\n if (this._firstFetch) {\n this._firstFetch = false;\n // NOTE: it changes the internal array in `plugins.userPluginList`\n // intentionally, because we want to keep this sort when putting the\n // plugin list.\n list.sort((a, b) => +b.enabled - +a.enabled);\n }\n const loadedPlugins = plugins.getLoadedPlugins();\n this.pluginListView.removeAll();\n for (const plugin of list) {\n const item = new PluginListViewItem();\n const loadedInfo = loadedPlugins.get(plugin.url);\n item.data = { ...plugin, loaded: !!loadedInfo, settings: loadedInfo?.settings };\n item.onChange.add(this.fetchList);\n this.pluginListView.add(item);\n }\n });\n };\n}\n\nclass AddByUrlDialog extends Dialog {\n onSubmit = new Callbacks();\n\n constructor() {\n super();\n this.title = I`Add plugin by URL`;\n this.width = \"600px\";\n const urlInput = new InputView({ placeholder: I`Plugin URL` });\n const btn = new TextBtn({\n text: I`Add`,\n right: true,\n onActive: async () => {\n if (urlInput.value) {\n btn.updateWith({ clickable: false });\n await plugins.addUserPlugin(urlInput.value);\n this.onSubmit.invoke();\n this.close();\n }\n },\n });\n this.addBtn(btn);\n this.addContent(urlInput);\n }\n}\n\nclass PluginCodeDialog extends Dialog {\n onSubmit = new Callbacks();\n\n constructor(mode: \"add\" | \"edit\", storeItem?: UserStoreItem) {\n super();\n if (mode === \"add\") {\n this.title = I`Add plugin by code`;\n } else {\n this.title = I`Edit plugin code`;\n }\n this.width = \"600px\";\n const defaultCode = `(function (mcloud) {\n mcloud.plugins.registerPlugin({\n name: \"Hello World\",\n description: \"Example Plugin\",\n version: \"1.0.0\",\n website: \"https://github.com/lideming/MusicCloud-example-plugins\",\n });\n\n mcloud.Toast.show(\"Hello World plugin is running\", 3000);\n})(mcloud);\n`;\n const codeInput = new InputView({\n multiline: true,\n value: storeItem?.value ?? defaultCode,\n });\n codeInput.dom.style.height = \"500px\";\n const btn = new TextBtn({\n text: mode === \"add\" ? I`Add` : I`Save`,\n right: true,\n onActive: async () => {\n if (codeInput.value) {\n btn.updateWith({ clickable: false });\n if (mode === \"add\") {\n await plugins.addPluginCode(codeInput.value);\n } else {\n storeItem!.value = codeInput.value;\n await storeItem!.put();\n }\n this.onSubmit.invoke();\n this.close();\n }\n },\n });\n this.addBtn(btn);\n this.addContent(codeInput);\n }\n}\n\nexport class PluginListViewItem extends ListViewItem {\n data: PluginListItem & { loaded: boolean, settings?: Action };\n onChange = new Callbacks();\n\n createDom(): BuildDomExpr {\n const { type, key } = plugins.parsePluginURL(this.data.url);\n return {\n tag: \"div.plugin-item\",\n child: [\n {\n tag: \"div.plugin-status\",\n update: (dom) => {\n dom.style.color = this.data.loaded || this.data.enabled\n ? \"\"\n : \"var(--color-text-gray)\";\n },\n text: () => \n !this.data.enabled ? I`disabled` :\n this.data.loaded ? I`loaded` :\n I`enabled`,\n },\n new ButtonView({\n text: () => (this.data.enabled ? I`Disable` : I`Enable`),\n type: \"inline\",\n onActive: () => {\n const toEnable = !this.data.enabled;\n plugins\n .toggleUserPlugin(this.data.url, toEnable)\n .then(() => this.onChange.invoke());\n },\n }),\n this.data.settings && new ButtonView({\n text: () => I`Settings`,\n type: \"inline\",\n onActive: () => {\n this.data.settings!();\n },\n }),\n type === \"user-store\" && new ButtonView({\n text: () => I`Edit`,\n type: \"inline\",\n onActive: async (ev) => {\n const item = plugins.getPluginCodeItem(key);\n await item.get();\n const dialog = new PluginCodeDialog(\"edit\", item);\n dialog.onSubmit.add(() => this.onChange.invoke());\n dialog.show(ev);\n },\n }),\n new ButtonView({\n text: () => I`Remove`,\n type: \"inline\",\n onActive: () => {\n new MessageBox()\n .setTitle(I`Warning`)\n .addText(\n I`Are you sure to remove plugin \"${this.data.name}\"?`,\n )\n .addResultBtns([\"cancel\", \"ok\"])\n .allowCloseWithResult(\"cancel\")\n .showAndWaitResult()\n .then((r) => {\n if (r !== \"ok\") return;\n plugins\n .removeUserPlugin(this.data.url)\n .then(() => this.onChange.invoke());\n });\n },\n }),\n { tag: \"div.plugin-name\", text: () => this.data.name },\n { tag: \"div.plugin-description\", text: () => this.data.description },\n { tag: \"div.plugin-url\", text: () => this.data.url },\n ].filter(Boolean),\n };\n }\n}\n","import { ButtonView, Dialog, LabeledInput, View } from \"../Infra/viewlib\";\nimport { I, i18n, IA } from \"../I18n/I18n\";\nimport { ui } from \"../Infra/UI\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { jsx } from \"../Infra/utils\";\nimport { appVersion } from \"./AppVersion\";\nimport buildInfo from \"./buildInfo\";\nimport { playerFX } from \"../Player/PlayerFX\";\nimport {\n Action,\n BuildDomExpr,\n Callbacks,\n ContainerView,\n ItemActiveHelper,\n TextBtn,\n TextView,\n} from \"@yuuza/webfx\";\nimport { settings } from \"./Settings\";\nimport { api } from \"../API/Api\";\nimport { PluginsUI } from \"../Plugins/pluginsUI\";\n\nexport const settingsUI = new (class {\n dialog: SettingsDialog;\n openUI(ev?: MouseEvent) {\n if (!this.dialog) this.dialog = new SettingsDialog();\n this.dialog.center();\n this.dialog.show(ev);\n }\n})();\n\nconst bitrates = [128, 256, 0];\n\nfunction getThemeAndStyle() {\n let [theme, style] = ui.theme.current.split(\"-\");\n style = style ? \"-\" + style : \"\";\n return { theme, style };\n}\n\nfunction setThemeAndStyle(options: { theme?: string; style?: string }) {\n const current = getThemeAndStyle();\n const theme = options.theme ?? current.theme;\n const style = options.style ?? current.style;\n ui.theme.set(`${theme}${style}` as any);\n}\n\nclass RadioContainer extends ContainerView {\n currentValue: any = null;\n currentActive = new ItemActiveHelper({\n funcSetActive: (item, val) => {\n if (val) item.select();\n else item.unselect();\n },\n });\n onCurrentChange = new Callbacks>();\n setCurrent(current: RadioOption) {\n this.currentActive.set(current);\n this.onCurrentChange.invoke(current);\n }\n protected createDom(): BuildDomExpr {\n return
;\n }\n protected postCreateDom(): void {\n super.postCreateDom();\n this.dom.addEventListener(\"keydown\", (ev) => {\n if (ev.code === \"ArrowLeft\" || ev.code === \"ArrowRight\") {\n const next = this.childViews[\n (this.childViews.length +\n (this.currentActive.current?._position ?? 0) +\n (ev.code === \"ArrowRight\" ? 1 : -1)) %\n this.childViews.length\n ] as RadioOption;\n this.setCurrent(next);\n }\n });\n }\n addView(view: RadioOption, pos?: number) {\n super.addView(view, pos);\n if (this.currentValue !== null && view.value === this.currentValue) {\n this.setCurrent(view);\n }\n }\n}\n\nclass RadioOption extends TextView {\n protected createDom(): BuildDomExpr {\n return
this.select()}>
;\n }\n value: any = null;\n select() {\n const parent = this.parentView as RadioContainer;\n if (parent.currentActive.current !== this) {\n parent.setCurrent(this);\n }\n this.toggleClass(\"selected\", true);\n }\n unselect() {\n this.toggleClass(\"selected\", false);\n }\n}\n\nclass SettingItem extends View {\n label: () => string;\n protected createDom(): BuildDomExpr {\n return (\n
\n {this.label}\n
\n );\n }\n}\n\nclass SettingsDialog extends Dialog {\n inputServer = new LabeledInput();\n btnNotification = new ButtonView({ type: \"big\" });\n\n constructor() {\n super();\n const { theme, style } = getThemeAndStyle();\n this.addContent(\n I`UI color:`}>\n {\n setThemeAndStyle({ theme: option.value });\n }}\n >\n {ui.theme.colors.map((option) => (\n \n {() => i18n.get(\"colortheme_\" + option)}\n \n ))}\n \n ,\n );\n\n this.addContent(\n I`UI style:`}>\n {\n setThemeAndStyle({ style: option.value });\n }}\n >\n {ui.theme.styles.map((option) => (\n \n {() => i18n.get(\"styletheme_\" + option)}\n \n ))}\n \n ,\n );\n\n this.addContent(\n I`Language:`}>\n {\n ui.lang.siLang.set(option.value);\n }}\n >\n {[...ui.lang.availableLangs, \"\"].map((option) => (\n \n {() =>\n option ? i18n.get2(\"English\", [], option) : I`language_auto`\n }\n \n ))}\n \n ,\n );\n\n this.addContent(\n I`Preferred bitrate:`}>\n {\n playerCore.siPlayer.data.preferBitrate = option.value;\n playerCore.siPlayer.save();\n }}\n >\n {bitrates.map((option) => (\n \n {() => (option ? `${option}k` : I`bitrate_original`)}\n \n ))}\n \n ,\n );\n\n this.addContent(\n I`Audio normalization:`}>\n {\n playerCore.siPlayer.data.loudnessNormalization = option.value;\n playerCore.siPlayer.save();\n playerCore.computeNormalizingGain();\n }}\n >\n {[false, true].map((option) => (\n \n {() => (option ? I`enabled` : I`disabled`)}\n \n ))}\n \n ,\n );\n\n this.addContent(\n I`Notification:`}>\n {\n ui.notification.setEnable(option.value);\n }}\n >\n {[false, true].map((option) => (\n \n {() => (option ? I`enabled` : I`disabled`)}\n \n ))}\n \n ,\n );\n\n this.addContent(this.inputServer);\n this.inputServer.value = localStorage.getItem(\"mcloud-server\") || \"\";\n this.inputServer.dominput.placeholder = settings.defaultApiBaseUrl;\n this.inputServer.dominput.addEventListener(\"change\", (e) => {\n localStorage.setItem(\"mcloud-server\", this.inputServer.value);\n settings.apiBaseUrl = this.inputServer.value;\n });\n\n this.addContent(\n new ButtonView({\n text: () => I`Plugins`,\n type: \"big\",\n onActive: (ev) => {\n new PluginsUI().show(ev);\n },\n }),\n );\n\n const devFeatures = new View(\n (\n
\n {\n playerFX.showUI(e);\n }}\n >\n Test: Player FX\n \n
\n ),\n );\n devFeatures.hidden = true;\n let devClickCount = 0;\n this.addContent(devFeatures);\n\n this.addContent(\n
\n {\n if (++devClickCount == 5) {\n devFeatures.hidden = false;\n }\n }}\n >\n {\"MusicCloud \" + appVersion.currentVersion}\n
\n {\n new AboutDialog().show(ev);\n this.close();\n }}\n >\n {() => I`About`}\n \n ,\n );\n }\n\n show(ev?: MouseEvent): void {\n this.inputServer.hidden = !!api.defaultAuth;\n super.show(ev);\n }\n\n updateDom() {\n this.title = I`Settings`;\n this.btnClose.updateWith({ text: I`Close` });\n super.updateDom();\n this.inputServer.updateWith({ label: I`Custom server URL` });\n this.btnNotification.text = ui.notification.config.enabled\n ? I`Disable notification`\n : I`Enable notification`;\n }\n}\n\nclass AboutDialog extends Dialog {\n title = I`About`;\n\n constructor() {\n super();\n this.width = \"500px\";\n this.addContent(\n new View(\n (\n
\n

{I`MusicCloud` + \" \" + appVersion.currentVersion}

\n

\n {appVersion.currentDate\n ? I`Build Date` +\n \": \" +\n new Date(appVersion.currentDate).toLocaleString(\n ui.lang.curLang,\n )\n : \"\"}\n

\n

\n {IA`This project is ${(\n \n {() => I`open-sourced`}\n \n )} under MIT license.`}\n

\n

\n {IA`This project is based on ${(\n \n webfx\n \n )}.`}\n

\n

{I`Recent changes:`}

\n {this.createCommitsTable()}\n
\n ),\n ),\n );\n }\n\n private createCommitsTable() {\n let loading = false;\n let lastSha = \"\";\n let allLoaded = false;\n\n const table = new View(\n (\n \n \n \n \n \n
IdMessage
\n ),\n );\n const addCommit = (commit) => {\n table.addView(\n new View(\n (\n \n \n \n {commit.id}\n \n \n {commit.message}\n \n ),\n ),\n );\n lastSha = commit.id;\n };\n for (const commit of buildInfo.commits) {\n addCommit(commit);\n }\n const loadMore = async () => {\n loading = true;\n const resp = await fetch(\n `https://api.github.com/repos/lideming/musiccloud/commits?per_page=100&sha=${lastSha}`,\n );\n const json = await resp.json();\n for (const item of json) {\n if (item.sha.startsWith(lastSha)) continue;\n addCommit({\n id: (item.sha as string).slice(0, 7),\n message: item.commit.message,\n });\n }\n if (json.at(-1).parents.length === 0) {\n allLoaded = true;\n }\n loading = false;\n checkToLoadMore();\n };\n const checkToLoadMore = () => {\n const { dom } = scrollBox;\n if (dom.scrollTop / (dom.scrollHeight - dom.clientHeight) > 0.7) {\n if (!loading && !allLoaded) {\n loadMore();\n }\n }\n };\n loadMore();\n const scrollBox = new View(\n (\n \n {table}\n \n ),\n );\n return scrollBox;\n }\n}\n","// file: ui-views.ts\nimport {\n ListViewItem,\n TextView,\n View,\n EditableHelper,\n ContainerView,\n InputView,\n MenuItem,\n ObjectInit,\n numLimit,\n objectInit,\n toggleClass,\n ListView,\n FuncOrVal,\n} from \"./viewlib\";\nimport {\n BuildDomExpr,\n Func,\n EventRegistrations,\n Action,\n Ref,\n jsx,\n} from \"./utils\";\nimport { I } from \"../I18n/I18n\";\nimport svgSettings from \"../../resources/settings-24px.svg\";\nimport { settingsUI } from \"../Settings/SettingsUI\";\nimport { ui } from \"./UI\";\nimport { fadeout, FadeoutResult } from \"@yuuza/webfx\";\n\nexport class MainContainer extends View {\n sidebar = new Sidebar();\n sidebarToggle = new SidebarToggle();\n contentOuter = new View(
);\n createDom() {\n return (\n
\n {this.sidebar}\n {this.contentOuter}\n {this.sidebarToggle}\n
\n );\n }\n}\n\nexport class Sidebar extends View {\n header = new View(\n (\n
\n {new View(
)}\n \n
\n )\n );\n features = new ListView(
);\n list = new View(
);\n createDom() {\n return (\n \n );\n }\n}\n\nexport class SidebarItem extends ListViewItem {\n _text: FuncOrVal = \"\";\n get text() {\n return getFuncVal(this._text);\n }\n set text(val: FuncOrVal) {\n this._text = val;\n }\n contentView: ContentView | null = null;\n constructor(init?: ObjectInit) {\n super();\n objectInit(this, init);\n }\n protected createDom(): BuildDomExpr {\n return {\n tag: \"li.item.no-selection\",\n tabIndex: 0,\n text: () => getFuncVal(this.text),\n };\n }\n bindContentView(viewFunc: Func) {\n // implement in UI.ts\n return this;\n }\n}\n\nexport class SettingsBtn extends View {\n createDom() {\n return (\n
\n \n
\n );\n }\n postCreateDom() {\n super.postCreateDom();\n this.onActive.add((e) => {\n settingsUI.openUI(e);\n });\n }\n}\n\nexport class ContentView extends View {\n private _isVisible = false;\n public get isVisible() {\n return this._isVisible;\n }\n\n _lastRenderedLanguage = \"\";\n\n postCreateDom() {\n super.postCreateDom();\n this.toggleClass(\"contentview\", true);\n }\n onShow() {\n this._isVisible = true;\n if (this.domCreated && this._lastRenderedLanguage != ui.lang.curLang) {\n this.updateAll();\n }\n }\n onDomInserted() {}\n onShowing() {}\n updateDom() {\n super.updateDom();\n this._lastRenderedLanguage = ui.lang.curLang;\n }\n onHiding() {}\n onRemove() {\n this._isVisible = false;\n this._shownEvents?.removeAll();\n }\n onDomRemoved() {}\n onSidebarItemReactived() {}\n\n fadeIn() {\n this._fadeout?.cancel();\n this.onShowing();\n }\n\n _fadeout: FadeoutResult | null = null;\n fadeOut() {\n this.onHiding();\n this._fadeout = fadeout(this.dom, { remove: false }).onFinished(() => {\n this.onRemove();\n this.removeFromParent();\n this.onDomRemoved();\n });\n }\n\n _shownEvents: EventRegistrations | null = null;\n get shownEvents() {\n return this._shownEvents\n ? this._shownEvents\n : (this._shownEvents = new EventRegistrations());\n }\n}\n\nexport class ContentHeader extends View {\n catalog: FuncOrVal;\n title: FuncOrVal;\n titleEditable = false;\n editHelper: EditableHelper;\n actions = new ContainerView({ tag: \"div.actions\" });\n scrollbox: HTMLElement | null = null;\n scrollboxScrollHandler: Action | null = null;\n onTitleEdit: (title: string) => void;\n constructor(init?: ObjectInit) {\n super();\n if (init) objectInit(this, init);\n this.titleView.onActive.add(async () => {\n if (!this.titleEditable) return;\n this.editHelper =\n this.editHelper || new EditableHelper(this.titleView.dom);\n if (this.editHelper.editing) return;\n var newName = await this.editHelper.startEditAsync();\n if (newName !== this.editHelper.beforeEdit && newName != \"\") {\n this.onTitleEdit(newName);\n }\n this.updateDom();\n });\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"div.content-header\",\n child: [this.titlebar],\n };\n }\n bindScrollBox(scrollbox: HTMLElement) {\n if (this.scrollbox) {\n this.scrollbox.removeEventListener(\n \"scroll\",\n this.scrollboxScrollHandler!\n );\n this.scrollboxScrollHandler = null;\n }\n this.scrollbox = scrollbox;\n scrollbox?.addEventListener(\n \"scroll\",\n (this.scrollboxScrollHandler = (ev) => {\n if (ev.eventPhase == Event.AT_TARGET) {\n this.onScrollboxScroll();\n }\n }),\n { passive: true }\n );\n }\n onScrollboxScroll() {\n setScrollableShadow(this.dom, this.scrollbox?.scrollTop ?? 0);\n }\n titleView = new View({\n tag: \"span.title.no-selection\",\n text: () => getFuncVal(this.title),\n update: (dom) => {\n toggleClass(dom, \"editable\", !!this.titleEditable);\n if (this.titleEditable) dom.title = I`Click to edit`;\n else dom.removeAttribute(\"title\");\n dom.tabIndex = this.titleEditable ? 0 : -1;\n },\n });\n titlebar = new View({\n tag: \"div.titlebar.clearfix\",\n child: [\n {\n tag: \"span.catalog.no-selection\",\n text: () => getFuncVal(this.catalog),\n hidden: () => !this.catalog,\n },\n this.titleView,\n this.actions,\n ],\n });\n\n updateDom() {\n super.updateDom();\n this.titlebar.updateDom();\n this.titleView.updateDom();\n }\n}\n\nfunction getFuncVal(val: FuncOrVal) {\n return typeof val == \"function\" ? (val as any)() : val;\n}\n\nexport class ActionBtn extends TextView {\n get active() {\n return this.dom.classList.contains(\"active\");\n }\n set active(val) {\n this.toggleClass(\"active\", val);\n }\n constructor(init?: ObjectInit) {\n super();\n objectInit(this, init);\n }\n createDom(): BuildDomExpr {\n return { tag: \"span.action.clickable.no-selection\", tabIndex: 0 };\n }\n}\n\nexport function setScrollableShadow(dom: HTMLElement, position: number) {\n dom.style.boxShadow = `0 0 ${numLimit(\n Math.log(position) * 2,\n 0,\n 10\n )}px var(--color-light-shadow)`;\n}\n\nexport class CopyMenuItem extends MenuItem {\n textToCopy: string;\n constructor(init: ObjectInit) {\n super(init);\n this.onActive.add(() => {\n const inputView = new InputView();\n this.addView(inputView);\n inputView.value = this.textToCopy;\n (inputView.dom as HTMLInputElement).select();\n document.execCommand(\"copy\");\n this.removeView(inputView);\n });\n }\n}\n\nexport class Icon extends View {\n get icon() {\n return this.dom.innerHTML;\n }\n set icon(val) {\n this.dom.innerHTML = val;\n }\n constructor(init?: ObjectInit) {\n super({ tag: \"span.icon\" });\n objectInit(this, init);\n }\n}\n\nclass SidebarToggle extends View {\n createDom(): BuildDomExpr {\n return {\n tag: \"div.sidebar-toggle.clickable.no-selection\",\n child: {\n tag: \"div.logo\",\n text: \"M\",\n },\n onclick: (ev) => {\n ui.sidebar.toggleHide();\n },\n ondragover: (ev) => {\n ui.sidebar.toggleHide(false);\n },\n };\n }\n}\n","// file: Router.ts\n\nimport { ui } from \"./UI\";\nimport { Callbacks, isIOS } from \"./utils\";\nimport { ContentView, SidebarItem } from \"./ui-views\";\n\nexport interface Route {\n path: string[];\n contentView?: () => ContentView;\n sidebarItem?: () => SidebarItem;\n onNav?: (arg: { path: string[]; remaining: string[] }) => void;\n onLeave?: () => void;\n}\n\nclass FakeHistory {\n pushState(data: any, unused: string, url?: string | URL | null): void {\n this.state = data;\n }\n replaceState(data: any, unused: string, url?: string | URL | null): void {\n this.state = data;\n }\n state = {};\n}\n\nconst history =\n isIOS && window.matchMedia?.(\"(display-mode: standalone)\").matches\n ? new FakeHistory()\n : window.history;\n\nexport const router = new (class {\n routes: Route[] = [];\n current: string[];\n currentStr: string;\n currentIdx = 1;\n wasBacked = false;\n onNavCompleted = new Callbacks<(arg: { path: string[] }) => void>();\n init() {\n window.addEventListener(\"popstate\", (ev) => {\n this.navByLocation(false);\n });\n this.navByLocation(true);\n }\n private navByLocation(replaceState: boolean) {\n var hash = window.location.hash;\n this.nav(hash ? hash.substring(1) : \"\", {\n pushState: replaceState ? \"replace\" : false,\n idx: history.state?.idx,\n });\n }\n addRoute(arg: Route) {\n this.routes.push(arg);\n if (arg.sidebarItem)\n arg.sidebarItem().onActive.add(() => {\n if (arg.contentView && arg.contentView().isVisible) {\n arg.contentView().onSidebarItemReactived();\n return;\n }\n this.nav([...arg.path]);\n });\n }\n nav(\n path: string | string[],\n options?: {\n pushState?: boolean | \"replace\";\n evenIsCurrent?: boolean;\n idx?: number;\n },\n ) {\n if (typeof path === \"string\") path = parsePath(path);\n var strPath = path.map((x) => encodeURIComponent(x)).join(\"/\");\n if (this.currentStr === strPath && !options?.evenIsCurrent) return;\n\n this.current = path;\n this.currentStr = strPath;\n const oldIdx = this.currentIdx;\n this.currentIdx = options?.idx ?? this.currentIdx + 1;\n if (options?.idx || options?.pushState !== false)\n this.wasBacked = this.currentIdx < oldIdx;\n\n if (options?.pushState !== false) {\n const state = { idx: this.currentIdx };\n const url = strPath ? \"#\" + strPath : undefined;\n const args = [state, \"\", url] as const;\n if (options?.pushState == \"replace\") {\n history.replaceState(...args);\n } else {\n history.pushState(...args);\n }\n }\n\n for (const r of this.routes) {\n if (match(path, r)) {\n if (r.contentView) ui.content.setCurrent(r.contentView());\n if (r.sidebarItem) ui.sidebarList.setActive(r.sidebarItem());\n if (r.onNav) r.onNav({ path, remaining: path.slice(r.path.length) });\n break;\n }\n }\n\n this.onNavCompleted.invoke({ path });\n }\n})();\n\nfunction match(path: string[], route: Route) {\n var rp = route.path;\n for (let i = 0; i < rp.length; i++) {\n if (path[i] !== rp[i]) return false;\n }\n return true;\n}\n\nfunction parsePath(path: string): string[] {\n return path.split(\"/\").map((x) => decodeURIComponent(x));\n}\n","// file: Lyrics.ts\n\n/**\n * Parse lyrics\n * @param str String to be parsed as lyrics\n * @returns The parsed `Lyrics` object\n */\nexport function parse(str: string): Lyrics {\n var time = Date.now();\n var r = new Parser(str).parse();\n console.log(\n `[Lyrics] parsed ${str.length} chars in ${Date.now() - time} ms`,\n r\n );\n return r;\n}\n\nclass LookaheadBuffer {\n consumed = 0;\n buf: T[] = [];\n provider: () => T;\n consume() {\n var item = this.peek(0);\n this.buf.shift();\n this.consumed++;\n return item;\n }\n peek(i?: number) {\n if (i === undefined) i = 0;\n while (this.buf.length <= i) {\n this.buf.push(this.provider());\n }\n return this.buf[i];\n }\n}\n\nconst TAGBEGIN = \"[\".charCodeAt(0);\nconst TAGEND = \"]\".charCodeAt(0);\nconst BRACKETBEGIN = \"{\".charCodeAt(0);\nconst BRACKETEND = \"}\".charCodeAt(0);\nconst NOTLINEFEED = \"\\r\".charCodeAt(0);\nconst LINEFEED = \"\\n\".charCodeAt(0);\n\nconst mapCharToken = {\n [TAGBEGIN]: T.tagBegin,\n [TAGEND]: T.tagEnd,\n [BRACKETBEGIN]: T.bracketBegin,\n [BRACKETEND]: T.bracketEnd,\n [NOTLINEFEED]: null, // ignored charater\n [LINEFEED]: T.lineFeed,\n};\n\nclass Lexer {\n buf = new LookaheadBuffer();\n str: string;\n cur = 0;\n get len() {\n return this.str.length;\n }\n constructor(str: string) {\n this.str = str;\n this.buf.provider = () => {\n return this.read();\n };\n }\n toArray() {\n for (var i = 0; this.buf.peek(i).type !== T.eof; i++) {}\n return this.buf.buf.map((x) => x);\n }\n lastToken: Token;\n read(): Token {\n var token = this.readCore();\n // console.debug('token', token, this.cur);\n this.lastToken = token;\n return token;\n }\n readCore(): Token {\n var str = this.str;\n var begin = this.cur;\n var cur = this.cur;\n try {\n if (cur === str.length) return new Token(T.eof, \"[eof]\", cur);\n while (true) {\n var ch = str.charCodeAt(cur);\n var chCur = cur++;\n if (!(ch >= 0)) return new Token(T.eof, \"[eof]\", chCur);\n const tokenType = mapCharToken[ch];\n if (tokenType !== undefined) {\n if (tokenType === null) continue; // ignore charater\n return new Token(tokenType, ch, chCur);\n }\n while (true) {\n ch = str.charCodeAt(cur);\n if (!(ch >= 0) || mapCharToken[ch] !== undefined) break;\n cur++;\n }\n return new Token(T.text, str.substring(begin, cur), begin);\n }\n } finally {\n this.cur = cur;\n }\n }\n\n peek(pos?: number) {\n return this.buf.peek(pos);\n }\n consume() {\n return this.buf.consume();\n }\n tryExpect(type: TokenType, pos?: number) {\n var t = this.peek(pos);\n if (t.type === type) return t;\n return null;\n }\n tryExpectSeq(types: TokenType[]) {\n var i = 0;\n for (const t of types) {\n if (!this.tryExpect(t, i++)) return false;\n }\n return true;\n }\n expect(type: TokenType) {\n var t = this.tryExpect(type);\n if (!t) this.error(`expected token type '${TokenTypeEnum[type]}'`);\n return t;\n }\n error(msg?: string): never {\n throw new Error((msg ?? \"error\") + \" at \" + this.peek());\n }\n tryExpectAndConsume(type: TokenType) {\n return this.tryExpect(type) && this.consume();\n }\n expectAndConsume(type: TokenType) {\n this.expect(type);\n return this.consume();\n }\n}\n\ntype TokenType = T;\n\nenum TokenTypeEnum {\n [\"tagBegin\"] = 1,\n [\"tagEnd\"],\n [\"bracketBegin\"],\n [\"bracketEnd\"],\n [\"text\"],\n [\"lineFeed\"],\n [\"eof\"],\n}\n\nconst enum T {\n [\"tagBegin\"] = 1,\n [\"tagEnd\"],\n [\"bracketBegin\"],\n [\"bracketEnd\"],\n [\"text\"],\n [\"lineFeed\"],\n [\"eof\"],\n}\n\nclass Token {\n type: TokenType;\n val: string;\n pos: number;\n constructor(type: TokenType, val: string | number, pos: number) {\n this.type = type;\n this.val = typeof val === \"number\" ? String.fromCharCode(val) : val;\n this.pos = pos;\n }\n toString() {\n return `{${TokenTypeEnum[this.type]}|${this.val}}`;\n }\n}\n\nexport class Parser {\n lex: Lexer;\n tokens: LookaheadBuffer;\n lines: Line[] = [];\n bpm: number | null = null;\n offset = 0;\n curTime: number = 0;\n lang = \"\";\n tlang = \"\";\n haveReadLyrics = false;\n constructor(str: string) {\n this.lex = new Lexer(str);\n this.tokens = this.lex.buf;\n }\n parse(): Lyrics {\n var lex = this.lex;\n var lastpos: number;\n this.skipLineFeeds();\n while (lex.peek().type !== T.eof) {\n lastpos = lex.buf.consumed;\n this.parseLine();\n if (!this.haveReadLyrics) this.skipLineFeeds();\n if (lex.buf.consumed === lastpos) {\n lex.error(\"parseLine() doesn't consume tokens\");\n }\n }\n this.lines.sort((a, b) => {\n return a.orderTime - b.orderTime;\n });\n return {\n lines: this.lines,\n lang: this.lang,\n translationLang: this.tlang,\n bpm: this.bpm,\n };\n }\n parseLine() {\n var lex = this.lex;\n var startTime: number | null = null;\n var duplicateTime: TimeStamp[] = [];\n var spans: Span[] = [];\n var trans: string | null = null;\n var lastSpan: Span | null = null;\n var curTime: number | null = null;\n var timeStamp: TimeStamp | null = null;\n const lineStart = lex.peek().pos;\n while (true) {\n if (lex.tryExpectAndConsume(T.tagBegin)) {\n let text: string | null = null;\n let ts: TimeStamp | null;\n if (lex.tryExpect(T.tagEnd)) {\n ts = { time: -1, beats: null, beatsDiv: null };\n } else if (lex.tryExpect(T.text)) {\n text = lex.expectAndConsume(T.text).val;\n ts = this.parseTimestamp(\n text,\n curTime != null && curTime >= 0 ? curTime : this.curTime ?? 0\n );\n } else {\n this.pushRawLine(startTime, lineStart);\n return;\n }\n if (lex.tryExpectSeq([T.tagEnd, T.bracketBegin])) {\n lex.consume();\n lex.consume();\n let ruby = lex.expectAndConsume(T.text).val;\n lex.expectAndConsume(T.bracketEnd);\n spans.push(\n (lastSpan = {\n text: text || \"\",\n ruby,\n startTime: curTime,\n timeStamp,\n })\n );\n timeStamp = null;\n continue;\n }\n if (ts != null) {\n lex.expectAndConsume(T.tagEnd);\n if (!lastSpan && startTime != null) {\n duplicateTime.push(ts);\n } else {\n if (timeStamp) {\n spans.push(\n (lastSpan = {\n text: \"\",\n ruby: null,\n startTime: curTime,\n timeStamp,\n })\n );\n }\n timeStamp = ts;\n if (ts.time != -1) {\n curTime = ts.time;\n if (startTime === null) startTime = ts.time;\n }\n }\n continue;\n }\n if (text === null) continue;\n if (text.startsWith(\"bpm:\")) {\n this.bpm = parseFloat(text.substr(4));\n lex.expectAndConsume(T.tagEnd);\n } else if (text.startsWith(\"offset:\")) {\n this.offset = parseFloat(text.substr(7)) / 1000;\n lex.expectAndConsume(T.tagEnd);\n } else if (text.startsWith(\"lang:\")) {\n let r = /^([\\w\\-]+)(\\/([\\w\\-]+))?$/.exec(text.substr(5));\n if (r) {\n this.lang = r[1];\n this.tlang = r[3] || \"\";\n }\n lex.expectAndConsume(T.tagEnd);\n } else {\n if (!lastSpan) {\n // unknown tag at the beginning of the line, so skip this line.\n this.pushRawLine(startTime, lineStart);\n return;\n } else {\n spans.push(\n (lastSpan = {\n text: \"[\" + text + \"]\",\n ruby: null,\n startTime: curTime,\n timeStamp: null,\n })\n );\n if (lex.tryExpect(T.tagEnd)) lex.consume();\n }\n }\n } else if (lex.tryExpect(T.text)) {\n let text = lex.consume().val;\n spans.push(\n (lastSpan = { text, ruby: null, startTime: curTime, timeStamp })\n );\n timeStamp = null;\n } else if (lex.tryExpect(T.lineFeed)) {\n lex.consume();\n if (spans.length > 0 && lex.tryExpect(T.text)) {\n let nextline = lex.peek().val;\n if (nextline.startsWith(\"/\")) {\n trans = nextline.substr(1);\n lex.consume();\n lex.tryExpectAndConsume(T.eof) || lex.expectAndConsume(T.lineFeed);\n }\n }\n break;\n } else if (lex.tryExpect(T.eof)) {\n break;\n } else {\n this.pushRawLine(startTime, lineStart);\n return;\n }\n }\n if (timeStamp) {\n spans.push(\n (lastSpan = { text: \"\", ruby: null, startTime: curTime, timeStamp })\n );\n timeStamp = null;\n }\n if (spans.length === 0) {\n if (this.haveReadLyrics) {\n spans.push(\n (lastSpan = {\n text: \"\",\n ruby: null,\n startTime: null,\n timeStamp: null,\n })\n );\n } else {\n return;\n }\n }\n this.haveReadLyrics = true;\n if (curTime != null) this.curTime = curTime;\n this.lines.push({\n startTime,\n orderTime: startTime ?? this.curTime,\n translation: trans,\n spans,\n rawLine: null,\n });\n duplicateTime.forEach((t) => {\n var offset = t.time - startTime!;\n this.lines.push({\n startTime: t.time,\n orderTime: t.time,\n translation: trans,\n spans: spans.map(\n (s) =>\n ({\n text: s.text,\n ruby: s.ruby,\n startTime:\n s.startTime! >= 0 ? s.startTime! + offset : s.startTime,\n timeStamp: !s.timeStamp\n ? null\n : {\n time:\n s.timeStamp.time >= 0\n ? s.timeStamp.time + offset\n : s.timeStamp.time,\n beats: s.timeStamp.beats,\n beatsDiv: s.timeStamp.beatsDiv,\n },\n } as Span)\n ),\n rawLine: null,\n });\n });\n }\n skipLine() {\n while (!(this.lex.tryExpect(T.lineFeed) || this.lex.tryExpect(T.eof)))\n this.lex.consume();\n this.lex.consume();\n }\n skipLineFeeds() {\n while (this.lex.tryExpect(T.lineFeed)) this.lex.consume();\n }\n pushRawLine(startTime: number | null, start: number) {\n this.skipLine();\n this.lines.push({\n startTime,\n orderTime: startTime ?? this.curTime,\n translation: null,\n spans: null,\n rawLine: this.lex.str.substring(start, this.lex.peek().pos),\n });\n }\n parseTimestamp(str: string, curTime: number | null): TimeStamp | null {\n var match = /^((\\d+)\\:)?(\\d+)(\\.(\\d+))?$/.exec(str);\n if (!curTime) curTime = 0;\n if (match) {\n // Matched \"[MM:SS.ss]\" (LRC) or \"[SS.ss]\" (MusicCloud-extended LRC)\n let result = 0;\n if (match[2]) result += parseInt(match[2]) * 60;\n if (match[3]) result += parseInt(match[3]);\n if (match[4]) result += parseFloat(match[4]);\n result += this.offset;\n if (result < 0) result = 0;\n return { time: result, beats: null, beatsDiv: null };\n } else if ((match = /^b([\\d\\.]+)?(\\/(\\d+))?$/.exec(str))) {\n // Matched \"[b/BEATS/DIV]\" (MusicCloud-extended LRC)\n let result = { time: 60 / this.bpm!, beats: 1, beatsDiv: 1 };\n if (match[1]) {\n // beats\n result.beats = parseFloat(match[1]);\n result.time *= result.beats;\n }\n if (match[3]) {\n // div\n result.beatsDiv = parseInt(match[3]);\n result.time /= result.beatsDiv;\n }\n result.time += curTime;\n return result;\n }\n return null;\n }\n}\n\nexport interface TimeStamp {\n /** -1: to be filled */\n time: number;\n\n /** Set with beatsDiv to indicate the beats since last span */\n beats: number | null;\n beatsDiv: number | null;\n}\n\nexport interface Line {\n /** The time when this line starts */\n startTime: number | null;\n\n /** Used to sort lines. Usually it's the same as `startTime` except when the `startTime` is null. */\n orderTime: number;\n\n /** The spans for this line, have at least one span if the line is parsed. */\n spans: Span[] | null;\n\n /** The translation for this line */\n translation: string | null;\n\n /** The unparsed string when the parser failed to parse this line */\n rawLine: string | null;\n}\n\nexport interface Span {\n startTime: number | null;\n text: string;\n\n /** Optional ruby text that displayed above the text */\n ruby: string | null;\n\n /** Detailed time info */\n timeStamp: TimeStamp | null;\n}\n\nexport interface Lyrics {\n lines: Line[];\n lang?: string;\n translationLang?: string;\n bpm: number | null;\n}\n\n/**\n * Serialize lyrics\n * @param lyrics The Lyrics object to be serialized\n * @param extended Whether to generate MusicCloud-extended LRC result\n * @returns Serialized lyrics\n */\nexport function serialize(lyrics: Lyrics, extended: boolean = false) {\n var str = \"\";\n var headersPending = extended && (!!lyrics.lang || lyrics.bpm != null);\n lyrics.lines.forEach((l) => {\n // Emit the metadata header\n if (l.spans && headersPending) {\n headersPending = false;\n if (lyrics.lang) {\n str += \"[lang:\" + lyrics.lang;\n if (lyrics.translationLang) str += \"/\" + lyrics.translationLang;\n str += \"]\\n\";\n }\n if (lyrics.bpm != null) {\n str += \"[bpm:\" + lyrics.bpm + \"]\\n\";\n }\n str += \"\\n\";\n }\n\n // Emit the body\n if (l.rawLine) {\n // Emit unparsed line as-is\n str += l.rawLine;\n } else if (l.spans) {\n // Emit every spans of parsed line\n l.spans.forEach((s) => {\n if (s.timeStamp) {\n if (!extended) {\n const time = s.timeStamp.time;\n if (s.timeStamp.time === -1) {\n // omit\n } else {\n const min = padLeft(Math.floor(time / 60), 2, \"0\");\n const sec = padLeft((time % 60).toFixed(2), 5, \"0\");\n str += `[${min}:${sec}]`;\n }\n } else {\n if (s.timeStamp.beats != null) {\n str += \"[b\";\n if (s.timeStamp.beats != 1) str += s.timeStamp.beats;\n if (s.timeStamp.beatsDiv != 1) str += \"/\" + s.timeStamp.beatsDiv;\n str += \"]\";\n } else if (s.timeStamp.time === -1) {\n str += \"[]\";\n } else {\n str += \"[\" + s.timeStamp.time.toFixed(3) + \"]\";\n }\n }\n }\n if (extended && s.ruby != null) {\n str += \"[\" + s.text + \"]{\" + s.ruby + \"}\";\n } else {\n str += s.text;\n }\n });\n if (extended && l.translation) {\n str += \"\\n/\" + l.translation;\n }\n str += \"\\n\";\n }\n });\n return str;\n}\n\nfunction padLeft(val: string | number, length: number, pad: string): string {\n if (typeof val == \"number\") val = val.toString();\n while (val.length < length) val = pad + val;\n return val;\n}\n","import { View, buildDOM } from \"../Infra/viewlib\";\nimport { Span } from \"./Lyrics\";\nimport { LineView } from \"./LineView\";\n\nexport class SpanView extends View {\n span: Span;\n lineView: LineView;\n get timeStamp() {\n return this.span.timeStamp;\n }\n set timeStamp(val) {\n this.span.timeStamp = val;\n }\n get startTime() {\n return this.span.startTime;\n }\n set startTime(val) {\n this.span.startTime = val;\n }\n get isNext() {\n return this.dom.classList.contains(\"next\");\n }\n set isNext(val) {\n this.toggleClass(\"next\", val);\n }\n\n constructor(span: Span, lineView: LineView) {\n super();\n this.span = span;\n this.lineView = lineView;\n }\n createDom() {\n var s = this.span;\n return buildDOM({\n tag: \"span.span\",\n child: !s.ruby\n ? s.text\n : {\n tag: \"ruby\",\n child: [\n s.text,\n { tag: \"rp\", text: \"(\" },\n { tag: \"rt\", text: s.ruby },\n { tag: \"rp\", text: \")\" },\n ],\n },\n });\n }\n postCreateDom() {\n super.postCreateDom();\n var startX, startY;\n this.dom.addEventListener(\"mousedown\", (ev) => {\n startX = ev.offsetX;\n startY = ev.offsetY;\n });\n this.dom.addEventListener(\"click\", (ev) => {\n if (\n Math.abs(ev.offsetX - startX) <= 3 &&\n Math.abs(ev.offsetY - startY) <= 3\n ) {\n ev.preventDefault();\n this.lineView.context?.onSpanClicked?.(this);\n }\n });\n }\n}\n","import { ContainerView, buildDOM, View } from \"../Infra/viewlib\";\nimport { Line } from \"./Lyrics\";\nimport { LyricsViewContext } from \"./LyricsView\";\nimport { SpanView } from \"./SpanView\";\n\nexport class LineView extends View {\n line: Line;\n get spans() {\n return this.spansView.items;\n }\n spansView: ContainerView;\n currentIndex = 0;\n context?: LyricsViewContext;\n constructor(line: Line, context?: LyricsViewContext) {\n const spansView = new ContainerView({ tag: \"div.spans\" });\n super({\n tag: \"p.line\",\n child: spansView,\n });\n this.spansView = spansView;\n this.context = context;\n this.line = line;\n this.line.spans!.forEach((s) => {\n this.spansView.addView(new SpanView(s, this));\n });\n if (this.context?.enableTranslation && this.line.translation) {\n const lyrics = context?.lyrics;\n var tlang = lyrics && (lyrics.translationLang || lyrics.lang);\n this.dom.appendChild(\n buildDOM({\n tag: \"div.trans\",\n lang: tlang || \"\",\n text: this.line.translation,\n })\n );\n }\n }\n setCurrentTime(time: number) {\n const items = this.spans; // assume it's sorted\n let i = this.currentIndex;\n while (1) {\n if (i < items.length && items[i].startTime! <= time) {\n items[i].toggleClass(\"active\", true);\n i++;\n } else if (i > 0 && items[i - 1].startTime! > time) {\n items[i - 1].toggleClass(\"active\", false);\n i--;\n } else break;\n }\n this.currentIndex = i;\n }\n}\n","// file: ListContentView.ts\n\nimport {\n View,\n ListViewItem,\n ListView,\n LazyListView,\n LoadingIndicator,\n buildDOM,\n FuncOrVal,\n} from \"./viewlib\";\nimport { I } from \"../I18n/I18n\";\nimport { ContentView, ContentHeader, ActionBtn } from \"./ui-views\";\n\nclass DataBackedListViewItem extends ListViewItem {\n data: any;\n constructor(data: any) {\n super();\n this.data = data;\n }\n}\n\nclass DataBackedListView<\n T extends DataBackedListViewItem,\n TData\n> extends ListView {\n /** Do NOT modify this array directly, use {add,remove}Data methods instead. */\n dataList: Array = [];\n\n addData(data: TData) {\n this.dataList.push(data);\n if (this._dom) this.add(this.createListViewItem(data));\n }\n\n removeData(pos: number) {\n var [d] = this.dataList.splice(pos, 1);\n if (this._dom) this.remove(pos);\n return d;\n }\n\n protected createListViewItem(data: TData): T {\n return new DataBackedListViewItem(data) as any;\n }\n\n protected postCreateDom() {\n super.postCreateDom();\n this.dataList.forEach((data) => this.add(this.createListViewItem(data)));\n }\n}\n\nexport class ListContentView extends ContentView {\n //@ts-expect-error\n dom: HTMLElement;\n\n header: ContentHeader;\n refreshBtn: ActionBtn;\n selectAllBtn: ActionBtn;\n selectBtn: ActionBtn;\n\n scrollBox: View;\n listView: LazyListView;\n loadingIndicator: LoadingIndicator | null;\n emptyIndicator: LoadingIndicator;\n\n _scrollPos = 0;\n\n get rendered() {\n return this.domCreated;\n }\n\n private _canMultiSelect: boolean;\n public get canMultiSelect(): boolean {\n return this._canMultiSelect;\n }\n public set canMultiSelect(v: boolean) {\n this._canMultiSelect = v;\n if (this.selectBtn) this.selectBtn.hidden = !this.canMultiSelect;\n if (this.listView)\n this.listView.selectionHelper.ctrlForceSelect = this.canMultiSelect;\n }\n\n createDom() {\n return buildDOM({ tag: \"div.listcontentview\" });\n }\n\n postCreateDom() {\n super.postCreateDom();\n this.appendHeader();\n this.appendScrollBox();\n }\n\n title: FuncOrVal;\n protected createHeader(): ContentHeader {\n return new ContentHeader({ title: this.title });\n }\n\n protected appendHeader() {\n this.header = this.createHeader();\n this.header.actions.addView(\n (this.refreshBtn = new ActionBtn({ text: () => I`Refresh` }))\n );\n this.header.actions.addView(\n (this.selectAllBtn = new ActionBtn({ text: () => I`Select all` }))\n );\n this.header.actions.addView(\n (this.selectBtn = new ActionBtn({ text: () => I`Select` }))\n );\n this.selectBtn.onActive.add(() => {\n this.listView.selectionHelper.enabled =\n !this.listView.selectionHelper.enabled;\n });\n this.selectAllBtn.onActive.add(() => {\n this.listView.forEach((x) =>\n this.listView.selectionHelper.toggleItemSelection(x, true)\n );\n });\n this.appendView(this.header);\n }\n\n protected appendScrollBox() {\n this.scrollBox = this.createScrollBox();\n this.appendView(this.scrollBox);\n this.appendListView();\n }\n\n protected createScrollBox() {\n var scrollbox = new View({ tag: \"div.scrollbox\" });\n this.header.bindScrollBox(scrollbox.dom);\n return scrollbox;\n }\n\n protected appendListView() {\n this.listView = new LazyListView({ tag: \"ul.listview\" });\n this.listView.lazy = true;\n this.listView.selectionHelper.onEnabledChanged.add(() => {\n this.selectBtn.hidden =\n !this.canMultiSelect && !this.listView.selectionHelper.enabled;\n this.selectBtn.text = this.listView.selectionHelper.enabled\n ? () => I`Cancel`\n : () => I`Select`;\n this.selectAllBtn.hidden = !this.listView.selectionHelper.enabled;\n })();\n this.listView.selectionHelper.ctrlForceSelect = this.canMultiSelect;\n this.listView.scrollBox = this.scrollBox.dom;\n this.scrollBox.appendView(this.listView);\n }\n\n onShow() {\n super.onShow();\n this.ensureDom();\n this.listView.unload();\n }\n onDomInserted() {\n super.onDomInserted();\n this.listView.ensureLoaded(50);\n if (this.scrollBox && this._scrollPos) {\n this.listView.dom.style.minHeight =\n this._scrollPos + this.scrollBox.dom.offsetHeight + \"px\";\n this.scrollBox.dom.scrollTop = this._scrollPos;\n }\n this.listView.slowlyLoad(-1, 100, true).then(() => {\n this.listView.dom.style.minHeight = \"\";\n });\n this.header.onScrollboxScroll();\n }\n onRemove() {\n if (this.scrollBox) {\n this._scrollPos = this.scrollBox.dom.scrollTop;\n }\n this.listView.stopLoading();\n super.onRemove();\n }\n\n useLoadingIndicator(li: LoadingIndicator | null) {\n if (li !== this.loadingIndicator) {\n if (this.rendered) {\n if (this.loadingIndicator) this.loadingIndicator.dom.remove();\n if (li) this.insertLoadingIndicator(li);\n }\n this.loadingIndicator = li;\n }\n this.updateView();\n }\n\n protected insertLoadingIndicator(li: LoadingIndicator) {\n this.scrollBox.dom.insertBefore(li.dom, this.listView.dom);\n }\n\n updateView() {\n if (!this.rendered) return;\n if (this.listView.length === 0) {\n if (!this.loadingIndicator) {\n this.emptyIndicator =\n this.emptyIndicator ||\n new LoadingIndicator({ state: \"normal\", content: I`(Empty)` });\n this.useLoadingIndicator(this.emptyIndicator);\n }\n } else {\n if (\n this.emptyIndicator &&\n this.loadingIndicator === this.emptyIndicator\n ) {\n this.useLoadingIndicator(null);\n }\n }\n }\n\n async loadingAction(func: () => Promise) {\n var li = this.loadingIndicator || new LoadingIndicator();\n this.useLoadingIndicator(li);\n try {\n await func();\n } catch (error) {\n li.error(error, () => this.loadingAction(func));\n throw error;\n }\n this.useLoadingIndicator(null);\n }\n}\n","import {\n View,\n ContainerView,\n ItemActiveHelper,\n numLimit,\n} from \"../Infra/viewlib\";\nimport {\n BuildDomExpr,\n Callbacks,\n Action,\n Timer,\n ScrollAnimator,\n} from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { parse, Lyrics } from \"./Lyrics\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { Track } from \"../Track/Track\";\nimport { LineView } from \"./LineView\";\nimport { SpanView } from \"./SpanView\";\n\nexport class LyricsView extends View {\n lines = new ContainerView({ tag: \"div.lyrics\" });\n lyrics: Lyrics | null = null;\n hasVisibleLyrics: boolean = false;\n track: Track | null = null;\n curLine = new ItemActiveHelper();\n curTime = 0;\n scrollingTarget: LineView | null = null;\n onSpanClick = new Callbacks>();\n onFontSizeChanged = new Callbacks();\n onLyricsChanged = new Callbacks();\n constructor() {\n super();\n this.setLyrics(\"\");\n this.scrollAnimator.posType = \"center\";\n this.scrollAnimator.onUserScroll.add(() => {\n this.setScrollingPause(5000);\n });\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"div.lyricsview\",\n tabIndex: 0,\n child: [this.lines],\n };\n }\n postCreateDom() {\n var startFontSize: number;\n var distance: number;\n this.dom.addEventListener(\"touchstart\", (ev) => {\n if (ev.touches.length >= 2) {\n ev.preventDefault();\n startFontSize = this.scale;\n distance = dist(ev.touches[0], ev.touches[1]);\n }\n });\n this.dom.addEventListener(\"touchmove\", (ev) => {\n if (ev.touches.length >= 2) {\n ev.preventDefault();\n var newdist = dist(ev.touches[0], ev.touches[1]);\n var scale = numLimit((startFontSize * newdist) / distance, 20, 500);\n this.scale = scale;\n }\n });\n function dist(a: Touch, b: Touch) {\n var dx = a.screenX - b.screenX;\n var dy = a.screenY - b.screenY;\n return Math.sqrt(dx * dx + dy * dy);\n }\n this.dom.addEventListener(\"wheel\", (ev) => {\n if (ev.ctrlKey && ev.deltaY) {\n ev.preventDefault();\n var scale = this.scale + (ev.deltaY > 0 ? -20 : 20);\n scale = numLimit(scale, 20, 500);\n this.scale = scale;\n }\n });\n }\n setLyrics(lyrics: string | Lyrics) {\n let msg = \"\";\n let parsed: Lyrics | null;\n try {\n if (typeof lyrics === \"string\") parsed = parse(lyrics);\n else parsed = lyrics;\n } catch (error) {\n console.error(\"[Lyrics] parsing error\", error);\n msg = I`Error parsing lyrics`;\n parsed = null;\n }\n\n this.lyrics = parsed;\n this.hasVisibleLyrics = false;\n this.curLine.set(null);\n this.lines.removeAllView();\n\n if (parsed?.lang) this.lines.dom.lang = parsed.lang;\n else this.lines.dom.removeAttribute(\"lang\");\n\n const time = Date.now();\n\n const context: LyricsViewContext = {\n lyrics: parsed!,\n onSpanClicked: (span) => this.onSpanClick.invoke(span),\n enableTranslation: true,\n };\n\n if (parsed) {\n parsed.lines.forEach((l) => {\n if (l.spans) {\n this.lines.addView(new LineView(l, context));\n this.hasVisibleLyrics = true;\n }\n });\n }\n\n if (!this.hasVisibleLyrics) {\n this.lines.addView(\n new LineView(\n {\n orderTime: 0,\n spans: [{ text: msg || I`No lyrics` }],\n } as any,\n context\n )\n );\n }\n\n console.log(\n `[LyricsView] rendered ${[this.lines.length]} lines in ${\n Date.now() - time\n } ms`\n );\n\n this.onLyricsChanged.invoke();\n this.resize();\n }\n setCurrentTime(time: number, scroll?: boolean | \"smooth\" | \"force\") {\n if (!this.hasVisibleLyrics) return;\n if (!(time >= 0)) time = 0;\n this.curTime = time;\n var prev = this.curLine.current;\n var line = this.getLineByTime(time, prev);\n var laterLine = this.getLineByTime(\n time +\n (this.scrollAnimator.duration / 1000) * 0.5 * playerCore.playbackRate,\n line\n );\n line?.setCurrentTime(time);\n this.curLine.set(line);\n if (\n scroll &&\n scroll !== \"smooth\" &&\n line &&\n (prev !== line || scroll === \"force\")\n ) {\n this.scrollAnimator.cancel();\n this.scrollAnimator.currentPos =\n line.dom.offsetTop + line.dom.offsetHeight / 2;\n } else if (\n scroll === \"smooth\" &&\n !this.isScrollingPaused() &&\n laterLine !== this.scrollingTarget\n ) {\n this.scrollingTarget = laterLine;\n this.scrollAnimator.duration = 300 / playerCore.playbackRate;\n if (laterLine) {\n this.scrollAnimator.scrollTo(\n laterLine.dom.offsetTop + laterLine.dom.offsetHeight / 2\n );\n } else {\n this.scrollAnimator.scrollTo(this.lines.get(0)?.dom.offsetTop ?? 0);\n }\n }\n }\n scrollAnimator = new ScrollAnimator(this);\n resize() {\n if (this.domCreated) {\n const boxHeight = this.dom.offsetHeight;\n const contentHeight = this.lines.dom.scrollHeight;\n if (contentHeight > boxHeight / 2) {\n this.lines.dom.style.margin = (boxHeight - 1) / 2 + \"px 0\";\n } else {\n this.lines.dom.style.margin =\n (boxHeight - contentHeight - 1) / 2 + \"px 0\";\n }\n }\n if (!this.isScrollingPaused()) this.centerLyrics();\n }\n\n private _fontSize: number = 100;\n public get scale(): number {\n return this._fontSize;\n }\n public set scale(v: number) {\n this._fontSize = v;\n this.lines.dom.style.fontSize = v + \"%\";\n this.onFontSizeChanged.invoke();\n }\n\n scrollPos = 0;\n reset() {\n this.dom.scrollTop = this.scrollPos = 0;\n }\n onShow() {\n this.scrollAnimator.currentPos = this.scrollPos;\n if (this.isTrackPlaying()) this.setCurrentTime(playerCore.currentTime);\n requestAnimationFrame(this._resize);\n window.addEventListener(\"resize\", this._resize);\n }\n onHide() {\n this.scrollPos = this.scrollAnimator.currentPos;\n window.removeEventListener(\"resize\", this._resize);\n this.timer.tryCancel();\n }\n centerLyrics() {\n if (playerCore.state === \"playing\" && this.isTrackPlaying())\n this.setCurrentTime(playerCore.currentTime, \"force\");\n }\n private _resize = () => {\n this.resize();\n };\n timer = new Timer(() => this.onProgressChanged());\n lastChangedRealTime = 0;\n onProgressChanged = () => {\n if (!this.isTrackPlaying()) return;\n var time = playerCore.currentTime;\n var realTime = Date.now();\n if (time != this.curTime) {\n this.lastChangedRealTime = realTime;\n this.setCurrentTime(time, \"smooth\");\n }\n if (realTime - this.lastChangedRealTime < 250) {\n if (!this.timer.cancelFunc) this.timer.interval(30);\n } else {\n this.timer.tryCancel();\n }\n };\n private isTrackPlaying() {\n return (\n playerCore.track &&\n playerCore.track === this.track &&\n playerCore.track.id === this.track.id\n );\n }\n\n pauseScrollTime: number | null = null;\n isScrollingPaused() {\n return !!(this.pauseScrollTime && Date.now() < this.pauseScrollTime);\n }\n setScrollingPause(timeout: number | null) {\n if (timeout == null) {\n this.pauseScrollTime = null;\n } else {\n this.pauseScrollTime = Math.max(\n this.pauseScrollTime || 0,\n Date.now() + timeout\n );\n this.scrollingTarget = null;\n }\n }\n\n getLineByTime(time: number, hint?: LineView | null) {\n var line: LineView | null;\n if (hint && time >= hint.line.startTime!) {\n line = hint;\n for (let i = hint.position! + 1; i < this.lines.length; i++) {\n let x = this.lines.get(i);\n if (x.line.startTime != null) {\n if (x.line.startTime <= time) {\n line = x;\n } else {\n break;\n }\n }\n }\n } else {\n line = null;\n this.lines.forEach((x) => {\n if (x.line.startTime != null && x.line.startTime <= time) line = x;\n });\n }\n return line;\n }\n}\n\nexport interface LyricsViewContext {\n lyrics?: Lyrics;\n onSpanClicked?: (span: SpanView) => void;\n enableTranslation?: boolean;\n}\n","import { Track } from \"../Track/Track\";\nimport { ui } from \"../Infra/UI\";\nimport { I } from \"../I18n/I18n\";\nimport { BuildDomExpr } from \"../Infra/utils\";\nimport { LyricsView } from \"./LyricsView\";\nimport { SpanView } from \"./SpanView\";\nimport { router } from \"../Infra/Router\";\nimport { serialize, parse } from \"./Lyrics\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { Toast, InputView, numLimit } from \"../Infra/viewlib\";\nimport {\n SidebarItem,\n ContentView,\n ContentHeader,\n ActionBtn,\n} from \"../Infra/ui-views\";\n\nexport const lyricsEdit = new (class {\n sidebarItem: SidebarItem;\n view: LyricsEditContentView;\n startEdit(track: Track, lyrics: string) {\n if (!this.view) {\n this.sidebarItem = new SidebarItem({ text: () => I`Edit Lyrics` });\n this.view = new LyricsEditContentView();\n ui.sidebarList.addFeatureItem(this.sidebarItem);\n router.addRoute({\n path: [\"lyricsEdit\"],\n contentView: () => this.view,\n sidebarItem: () => this.sidebarItem,\n onNav: () => {\n this.sidebarItem.hidden = false;\n },\n });\n }\n this.view.setTrack(track, lyrics);\n router.nav(\"lyricsEdit\");\n }\n})();\n\nclass LyricsEditContentView extends ContentView {\n header = new ContentHeader({ title: I`Edit Lyrics` });\n lyricsView = new EditableLyricsView();\n sourceView = new LyricsSourceView();\n currentView: LyricsSourceView | EditableLyricsView | null = null;\n btnLyrics: ActionBtn;\n btnSource: ActionBtn;\n\n _mode: \"lyrics\" | \"source\" = \"lyrics\";\n get mode() {\n return this._mode;\n }\n set mode(val) {\n this.setMode(val);\n }\n\n track: Track | null = null;\n lyrics: string | null = null;\n originalLyrics: string | null = null;\n\n constructor() {\n super();\n this.header.actions.addView(\n (this.btnLyrics = new ActionBtn({\n text: I`Lyrics View`,\n onActive: () => {\n this.setMode(\"lyrics\");\n },\n }))\n );\n this.header.actions.addView(\n (this.btnSource = new ActionBtn({\n text: I`Source View`,\n onActive: () => {\n this.setMode(\"source\");\n },\n }))\n );\n this.header.actions.addView(\n new ActionBtn({\n text: I`Discard`,\n onActive: () => {\n this.lyrics = this.originalLyrics;\n this.close();\n },\n })\n );\n this.header.actions.addView(\n new ActionBtn({\n text: I`Done`,\n onActive: () => {\n this.serializeLyricsFromView();\n this.close();\n },\n })\n );\n }\n\n setMode(mode: this[\"mode\"], init?: boolean) {\n if (!init && mode === this._mode) return;\n try {\n if (!init) this.serializeLyricsFromView();\n var view = this.currentView;\n if (mode === \"lyrics\") {\n try {\n var parsed = parse(this.lyrics!);\n } catch (error) {\n throw new Error(I`Error parsing lyrics`);\n }\n this.lyricsView.setLyrics(parsed);\n view = this.lyricsView;\n } else if (mode === \"source\") {\n this.sourceView.value = this.lyrics!;\n view = this.sourceView;\n } else {\n throw new Error(\"unknown mode\");\n }\n this.setCurrentView(view);\n } catch (error) {\n Toast.show(I`Failed to switch view.` + \"\\n\" + error, 3000);\n return;\n }\n this.btnLyrics.active = mode === \"lyrics\";\n this.btnSource.active = mode === \"source\";\n this._mode = mode;\n }\n\n setCurrentView(view: this[\"currentView\"]) {\n if (this.currentView) {\n this.currentView.onHide();\n this.removeView(this.currentView);\n this.currentView = null;\n }\n if (view) {\n this.currentView = view;\n this.appendView(view!);\n view.onShow();\n }\n }\n\n private serializeLyricsFromView() {\n if (this.mode === \"lyrics\") {\n if (this.lyricsView.modified)\n this.lyrics = serialize(this.lyricsView.lyrics!, true);\n } else if (this.mode === \"source\") {\n this.lyrics = this.sourceView.value;\n } else {\n throw new Error(\"unknown mode\");\n }\n }\n\n close() {\n lyricsEdit.sidebarItem.hidden = true;\n window.history.back();\n var trackDialog = this.track!.startEdit();\n trackDialog.inputLyrics.value = this.lyrics!;\n }\n\n createDom(): BuildDomExpr {\n return {\n tag: \"div.lyricsedit\",\n child: [this.header],\n };\n }\n setTrack(track: Track, lyrics: string) {\n this.track = track;\n this.originalLyrics = lyrics;\n this.lyrics = lyrics;\n this.lyricsView.reset();\n this.lyricsView.track = track;\n this.sourceView.reset();\n this.setMode(lyrics ? this.mode : \"source\", true);\n }\n onShow() {\n this.ensureDom();\n this.shownEvents.add(playerCore.onProgressChanged, () => {\n if (this.currentView === this.lyricsView) {\n this.lyricsView.onProgressChanged();\n }\n });\n }\n onDomInserted() {\n super.onDomInserted();\n this.currentView?.onShow();\n }\n onRemove() {\n super.onRemove();\n this.currentView?.onHide();\n }\n}\n\nclass EditableLyricsView extends LyricsView {\n nextSpans: SpanView[] = [];\n modified = false;\n constructor() {\n super();\n this.onLyricsChanged.add(() => {\n this.modified = false;\n this.lines.forEach((l) => {\n if (l.spans?.length) {\n let firstSpan = l.spans[0].span;\n if (!firstSpan.timeStamp) {\n firstSpan.timeStamp = { time: -1, beats: null, beatsDiv: null };\n }\n l.spans.forEach((s) => {\n s.timeStamp && s.toggleClass(\"ts\", true);\n });\n }\n });\n this.nextSpans = [];\n this.setNextSpans(this.getSpans());\n });\n this.onSpanClick.add((s) => {\n if (s.span.startTime != null && s.span.startTime >= 0)\n playerCore.currentTime = numLimit(s.span.startTime! - 3, 0, Infinity);\n this.setNextSpans(this.getSpans(s, \"here\"));\n });\n this.dom.addEventListener(\"keydown\", (ev) => {\n if (ev.code == \"ArrowRight\" || ev.code == \"KeyF\" || ev.code == \"KeyD\") {\n ev.preventDefault();\n if (this.nextSpans.length) {\n const now = playerCore.currentTime;\n this.nextSpans[0].timeStamp!.time = now;\n this.nextSpans.forEach((s) => {\n s.startTime = now;\n });\n if (this.nextSpans[0].position === 0) {\n this.nextSpans[0].lineView.line.startTime = now;\n }\n this.modified = true;\n }\n let spans = this.getSpans(null, \"forward\");\n if (spans.length) this.setNextSpans(spans);\n } else if (ev.code == \"ArrowLeft\") {\n ev.preventDefault();\n let spans = this.getSpans(null, \"backward\");\n if (spans.length) this.setNextSpans(spans);\n }\n });\n this.toggleClass(\"edit\", true);\n }\n getSpans(span?: SpanView | null, go?: \"here\" | \"forward\" | \"backward\") {\n if (!span) {\n if (this.nextSpans.length) {\n span =\n this.nextSpans[go === \"backward\" ? 0 : this.nextSpans.length - 1];\n } else if (this.lines.length) {\n span = this.lines.get(0).spans[0];\n } else {\n return [];\n }\n }\n var colPos = span.position!;\n var line = span.lineView!;\n\n if (go == null || go === \"here\") {\n while (line.spans && !line.spans[colPos].timeStamp) {\n if (colPos-- === 0) {\n line = this.lines.get(line.position! - 1);\n colPos = line.spans.length - 1;\n }\n }\n } else if (go === \"forward\") {\n do {\n if (line && ++colPos === line.spans.length) {\n line = this.lines.get(line.position! + 1);\n colPos = 0;\n }\n } while (line && line.spans && !line.spans[colPos].timeStamp);\n } else if (go === \"backward\") {\n do {\n if (line && colPos-- === 0) {\n line = this.lines.get(line.position! - 1);\n colPos = line.spans.length - 1;\n }\n } while (line && line.spans && !line.spans[colPos].timeStamp);\n }\n\n var spans: SpanView[] = [];\n if (line) {\n do {\n spans.push(line.spans[colPos]);\n colPos++;\n } while (colPos < line.spans.length && !line.spans[colPos].timeStamp);\n }\n return spans;\n }\n setNextSpans(spans: SpanView[]) {\n while (this.nextSpans.length) {\n this.nextSpans.pop()!.isNext = false;\n }\n spans.forEach((s) => {\n s.isNext = true;\n this.nextSpans.push(s);\n });\n }\n}\n\nexport class LyricsSourceEditView extends InputView {\n //@ts-expect-error\n dom: HTMLTextAreaElement;\n get value() {\n return this.dom.value;\n }\n set value(val) {\n this.dom.value = val;\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"textarea.input-text\",\n };\n }\n postCreateDom() {\n super.postCreateDom();\n this.dom.addEventListener(\"keydown\", (ev) => {\n if (ev.ctrlKey && ev.key === \"r\") {\n ev.preventDefault();\n const start = this.dom.selectionStart;\n const end = this.dom.selectionEnd;\n const origstr = this.dom.value;\n this.dom.setRangeText(\"[\" + origstr.substring(start, end) + \"]{}\");\n const cursorPos = start == end ? start + 1 : end + 3;\n this.dom.setSelectionRange(cursorPos, cursorPos);\n }\n });\n }\n}\n\nclass LyricsSourceView extends LyricsSourceEditView {\n constructor() {\n super();\n this.dom.style.border = \"none\";\n this.dom.style.height = \"100%\";\n this.dom.style.padding = \"10px\";\n this.dom.style.resize = \"none\";\n }\n scrollPos = 0;\n reset() {\n this.scrollPos = 0;\n }\n onShow() {\n this.dom.scrollTop = this.scrollPos;\n }\n onHide() {\n this.scrollPos = this.dom.scrollTop;\n }\n}\n","import { MessageBox, TextCompositionWatcher } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport {\n Toast,\n Dialog,\n LabeledInput,\n TextBtn,\n LoadingIndicator,\n objectApply,\n sleepAsync,\n} from \"../Infra/viewlib\";\nimport { Api } from \"../API/apidef\";\nimport { api } from \"../API/Api\";\nimport type { TrackList } from \"./TrackList\";\nimport { lyricsEdit, LyricsSourceEditView } from \"../Lyrics/LyricsEdit\";\nimport { user } from \"../API/User\";\nimport { FileSelector } from \"../Infra/viewlib\";\nimport { playerCore } from \"../main\";\n\n/** A track binding with list */\nexport class Track {\n infoObj: Api.Track | null = null;\n get id() {\n return this.infoObj!.id;\n }\n get owner() {\n return this.infoObj!.owner;\n }\n get name() {\n return this.infoObj!.name;\n }\n get type() {\n return this.infoObj!.type;\n }\n get artist() {\n return this.infoObj!.artist;\n }\n get album() {\n return this.infoObj!.album;\n }\n get albumArtist() {\n return this.infoObj!.albumArtist;\n }\n get url() {\n return this.infoObj!.url;\n }\n get picurl() {\n return this.infoObj!.picurl;\n }\n get thumburl() {\n return this.infoObj!.thumburl;\n }\n get files() {\n return this.infoObj!.files;\n }\n get length() {\n return this.infoObj!.length;\n }\n get size() {\n return this.infoObj!.size;\n }\n get lyrics() {\n return this.infoObj!.lyrics;\n }\n get visibility() {\n return this.infoObj!.visibility;\n }\n get displayName() {\n return this.artist + \" - \" + this.name;\n }\n get groupId() {\n return this.infoObj!.groupId;\n }\n blob: Blob | null = null;\n _bind?: {\n position?: number;\n list?: TrackList;\n } = undefined;\n _loudmap: Uint8Array | Promise | null = null;\n get canEdit() {\n return user.role == \"admin\" || user.info.id == this.owner;\n }\n constructor(init: Partial) {\n objectApply(this, init);\n }\n toString() {\n return `${I`Track ID`}: ${this.id}\\r\\n${I`Name`}: ${\n this.name\n }\\r\\n${I`Artist`}: ${this.artist}`;\n }\n toApiTrack(): Api.Track {\n return this.infoObj!;\n }\n getExtensionName() {\n return /\\.([\\w\\-_]{1,6})$/.exec(this.url!)?.[1];\n }\n updateFromApiTrack(t: Api.Track) {\n if (this.id !== t.id) throw new Error(\"Bad track id\");\n // objectApply(this, t, ['id', 'name', 'artist', 'url', 'size']);\n this.infoObj = t;\n }\n startEdit(ev?: MouseEvent) {\n var dialog = new TrackDialog();\n dialog.setTrack(this);\n dialog.show(ev);\n return dialog;\n }\n getFileUrl(file?: Api.TrackFile) {\n if (!file?.profile) return this.url;\n if (file.size == -1) return false;\n return this.url + \".\" + file.profile;\n }\n async requestFileUrl(file: Api.TrackFile): Promise {\n var r = this.getFileUrl(file);\n if (r !== false) return r;\n var toast = Toast.show(I`Converting \"${this.displayName}\"...`);\n try {\n file.size = (\n await api.post({\n path: `tracks/${this.id}/convert`,\n obj: { profile: file.profile },\n })\n )[\"size\"];\n toast.close();\n return this.getFileUrl(file) as string;\n } catch (error) {\n toast.updateWith({\n text: I`Error converting \"${this.displayName}\".` + \"\\n\" + error,\n });\n toast.show(3000);\n throw error;\n }\n }\n _lyricsFetchTask: Promise | null = null;\n isLyricsGotten() {\n return this.lyrics != null;\n }\n getLyrics(): Promise {\n if (!this.isLyricsGotten()) {\n if (!this.id) return Promise.resolve(\"\");\n if (!this._lyricsFetchTask)\n this._lyricsFetchTask = (async () => {\n try {\n var resp: Api.TrackLyrics = await api.get(\n \"tracks/\" + this.id + \"/lyrics\",\n );\n this.infoObj!.lyrics = resp.lyrics;\n return this.lyrics!;\n } catch (error) {\n this._lyricsFetchTask = null;\n console.error(`[Track] id ${this.id} fetching lyrics error`, error);\n throw error;\n }\n })();\n return this._lyricsFetchTask;\n }\n return Promise.resolve(this.lyrics!);\n }\n\n async put(newInfo: Partial) {\n const resp = (await api.put({\n path: \"tracks/\" + this.id,\n obj: newInfo,\n })) as Api.Track;\n if (resp[\"error\"]) {\n throw new Error(resp[\"error\"]);\n }\n if (resp.id != this.id) throw new Error(\"Bad ID in response\");\n this.infoObj = resp;\n api.onTrackInfoChanged.invoke(resp);\n }\n\n _group: Promise<{ tracks: Api.Track[] }> | null = null;\n getGroup(): Promise<{ tracks: Api.Track[] }> {\n return getGroup(this.groupId ?? this.id);\n }\n\n async getLoudnessMap() {\n if (!this._loudmap) {\n this._loudmap = (async () => {\n var resp = (await api.get(`tracks/${this.id}/loudnessmap`)) as Response;\n if (!resp.ok) return null;\n var ab = await resp.arrayBuffer();\n return (this._loudmap = new Uint8Array(ab));\n })();\n this._loudmap.catch(() => {\n this._loudmap = null;\n });\n }\n return this._loudmap;\n }\n\n async preload() {\n const preloadTrackFile = async () => {\n const apiFile = playerCore.decideFileFromTrack(this);\n const fileUrl = await this.requestFileUrl(apiFile);\n const res = await api._fetch(api.processUrl(fileUrl), {\n headers: {\n range: \"bytes=0-1000000\",\n },\n });\n await res.blob();\n };\n const preloadThumb = async () => {\n if (this.thumburl) {\n const res = await api._fetch(api.processUrl(this.thumburl), {\n mode: \"no-cors\",\n });\n await res.blob();\n }\n };\n await Promise.all([\n this.getLoudnessMap(),\n this.getLyrics(),\n preloadTrackFile(),\n preloadThumb(),\n ]);\n }\n}\n\nconst groupCache = new Map>();\n\nfunction getGroup(id: number) {\n if (!groupCache.has(id)) {\n groupCache.set(id, api.get(`tracks/group/${id}`));\n }\n return groupCache.get(id)!;\n}\n\nexport class TrackDialog extends Dialog {\n track: Track;\n inputName = new LabeledInput({ label: I`Name` });\n inputArtist = new LabeledInput({ label: I`Artist` });\n inputAlbum = new LabeledInput({ label: I`Album` });\n inputAlbumArtist = new LabeledInput({ label: I`Album artist` });\n inputLyrics = new LabeledInputWithLoading({ label: I`Lyrics` });\n fileSelector = new FileSelector({ accept: \"image/jpeg\" });\n btnSave = new TextBtn({ text: I`Save`, right: true });\n btnEditLyrics = new TextBtn({ text: I`Edit Lyrics`, right: true });\n btnSetPicture = new TextBtn({ text: I`Set Picture`, right: true });\n autoFocus = this.inputName.input;\n compositionWatcher: TextCompositionWatcher;\n constructor() {\n super();\n this.width = \"500px\";\n this.resizable = true;\n this.contentFlex = true;\n this.inputLyrics.input = new LyricsSourceEditView();\n this.inputLyrics.input.dom.style.resize = \"none\";\n this.inputLyrics.dom.style.flex = \"1\";\n this.inputLyrics.dominput.style.minHeight = \"3em\";\n this.inputLyrics.dominput.style.height = \"6em\";\n\n [\n this.inputName,\n this.inputArtist,\n this.inputAlbum,\n this.inputAlbumArtist,\n this.inputLyrics,\n this.fileSelector,\n ].forEach((x) => this.addContent(x));\n\n this.addBtn(this.btnSave);\n this.btnSave.onActive.add(() => this.save());\n this.addBtn(this.btnEditLyrics);\n this.btnEditLyrics.onActive.add(() => {\n this.close();\n lyricsEdit.startEdit(this.track, this.inputLyrics.value);\n });\n this.addBtn(this.btnSetPicture);\n this.btnSetPicture.onActive.add(() => {\n this.fileSelector.open();\n });\n\n this.fileSelector.onfile = async (file) => {\n try {\n this.btnSetPicture.updateWith({\n clickable: false,\n text: I`Uploading...`,\n });\n let updated = (await api.put({\n path: `tracks/${this.track.id}/picture`,\n mode: \"raw\",\n obj: await file.arrayBuffer(),\n })) as Api.Track;\n this.btnSetPicture.updateWith({ clickable: false, text: I`Done` });\n this.track.updateFromApiTrack(updated);\n api.onTrackInfoChanged.invoke(updated);\n } catch (error) {\n console.error(error);\n this.btnSetPicture.updateWith({ clickable: false, text: I`Error` });\n } finally {\n sleepAsync(2000).then(() => {\n this.btnSetPicture.updateWith({\n clickable: true,\n text: I`Set Picture`,\n });\n });\n }\n };\n\n this.compositionWatcher = new TextCompositionWatcher(this.dom);\n this.dom.addEventListener(\"keydown\", (ev) => {\n if (\n this.track.canEdit &&\n !this.compositionWatcher.isCompositing &&\n ev.code === \"Enter\" &&\n (ev.ctrlKey || ev.target !== this.inputLyrics.input.dom)\n ) {\n ev.preventDefault();\n this.save();\n }\n });\n }\n setTrack(t: Track) {\n this.track = t;\n this.title = I`Track ID` + \" \" + t.id;\n if (!t.canEdit) this.title += I` (read-only)`;\n this.btnSave.hidden = !t.canEdit;\n this.inputName.updateWith({ value: t.name });\n this.inputArtist.updateWith({ value: t.artist });\n this.inputAlbum.value = t.infoObj?.album || \"\";\n this.inputAlbumArtist.value = t.infoObj?.albumArtist || \"\";\n if (t.isLyricsGotten()) {\n this.inputLyrics.loaded = true;\n this.inputLyrics.updateWith({ value: t.lyrics });\n } else {\n this.inputLyrics.loaded = false;\n t.getLyrics().then((l) => {\n this.inputLyrics.loaded = true;\n this.inputLyrics.updateWith({ value: t.lyrics });\n });\n }\n this.updateDom();\n }\n checkIfChanged() {\n return (\n this.track.name !== this.inputName.value ||\n this.track.artist !== this.inputArtist.value ||\n this.track.album !== this.inputAlbum.value ||\n this.track.albumArtist !== this.inputAlbumArtist.value ||\n (this.inputLyrics.loaded && this.track.lyrics !== this.inputLyrics.value)\n );\n }\n close() {\n if (this.checkIfChanged()) {\n new MessageBox()\n .setTitle(I`Save changes?`)\n .addText(I`There are unsaved changes.`)\n .addResultBtns([\"cancel\", \"no\", \"yes\"])\n .showAndWaitResult()\n .then((result) => {\n if (result === \"yes\") {\n this.save();\n } else if (result === \"no\") {\n super.close();\n } // else noop\n });\n return;\n }\n super.close();\n }\n async save() {\n if (!this.btnSave.clickable) throw new Error(\"btnSave is not clickable.\");\n this.btnSave.updateWith({ clickable: false, text: I`Saving...` });\n try {\n await this.track.put({\n id: this.track.id,\n name: this.inputName.value,\n artist: this.inputArtist.value,\n album: this.inputAlbum.value,\n albumArtist: this.inputAlbumArtist.value,\n lyrics: this.inputLyrics.loaded ? this.inputLyrics.value : undefined,\n version: this.track.infoObj?.version,\n });\n this.close();\n } catch (error) {\n if (error.message == \"track_changed\") {\n Toast.show(I`The track was changed from somewhere else.`, 5000);\n return;\n }\n console.error(\"[Track] saving error\", error);\n this.btnSave.updateWith({ clickable: false, text: I`Error` });\n await sleepAsync(3000);\n }\n this.btnSave.updateWith({ clickable: true, text: I`Save` });\n }\n}\n\nclass LabeledInputWithLoading extends LabeledInput {\n loadingIndicator = new LoadingIndicator();\n get loaded() {\n return this.loadingIndicator.hidden;\n }\n set loaded(val) {\n this.loadingIndicator.hidden = val;\n this.input.hidden = !val;\n }\n postCreateDom() {\n super.postCreateDom();\n this.appendView(this.loadingIndicator);\n this.loaded = false;\n }\n}\n","import { user } from \"./User\";\nimport { api } from \"./Api\";\nimport { Callbacks, Action } from \"../Infra/utils\";\n\nexport const msgcli = new (class {\n ws: WebSocket | null = null;\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n loginState: \"\" | \"sent\" | \"done\" = \"\";\n\n onConnected = new Callbacks();\n onLogin = new Callbacks();\n\n lastQueryId = 0;\n queries: Record> = {};\n events: Record = {};\n permEvents: Record> = {};\n\n init() {\n user.onSwitchedUser.add(() => {\n if (this.connected && api.defaultAuth) this.login(api.defaultAuth!);\n });\n this.onConnected.add(() => {\n if (user.state === \"logged\") this.login(api.defaultAuth!);\n this.listenPermEvents();\n });\n this.connect();\n }\n private listenPermEvents() {\n var eventlist: string[] = [];\n for (const key in this.permEvents) {\n if (this.permEvents.hasOwnProperty(key)) {\n this.events[key] = this.permEvents[key];\n eventlist.push(key);\n }\n }\n if (eventlist.length === 0) return;\n this.sendQuery(\n {\n cmd: \"listenEvent\",\n events: eventlist,\n },\n null\n );\n }\n private getUrl() {\n var match = api.baseUrl.match(/^(?:(https?:)?\\/\\/([\\w\\-\\.:]+))?(\\/)?(.*)$/);\n if (!match) throw new Error(\"cannot generate websocket URL\");\n var [_, protocol, host, pathroot, path] = match;\n protocol = protocol || window.location.protocol;\n host = host || window.location.host;\n protocol = protocol === \"https:\" ? \"wss://\" : \"ws://\";\n path = pathroot ? \"/\" + path : window.location.pathname + path;\n return protocol + host + path + \"ws\";\n }\n private connect() {\n this.ws = new WebSocket(this.getUrl());\n this.ws.onopen = (ev) => {\n this.onConnected.invoke();\n };\n this.ws.onclose = (ev) => {\n console.warn(\"[MsgCli] ws close\", { code: ev.code, reason: ev.reason });\n this.ws = null;\n this.loginState = \"\";\n this.events = {};\n var queries = this.queries;\n for (const key in queries) {\n if (queries.hasOwnProperty(key)) {\n try {\n queries[key]({\n queryId: +key,\n resp: \"wsclose\",\n });\n } catch (error) {\n console.error(\"[MsgCli] error\", error);\n }\n }\n }\n this.queries = {};\n setTimeout(() => {\n this.connect();\n }, 10000);\n };\n this.ws.onmessage = (ev) => {\n // console.debug('[MsgCli] ws msg', ev.data);\n if (typeof ev.data === \"string\") {\n var json = JSON.parse(ev.data);\n if (json.resp && json.queryId) {\n console.debug(\"[MsgCli] ws query answer\", json);\n if (this.queries[json.queryId]) {\n this.queries[json.queryId](json);\n delete this.queries[json.queryId];\n }\n } else if (json.cmd === \"event\") {\n var evt = json.event as string;\n console.debug(\"[MsgCli] ws received event\", json);\n if (this.events[evt]) {\n this.events[evt](json.data);\n } else {\n console.debug(\"[MsgCli] ws unknown event\", json);\n }\n } else {\n console.debug(\"[MsgCli] ws unknown json\", json);\n }\n } else {\n console.debug(\"[MsgCli] ws unknwon data\", ev.data);\n }\n };\n }\n private login(token: string) {\n this.loginState = \"sent\";\n this.sendQueryAsync({\n cmd: \"login\",\n token,\n }).then((a) => {\n if (a.resp === \"ok\") {\n console.info(\"[MsgCli] ws login ok\");\n this.loginState = \"done\";\n this.onLogin.invoke();\n } else {\n console.warn(\"[MsgCli] ws login result: \", a.resp);\n this.loginState = \"\";\n }\n });\n }\n sendQuery(obj: Query, callback?: Action | null) {\n if (!this.connected) throw new Error(\"not connected\");\n var queryId = ++this.lastQueryId;\n const objWithId = {\n queryId,\n ...obj,\n };\n console.debug(\"[MsgCli] ws send\", printFilter(objWithId));\n this.ws!.send(JSON.stringify(objWithId));\n if (callback) {\n this.queries[queryId] = callback;\n }\n }\n sendQueryAsync(obj: Query) {\n return new Promise((resolve) => {\n this.sendQuery(obj, resolve);\n });\n }\n listenEvent(\n evt: string | { events?: string[]; remove?: string[] },\n callback: Action,\n autoRetry?: boolean\n ) {\n if (typeof evt == \"string\") {\n evt = {\n events: [evt],\n remove: [],\n };\n }\n evt.events = (evt.events ?? []).filter((e) => !this.events[e]);\n evt.remove = evt.remove ?? [];\n if (this.connected) {\n this.sendQuery(\n {\n cmd: \"listenEvent\",\n ...(evt as any),\n },\n null\n );\n } else if (!autoRetry) {\n throw new Error(\"not connected\");\n }\n for (const e of evt.events) {\n this.events[e] = callback;\n if (autoRetry) {\n this.permEvents[e] = callback;\n }\n }\n for (const e of evt.remove) {\n delete this.events[e];\n delete this.permEvents[e];\n }\n }\n})();\n\nfunction printFilter(obj: any) {\n if (obj.token) {\n return { ...obj, token: \"***\" };\n }\n return obj;\n}\n\nexport interface QueryAnswer {\n resp: string;\n queryId: number;\n}\n\nexport type Query =\n | { cmd: \"login\"; token: string }\n | { cmd: \"listenEvent\"; events?: string[]; remove?: string[] };\n","// file: TrackList.ts\n\nimport {\n BuildDomExpr,\n DataUpdatingHelper,\n formatDuration,\n ScrollAnimator,\n TextView,\n View,\n} from \"../Infra/utils\";\nimport { I, i18n } from \"../I18n/I18n\";\nimport {\n LoadingIndicator,\n ListViewItem,\n ContextMenu,\n MenuItem,\n MenuLinkItem,\n MenuInfoItem,\n Toast,\n ItemActiveHelper,\n LazyListView,\n arrayInsert,\n arraySum,\n clearChildren,\n formatFileSize,\n mod,\n objectApply,\n sleepAsync,\n toggleClass,\n} from \"../Infra/viewlib\";\nimport { ListContentView } from \"../Infra/ListContentView\";\nimport { user } from \"../API/User\";\nimport { Api } from \"../API/apidef\";\nimport { api } from \"../API/Api\";\nimport { listIndex } from \"./ListIndex\";\nimport { playerCore, PlayingLoopMode } from \"../Player/PlayerCore\";\nimport { router } from \"../Infra/Router\";\nimport { Track } from \"./Track\";\nimport {\n ContentView,\n ContentHeader,\n CopyMenuItem,\n Icon,\n} from \"../Infra/ui-views\";\nimport { ui } from \"../Infra/UI\";\nimport { msgcli } from \"../API/MessageClient\";\nimport svgPlayArrow from \"../../resources/play_arrow-24px.svg\";\nimport { settings } from \"../Settings/Settings\";\nimport { trackContextMenu } from \"./TrackContextMenu\";\n\nexport class TrackList {\n info: Api.TrackListInfo | null = null;\n id: number | null = null;\n get apiid() {\n return this.info?.id ?? null;\n }\n get name() {\n return this.info?.name ?? null;\n }\n get version() {\n return this.info?.version ?? null;\n }\n tracks: Track[] = [];\n tracksSuffled: Track[] | null = null;\n fetching: Promise | null = null;\n posting: Promise | null = null;\n eventListening = false;\n\n get canEdit() {\n return user.info.id == this.info!.owner;\n }\n\n /** Available when loading */\n loadIndicator: LoadingIndicator | null;\n setLoadIndicator(li: LoadingIndicator | null) {\n this.loadIndicator = li;\n if (this.contentView) this.contentView.useLoadingIndicator(li);\n }\n\n /** Available when the view is created */\n contentView: TrackListView;\n listView: LazyListView;\n\n loadInfo(info: Api.TrackListInfo) {\n this.id = info.id;\n this.info = objectApply(this.info ?? {}, info, [\n \"id\",\n \"owner\",\n \"name\",\n \"version\",\n \"visibility\",\n ]) as typeof info;\n if (this.info.id < 0) this.info.id = 0;\n this.updateCanEdit();\n }\n updateCanEdit() {\n if (this.contentView)\n this.contentView.header.updateWith({ titleEditable: this.canEdit });\n }\n\n loadApiId(id: number) {\n this.loadInfo({\n id,\n owner: 0,\n name: \"\",\n version: 0,\n visibility: 0,\n });\n }\n loadFromGetResult(obj: Api.TrackListGet) {\n this.loadInfo(obj);\n this.onInfoChanged();\n const thiz = this;\n if (this.listView) this.listView.lazy = true;\n if (!this.tracks) this.tracks = [];\n new (class extends DataUpdatingHelper {\n items = thiz.tracks!;\n addItem(data: Api.Track, pos: number) {\n thiz.addTrack_NoUpdating(data, pos);\n }\n updateItem(item: Track, data: Api.Track) {\n item.updateFromApiTrack(data);\n }\n removeItem(item: Track) {\n thiz.remove_NoUpdating(item);\n }\n })().updateOrRebuildAll(obj.tracks);\n this.updateTracksState();\n this.contentView?.updateView();\n if (this.listView) this.listView.slowlyLoad(1, 30);\n return this;\n }\n addTrack(t: Api.Track, pos?: number) {\n var track: Track = this.addTrack_NoUpdating(t, pos);\n if (pos !== undefined && pos !== this.tracks.length - 1)\n this.updateTracksState();\n this.contentView?.updateView();\n return track;\n }\n private addTrack_NoUpdating(t: Api.Track, pos?: number) {\n var track: Track = new Track({\n infoObj: t,\n _bind: {\n list: this,\n position: this.tracks.length,\n },\n });\n arrayInsert(this.tracks, track, pos);\n this.tracksSuffled?.push(track);\n this.contentView?.addItem(track, pos, false);\n return track;\n }\n\n loadEmpty() {\n this.contentView?.updateView();\n return (this.fetching = Promise.resolve());\n }\n /** Ensure the list is loaded */\n fetch(force?: boolean) {\n if (force) this.fetching = null;\n return (this.fetching = this.fetching ?? this.fetchImpl());\n }\n postToUser() {\n return (this.posting = this.posting || this._post());\n }\n async _post() {\n await user.waitLogin();\n if (this.apiid) throw new Error(\"cannot post: apiid exists\");\n var obj = this.getTrackListPutInfo();\n var resp: Api.TrackListPutResult = await api.post({\n path: \"users/me/lists/new\",\n obj: obj,\n });\n this.info!.id = resp.id;\n }\n private getTrackListPutInfo(): Api.TrackListPut {\n return {\n ...this.info!,\n trackids: this.fetching ? this.tracks.map((t) => t.id) : undefined,\n };\n }\n async getRealId(): Promise {\n if (this.apiid) return this.apiid;\n await this.postToUser();\n return this.apiid!;\n }\n put() {\n if (this.putDelaying) return this.putDelaying;\n this.putDelaying = this.putCore();\n }\n putDelaying: Promise | null = null;\n putInProgress: Promise | null = null;\n private async putCore() {\n try {\n if (this.putInProgress) await this.putInProgress;\n await sleepAsync(10);\n await user.waitLogin(true);\n if (this.fetching) await this.fetching;\n if (this.posting) await this.posting;\n if (!this.apiid) throw new Error(\"cannot put: no apiid\");\n } catch (error) {\n this.putDelaying = null;\n console.error(\"[TrackList] pre-put error\", error);\n }\n const origVersion = this.info!.version;\n try {\n [this.putInProgress, this.putDelaying] = [this.putDelaying, null];\n var obj = this.getTrackListPutInfo();\n this.info!.version++;\n await api.put({\n path: \"lists/\" + this.apiid,\n obj: obj,\n });\n } catch (error) {\n this.info!.version = origVersion;\n console.error(\"[TrackList] put error\", this, error);\n if (error instanceof Error && error.message == \"list_changed\") {\n Toast.show(\n I`Failed to sync playlist \"${this.name}\": the list was changed by other client. Please refresh and try again.` +\n \"\\n\" +\n error,\n 3000\n );\n } else {\n Toast.show(\n I`Failed to sync playlist \"${this.name}\".` + \"\\n\" + error,\n 3000\n );\n throw error;\n }\n } finally {\n this.putInProgress = null;\n }\n }\n async fetchImpl() {\n const li = new LoadingIndicator();\n this.setLoadIndicator(li);\n try {\n if (!this.apiid) throw new Error(\"Cannot fetch: no apiid\");\n const obj = await api.getListAsync(this.apiid);\n this.loadFromGetResult(obj);\n this.setLoadIndicator(null);\n } catch (err) {\n li.error(err, () => this.fetch(true));\n throw err;\n }\n if (!this.eventListening && this.apiid != null) {\n msgcli.listenEvent(\n \"l-\" + this.apiid,\n (data) => {\n console.info(data, this.version);\n if (typeof data.version == \"number\" && data.version == this.version)\n return;\n this.fetch(true);\n },\n true\n );\n }\n }\n async rename(newName: string) {\n this.info!.name = newName;\n this.onInfoChanged();\n await this.put();\n }\n onInfoChanged() {\n var newName = this.name!;\n var header = this.contentView?.header;\n if (header) header.updateWith({ title: newName });\n listIndex.onInfoChanged(this.id!, this.info!);\n }\n\n createView(): ContentView {\n return (this.contentView = this.contentView || new TrackListView(this));\n }\n getNextTrack(\n track: Track,\n loopMode: PlayingLoopMode,\n offset?: number\n ): Track | null {\n offset = offset ?? 1;\n var bind = track._bind;\n if (!bind) return null;\n var position = bind.position;\n if (bind?.list !== this) return null;\n if (this.listView)\n position =\n position ??\n this.listView.find((x) => x.track === track)?.position ??\n this.listView.find((x) => x.track.id === track.id)?.position;\n position = position ?? this.tracks.indexOf(track);\n if (position == null || position < 0)\n position = this.tracks.findIndex((x) => x.id === track.id);\n if (position == null || position < 0) return null;\n if (loopMode === \"list-seq\") {\n return this.tracks[position + offset] ?? null;\n } else if (loopMode === \"list-loop\") {\n return this.tracks[mod(position + offset, this.tracks.length)] ?? null;\n } else if (loopMode === \"list-shuffle\") {\n if (!this.tracksSuffled) {\n this.tracksSuffled = this.tracks.slice(0);\n shuffleArray(this.tracksSuffled);\n }\n var suffled = this.tracksSuffled;\n position = suffled.indexOf(track);\n if (!position || position < 0)\n position = suffled.findIndex((x) => x.id === track.id);\n return suffled[mod(position + offset, suffled.length)] ?? null;\n } else if (loopMode === \"track-loop\") {\n return track;\n } else {\n console.warn(\"[TrackList] unknown loopMode\", loopMode);\n }\n return null;\n }\n updateTracksFromListView() {\n this.updateTracksState();\n this.put();\n }\n private updateTracksState() {\n if (this.listView) {\n // if the listview exists, update `this.tracks` as well as the DOM.\n this.tracks = this.listView.map((lvi) => {\n lvi.track._bind!.position = lvi.position;\n lvi.updateDom();\n return lvi.track;\n });\n } else {\n this.tracks.forEach((t, i) => (t._bind!.position = i));\n }\n }\n\n updateTrackInfo(track: Track, newInfo: Api.Track) {\n track.updateFromApiTrack(newInfo);\n if (this.listView) this.listView.get(track._bind!.position!).updateDom();\n }\n remove(track: Track, put?: boolean) {\n this.remove_NoUpdating(track);\n this.updateTracksState();\n this.contentView?.updateView();\n if (put === undefined || put) this.put();\n }\n\n private remove_NoUpdating(track: Track) {\n var pos = track._bind!.position;\n if (pos == null) return;\n track._bind = undefined;\n this.tracks.splice(pos, 1);\n this.tracksSuffled?.remove(track);\n if (this.listView) this.listView.remove(pos);\n }\n}\n\nexport class TrackListView extends ListContentView {\n list: TrackList;\n listView: LazyListView;\n curPlaying = new ItemActiveHelper({\n funcSetActive: function (item, val) {\n item.updateWith({ playing: val });\n },\n });\n trackActionHandler: TrackActionHandler = {};\n currentTracking = false;\n scrollAnimator: ScrollAnimator | undefined = undefined;\n constructor(list: TrackList) {\n super();\n this.canMultiSelect = true;\n this.list = list;\n this.trackActionHandler.onTrackRemove = (items) =>\n items.forEach((x) => this.list.remove(x.track));\n this.trackActionHandler.canRemove = (items) => this.list.canEdit;\n }\n createHeader() {\n return new ContentHeader({\n catalog: () => I`Playlist`,\n title: this.list.name ?? \"\",\n titleEditable: !!this.list.rename,\n onTitleEdit: (newName) => this.list.rename(newName),\n });\n }\n protected appendHeader() {\n super.appendHeader();\n this.refreshBtn.onActive.add(() => {\n this.list.fetch(true);\n });\n }\n onShow() {\n super.onShow();\n this.shownEvents.add(playerCore.onTrackChanged, this.trackChanged);\n this.shownEvents.add(user.onSwitchedUser, () => {\n this.list.updateCanEdit();\n })(null);\n this.list.fetch();\n this.trackChanged();\n }\n onRemove() {\n super.onRemove();\n }\n onSidebarItemReactived() {\n this.centerCurrentTrack();\n }\n private centerCurrentTrack() {\n this.currentTracking = true;\n const current = this.curPlaying.current;\n if (current) {\n this.scrollAnimator?.scrollTo(\n current.dom.offsetTop + current.dom.offsetHeight / 2\n );\n }\n }\n protected appendListView() {\n super.appendListView();\n var lv = this.listView;\n lv.dom.classList.add(\"tracklistview\");\n this.list.listView = lv;\n lv.dragging = true;\n if (this.list.canEdit) lv.moveByDragging = true;\n lv.onItemMoved = () => this.list.updateTracksFromListView();\n lv.onItemClicked = (item) => {\n this.currentTracking = true;\n if (item.track === playerCore.track && playerCore.isPlaying) {\n router.nav(\"nowplaying\");\n return;\n }\n playerCore.playTrack(item.track);\n if (item.track.type == \"video\") {\n router.nav(\"nowplaying\");\n }\n };\n lv.selectionHelper.onSelectedItemsChanged.add((action, item) => {\n this.listView\n .get(item.position! - 1)\n ?.toggleClass(\"next-selected\", action === \"add\");\n this.listView\n .get(item.position! + 1)\n ?.toggleClass(\"prev-selected\", action === \"add\");\n });\n this.list.tracks.forEach((t) => this.addItem(t, undefined, false));\n if (this.list.loadIndicator)\n this.useLoadingIndicator(this.list.loadIndicator);\n this.updateView();\n\n this.scrollAnimator = new ScrollAnimator(this.scrollBox);\n this.scrollAnimator.posType = \"center\";\n }\n addItem(t: Track, pos?: number, updateView?: boolean) {\n var item = this.createViewItem(t);\n this.listView.add(item, pos);\n this.updateCurPlaying(item);\n if (updateView == null || updateView) this.updateView();\n }\n protected createViewItem(t: Track) {\n var view = new TrackViewItem(t);\n view.actionHandler = this.trackActionHandler;\n return view;\n }\n protected updateCurPlaying(item?: TrackViewItem) {\n const playing = playerCore.track;\n if (item === undefined) {\n if (playing) {\n const identical =\n playing._bind?.list === this.list &&\n playing._bind.position != undefined\n ? this.listView.get(playing._bind.position)\n : (playing && this.listView.find((x) => x.track === playing)) ??\n this.listView.find((x) => x.track.id === playing.id);\n this.curPlaying.set(identical);\n } else {\n this.curPlaying.set(null);\n }\n } else if (playing) {\n const track = item.track;\n if (\n track === playing ||\n (!this.curPlaying.current && track.id === playing.id)\n ) {\n this.curPlaying.set(item);\n }\n }\n }\n private trackChanged = () => {\n this.updateCurPlaying();\n if (this.currentTracking) {\n this.centerCurrentTrack();\n }\n };\n}\n\nexport class TrackViewItem extends ListViewItem {\n track: Track;\n //@ts-expect-error\n dom: HTMLDivElement;\n viewPos: TextView;\n actionHandler: TrackActionHandler | null = null;\n noPos: boolean = false;\n playing: boolean = false;\n constructor(item: Track) {\n super();\n this.track = item;\n }\n get dragData() {\n return `${this.track.name} - ${this.track.artist}`;\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"li.item.trackitem.no-selection\",\n tabIndex: 0,\n child: [\n {\n tag: \"div.picbox\",\n child: [\n {\n tag: \"img.pic\",\n loading: \"lazy\",\n height: 128,\n width: 128,\n update: (dompic: HTMLImageElement) => {\n let bg = \"\";\n if (this.track.thumburl) {\n bg = api.processUrl(this.track.thumburl) ?? \"\";\n }\n if (bg != dompic.src) dompic.src = bg;\n toggleClass(dompic, \"nopic\", !bg);\n },\n },\n (this.viewPos = new TextView({\n tag: \"span.pos\",\n })),\n ],\n },\n { tag: \"span.name\", text: () => this.track.name },\n { tag: \"span.artist\", text: () => this.track.artist },\n { tag: \"span.duration\", text: () => formatDuration(this.track.length) },\n ],\n draggable: true,\n _item: this,\n };\n }\n updateDom() {\n super.updateDom();\n this.toggleClass(\"selected\", !!this.selected);\n\n if (this.playing) {\n this.viewPos.removeAllView();\n this.viewPos.text = \"\";\n this.viewPos.appendView(new Icon({ icon: svgPlayArrow }));\n } else if (!this.noPos) {\n this.viewPos.text =\n this.track._bind?.position != null\n ? (this.track._bind.position + 1).toString()\n : \"\";\n }\n this.viewPos.toggleClass(\"withpic\", !!this.track.thumburl);\n this.viewPos.hidden = this.noPos && !this.playing;\n }\n onContextMenu = (item: TrackViewItem, ev: MouseEvent) => {\n var selected: TrackViewItem[] =\n item.selected && item.selectionHelper\n ? item.selectionHelper.selectedItems\n : [item];\n trackContextMenu(\n selected.map((x) => x.track),\n ev,\n selected\n );\n };\n}\n\nexport interface TrackActionHandler {\n /** When undefined, the item is not removable */\n onTrackRemove?(arr: T[]);\n canRemove?(arr: T[]): boolean;\n}\n\n/**\n * Randomize array in-place using Durstenfeld shuffle algorithm\n * @see https://stackoverflow.com/a/12646864\n */\nfunction shuffleArray(array: any[]) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Math.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n}\n","// file: Uploads.ts\n\nimport { Track } from \"./Track\";\nclass UploadTrack extends Track {\n constructor(init: Partial) {\n super(init);\n this._bind = {\n list: uploads,\n };\n }\n get canEdit() {\n return this._upload.state === \"done\";\n }\n setState(state: UploadTrack[\"_upload\"][\"state\"]) {\n this._upload.state = state;\n this._upload.view?.updateDom();\n }\n _upload: {\n view?: UploadViewItem;\n progress?: number;\n state:\n | \"pending\"\n | \"uploading\"\n | \"processing\"\n | \"error\"\n | \"done\"\n | \"cancelled\";\n // With prefix \"uploads_\", these are i18n keys\n\n file?: File;\n cancelToken?: CancelToken;\n };\n}\n\nimport { TrackList, TrackListView, TrackViewItem } from \"./TrackList\";\nimport { Semaphore, DataUpdatingHelper, CancelToken } from \"../Infra/utils\";\nimport { ListIndexViewItem } from \"./ListIndex\";\nimport { user } from \"../API/User\";\nimport { Api } from \"../API/apidef\";\nimport {\n LoadingIndicator,\n View,\n Toast,\n MessageBox,\n TextView,\n LazyListView,\n Ref,\n buildDOM,\n formatFileSize,\n objectApply,\n} from \"../Infra/viewlib\";\nimport { router } from \"../Infra/Router\";\nimport { I, i18n } from \"../I18n/I18n\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { ui } from \"../Infra/UI\";\nimport { api } from \"../API/Api\";\nimport { ContentHeader } from \"../Infra/ui-views\";\n\nexport const uploads = new (class extends TrackList {\n tracks: UploadTrack[] = [];\n state: false | \"waiting\" | \"fetching\" | \"fetched\" = false;\n get canEdit() {\n return false;\n }\n inprogress = 0;\n unreadError = false;\n private uploadSemaphore = new Semaphore({ maxCount: 2 });\n init() {\n this.sidebarItem = new ListIndexViewItem({ text: () => I`My Uploads` });\n router.addRoute({\n path: [\"uploads\"],\n sidebarItem: () => this.sidebarItem,\n contentView: () => this.view,\n });\n ui.sidebarList.addFeatureItem(this.sidebarItem);\n user.onSwitchedUser.add((_) => {\n if (this.state !== false && this.state !== \"waiting\") {\n this.tracks = [];\n this.state = false;\n if (this.view.rendered) {\n this.view.listView.removeAll();\n this.view.updateView();\n }\n setTimeout(() => this.fetch(true), 1);\n }\n });\n user.onSwitchedUser.add(() => {\n this.sidebarItem.hidden = user.state != \"logged\";\n })(null);\n playerCore.onTrackChanged.add(() => {\n this.sidebarItem.updateWith({\n playing: !!this.tracks.find((x) => x === playerCore.track),\n });\n });\n api.onTrackInfoChanged.add((newer: Api.Track) => {\n this.tracks.forEach((t) => {\n if (t.id === newer.id) {\n t.updateFromApiTrack(newer);\n t._upload.view?.updateDom();\n }\n });\n });\n api.onTrackDeleted.add((deleted) => {\n var track = this.tracks.find((x) => x.id === deleted.id);\n if (track) this.remove(track);\n });\n }\n sidebarItem: ListIndexViewItem;\n view = new (class extends TrackListView {\n uploadArea: UploadArea;\n listView: LazyListView;\n usage = new TextView({ tag: \"span.uploads-usage\" });\n\n protected appendHeader() {\n this.title = () => I`My Uploads`;\n super.appendHeader();\n this.uploadArea = new UploadArea({\n onfile: (file) => uploads.uploadFile(file),\n });\n this.header.appendView(this.uploadArea);\n\n this.trackActionHandler.canRemove = () => true;\n this.trackActionHandler.onTrackRemove = (items: UploadViewItem[]) => {\n if (items.length === 1) {\n this.removeTrack(items[0]);\n } else {\n new MessageBox()\n .setTitle(I`Warning`)\n .addText(\n I`Are you sure to delete ${items.length} tracks permanently?`\n )\n .addResultBtns([\"cancel\", \"ok\"])\n .allowCloseWithResult(\"cancel\")\n .showAndWaitResult()\n .then((r) => {\n if (r !== \"ok\") return;\n items.forEach((x) => this.removeTrack(x, true));\n });\n }\n };\n }\n createHeader() {\n var header = new ContentHeader({\n title: this.title,\n });\n header.titlebar.appendView(this.usage);\n return header;\n }\n onShow() {\n super.onShow();\n if (uploads.unreadError) {\n uploads.unreadError = false;\n uploads.updateSidebarItem();\n }\n }\n protected appendListView() {\n super.appendListView();\n if (!uploads.state) uploads.fetch();\n }\n updateUsage() {\n var original = 0;\n var converted = 0;\n uploads.tracks.forEach((x) => {\n x.files?.forEach((f) => {\n if (!f.profile) original += f.size ?? 0;\n else converted += f.size ?? 0;\n });\n });\n this.usage.text = original\n ? `(${uploads.tracks.length}, ${formatFileSize(original)})`\n : \"\";\n this.usage.dom.title =\n `Tracks count: ${uploads.tracks.length}\\n` +\n `Total original files size: ${formatFileSize(original)}\\n` +\n `Total converted files size: ${formatFileSize(converted)}`;\n }\n updateView() {\n super.updateView();\n this.updateUsage();\n }\n createViewItem(t: Track) {\n const item = new UploadViewItem(t as UploadTrack);\n item.actionHandler = this.trackActionHandler;\n return item;\n }\n async removeTrack(item: UploadViewItem, noPrompt?: boolean) {\n const track = item.track;\n if (\n track._upload.state === \"uploading\" ||\n track._upload.state === \"pending\"\n ) {\n track._upload.state = \"cancelled\";\n track._upload.cancelToken!.cancel();\n uploads.remove(track);\n } else if (track._upload.state === \"error\") {\n uploads.remove(track);\n } else if (track._upload.state === \"done\") {\n if (\n !noPrompt &&\n (await new MessageBox()\n .setTitle(I`Warning`)\n .addText(I`Are you sure to delete the track permanently?`)\n .addResultBtns([\"cancel\", \"ok\"])\n .allowCloseWithResult(\"cancel\")\n .showAndWaitResult()) !== \"ok\"\n )\n return;\n try {\n await api.delete({\n path: \"tracks/\" + track.id,\n });\n } catch (error) {\n Toast.show(I`Failed to remove track.` + \"\\n\" + error);\n return;\n }\n api.onTrackDeleted.invoke(track);\n } else {\n console.error(\n \"[Uploads] Unexpected track._upload.state\",\n track._upload.state\n );\n return;\n }\n }\n })(this);\n private insertTrack(t: UploadTrack, pos = 0, updateview?: boolean) {\n this.tracks.splice(pos, 0, t);\n if (this.view.rendered) this.view.addItem(t, pos, updateview);\n }\n remove(track: UploadTrack) {\n var pos = this.tracks.indexOf(track);\n if (pos === -1) return;\n this.tracks.splice(pos, 1);\n track._upload.view?.remove();\n }\n async fetchImpl() {\n this.state = \"waiting\";\n var li = new LoadingIndicator();\n li.content = I`Logging in`;\n this.view.useLoadingIndicator(li);\n try {\n await user.waitLogin(true);\n this.state = \"fetching\";\n li.reset();\n var fetched = ((await api.get(\"my/uploads\"))[\"tracks\"] as any[]).map(\n (t) => {\n return new UploadTrack({\n infoObj: t,\n _upload: { state: \"done\" },\n });\n }\n );\n this.state = \"fetched\";\n } catch (error) {\n li.error(error, () => this.fetchImpl());\n return;\n }\n const thiz = this;\n var doneTracks = this.tracks.filter((t) => t._upload.state === \"done\");\n var firstPos = this.tracks.findIndex((t) => t._upload.state !== \"done\") + 1;\n new (class extends DataUpdatingHelper {\n items = doneTracks;\n addItem(data: UploadTrack, pos: number) {\n thiz.insertTrack(data, firstPos, false);\n }\n updateItem(item: UploadTrack, data: UploadTrack) {\n item.updateFromApiTrack(data.infoObj!);\n }\n removeItem(item: UploadTrack) {\n item._upload.view?.remove();\n }\n })().update(fetched);\n this.view.useLoadingIndicator(null);\n this.view.updateView();\n }\n async uploadFile(file: File) {\n var apitrack: Api.Track = {\n id: undefined!,\n url: undefined!,\n artist: \"Unknown\",\n name: file.name,\n };\n var track = new UploadTrack({\n infoObj: apitrack,\n blob: file,\n _upload: {\n state: \"pending\",\n cancelToken: new CancelToken(),\n },\n });\n this.insertTrack(track);\n\n this.inprogress++;\n this.updateSidebarItem();\n\n await this.uploadSemaphore.enter();\n try {\n if (track._upload.state === \"cancelled\") return null;\n\n await this.uploadCore(apitrack, track, file);\n } catch (err) {\n if (track._upload.state === \"cancelled\") return null;\n track.setState(\"error\");\n Toast.show(I`Failed to upload file \"${file.name}\".` + \"\\n\" + err, 3000);\n console.warn(\"[Uploads] uploads failed: \", file.name, err);\n if (uploads.view.isVisible == false) {\n this.unreadError = true;\n // will update sidebarItem later\n }\n throw err;\n } finally {\n this.inprogress--;\n this.updateSidebarItem();\n this.uploadSemaphore.exit();\n }\n if (this.view.rendered) this.view.updateUsage();\n return track;\n }\n\n private async uploadCore(\n apitrack: Api.Track,\n track: UploadTrack,\n file: File\n ) {\n track.setState(\"uploading\");\n\n const ct = track._upload.cancelToken!;\n\n const uploadReq = (await api.post({\n path: \"tracks/uploadrequest\",\n obj: {\n filename: file.name,\n size: file.size,\n } as Api.UploadRequest,\n })) as Api.UploadParameters;\n\n ct.throwIfCancelled();\n\n var respTrack: Api.Track;\n\n var onprogerss = (ev) => {\n if (ev.lengthComputable) {\n track._upload.progress = ev.loaded / ev.total;\n track._upload.view?.updateDom();\n }\n };\n\n if (uploadReq.mode === \"direct\") {\n const jsonBlob = new Blob([JSON.stringify(apitrack)]);\n const finalBlob = new Blob([\n BlockFormat.encodeBlock(jsonBlob),\n BlockFormat.encodeBlock(file),\n ]);\n const xhr = await api.upload({\n method: \"POST\",\n url: \"tracks/newfile\",\n body: finalBlob,\n auth: api.defaultAuth!,\n contentType: \"application/x-mcloud-upload\",\n cancelToken: ct,\n onprogerss,\n }).complete;\n ct.throwIfCancelled();\n respTrack = JSON.parse(xhr.responseText);\n } else if (uploadReq.mode === \"put-url\") {\n console.info(\"[Uploads] uploading to url\", uploadReq);\n\n const xhr = await api.upload({\n method: uploadReq.method,\n url: uploadReq.url,\n body: file,\n cancelToken: ct,\n onprogerss,\n }).complete;\n\n console.info(\"[Uploads] posting result to api\");\n track.setState(\"processing\");\n respTrack = (await api.post({\n path: \"tracks/uploadresult\",\n obj: {\n url: uploadReq.url,\n filename: file.name,\n tag: uploadReq.tag,\n } as Api.UploadResult,\n })) as Api.Track;\n ct.throwIfCancelled();\n } else {\n throw new Error(\"Unknown upload mode\");\n }\n track.infoObj = respTrack;\n track.setState(\"done\");\n }\n\n updateSidebarItem() {\n this.sidebarItem.text = this.inprogress\n ? I`My Uploads` + ` (${this.inprogress})`\n : I`My Uploads`;\n if (this.unreadError) this.sidebarItem.text += \" (!!)\";\n this.sidebarItem.updateDom();\n }\n})();\n\nclass UploadViewItem extends TrackViewItem {\n track: UploadTrack;\n // noPos = true;\n domstate: HTMLElement;\n _lastUploadState: string;\n constructor(track: UploadTrack) {\n super(track);\n track._upload.view = this;\n }\n postCreateDom() {\n super.postCreateDom();\n this.dom.classList.add(\"uploads-item\");\n this.dom.appendChild(\n (this.domstate = buildDOM({ tag: \"span.uploads-state\" }))\n );\n }\n updateDom() {\n super.updateDom();\n var newState = this.track._upload.state;\n if (this._lastUploadState != newState) {\n if (this._lastUploadState)\n this.dom.classList.remove(\"state-\" + this._lastUploadState);\n if (newState) this.dom.classList.add(\"state-\" + newState);\n if (\n this.track._upload.state === \"uploading\" &&\n this.track._upload.progress !== undefined\n ) {\n this.domstate.textContent =\n (this.track._upload.progress * 100).toFixed(0) + \"%\";\n } else {\n this.domstate.textContent = i18n.get(\"uploads_\" + newState);\n }\n this.dragging = newState === \"done\";\n }\n }\n}\n\nclass UploadArea extends View {\n onfile: (file: File) => void;\n private domfile = new Ref();\n constructor(init: Partial) {\n super();\n objectApply(this, init);\n }\n createDom() {\n return {\n tag: \"div.upload-area.clickable\",\n tabIndex: 0,\n child: [\n {\n tag: \"div.text.no-selection\",\n text: () => I`Click here to select files to upload`,\n },\n {\n tag: \"div.text.no-selection\",\n text: () => I`or drag files to this zone...`,\n },\n {\n tag: \"input\",\n type: \"file\",\n ref: this.domfile,\n style: \"visibility: collapse; height: 0;\",\n accept: \"audio/*\",\n multiple: true,\n },\n ],\n };\n }\n postCreateDom() {\n this.domfile.value!.addEventListener(\"change\", (ev) => {\n if (this.domfile.value!.files)\n this.handleFiles(this.domfile.value!.files);\n });\n this.onActive.add((ev) => {\n this.domfile.value!.click();\n });\n this.dom.addEventListener(\"dragover\", (ev) => {\n if (!ev.dataTransfer) return;\n if (ev.dataTransfer.types.indexOf(\"Files\") >= 0) {\n ev.preventDefault();\n ev.stopPropagation();\n ev.dataTransfer.dropEffect = \"copy\";\n }\n });\n this.dom.addEventListener(\"drop\", (ev) => {\n if (!ev.dataTransfer) return;\n ev.preventDefault();\n ev.stopPropagation();\n if (ev.dataTransfer.types.indexOf(\"Files\") >= 0) {\n this.handleFiles(ev.dataTransfer.files);\n }\n });\n }\n private handleFiles(files: FileList) {\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n console.log(\"[Uploads] drop file\", { name: file.name, size: file.size });\n this.onfile?.(file);\n }\n }\n}\n\nvar BlockFormat = {\n encodeBlock(blob: Blob): Blob {\n return new Blob([BlockFormat.encodeLen(blob.size), blob]);\n },\n encodeLen(len: number): string {\n var str = \"\";\n for (var i = 0; i < 8; i++) {\n str = \"0123456789aBcDeF\"[(len >> (i * 4)) & 0x0f] + str;\n }\n str += \"\\r\\n\";\n return str;\n },\n};\n","// file: ListIndex.ts\n\nimport {\n ListView,\n Section,\n LoadingIndicator,\n ContextMenu,\n MenuItem,\n MenuInfoItem,\n Toast,\n i18n,\n jsx,\n jsxBuild,\n SectionAction,\n clearChildren,\n createName,\n objectApply,\n appendView,\n} from \"../Infra/viewlib\";\nimport { BuildDomExpr, View } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { TrackList, TrackViewItem, TrackListView } from \"./TrackList\";\nimport { user } from \"../API/User\";\nimport { Api } from \"../API/apidef\";\nimport { router } from \"../Infra/Router\";\nimport { ui } from \"../Infra/UI\";\nimport {\n SidebarItem,\n setScrollableShadow,\n CopyMenuItem,\n Icon,\n} from \"../Infra/ui-views\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { api } from \"../API/Api\";\nimport { uploads } from \"./Uploads\";\nimport svgAudio from \"../../resources/audiotrack-24px.svg\";\nimport svgAdd from \"../../resources/add-24px.svg\";\n\nexport class ListIndex {\n loadedList: { [x: number]: TrackList } = {};\n listView: ListView;\n section: Section;\n loadIndicator = new LoadingIndicator();\n playing: TrackList | null = null;\n constructor() {\n this.listView = new ListView({ tag: \"ul\" });\n this.listView.dragging = true;\n this.listView.moveByDragging = true;\n this.listView.onItemMoved = (item, from) => {\n this.putUser();\n };\n this.listView.onDragover = (arg) => {\n const src = arg.source;\n const data = arg.event.dataTransfer;\n if (!data) return;\n if (src instanceof TrackViewItem) {\n arg.accept = true;\n data.dropEffect = \"copy\";\n if (arg.drop) {\n const list = this.getList(arg.target.listInfo.id);\n list\n .fetch()\n .then((r) => {\n for (const item of arg.sourceItems as TrackViewItem[]) {\n list.addTrack(\n item.track.toApiTrack(),\n arg.event.altKey ? undefined : 0\n );\n }\n return list.put();\n })\n .catch((err) => {\n console.error(\"[ListIndex] error adding track:\", err);\n });\n }\n } else if (data.files.length > 0) {\n data.effectAllowed = \"copy\";\n arg.accept = true;\n if (arg.drop) {\n const list = this.getList(arg.target.listInfo.id);\n for (let i = 0; i < data.files.length; i++) {\n const file = data.files[i];\n uploads\n .uploadFile(file)\n .then(async (track) => {\n if (!track) return;\n await list.fetch();\n list.addTrack(\n track.toApiTrack(),\n arg.event.altKey ? undefined : 0\n );\n await list.put();\n })\n .catch((err) => {\n console.error(\"[ListIndex] error adding track:\", err);\n });\n }\n }\n }\n };\n this.listView.onItemClicked = (item) => {\n if (ui.sidebarList.currentActive.current === item) {\n item.contentView?.onSidebarItemReactived();\n return;\n }\n ui.sidebarList.setActive(item);\n this.showTracklist(item.listInfo.id);\n };\n }\n private putUser() {\n user.setListids(this.listView.map((l) => l.listInfo.id));\n }\n\n init() {\n playerCore.onTrackChanged.add(() => {\n var curPlaying = playerCore.track?._bind?.list ?? null;\n if (curPlaying != this.playing) {\n if (curPlaying?.id)\n this.getViewItem(curPlaying.id)?.updateWith({ playing: true });\n if (this.playing?.id)\n this.getViewItem(this.playing.id)?.updateWith({ playing: false });\n this.playing = curPlaying;\n }\n });\n api.onTrackInfoChanged.add((newer: Api.Track) => {\n for (const id in this.loadedList) {\n if (this.loadedList.hasOwnProperty(id)) {\n const list = this.loadedList[id];\n list.tracks.forEach((t) => {\n if (t.id === newer.id) {\n list.updateTrackInfo(t, newer);\n }\n });\n }\n }\n });\n api.onTrackDeleted.add((deleted) => {\n for (const id in this.loadedList) {\n if (this.loadedList.hasOwnProperty(id)) {\n const list = this.loadedList[id];\n list.tracks.forEach((t) => {\n if (t.id === deleted.id) {\n list.remove(t, false);\n }\n });\n }\n }\n });\n this.section = new Section({\n title: () => I`Playlists`,\n content: this.listView,\n });\n const icon = new Icon({ icon: svgAdd });\n icon.dom.style.fontSize = \"1.4em\";\n this.section.addAction(\n jsxBuild(\n jsx(\n SectionAction,\n {\n onActive: () => {\n this.newTracklist();\n },\n },\n [icon]\n )\n )\n );\n ui.sidebarList.container.appendView(this.section);\n ui.sidebar.dom.addEventListener(\n \"scroll\",\n (ev) => {\n if (ev.eventPhase === Event.AT_TARGET) {\n var firstHeader = ui.sidebar.header.dom;\n var secondHeader = this.section.headerView.dom;\n if (\n secondHeader.offsetTop <=\n firstHeader.offsetTop + firstHeader.offsetHeight\n ) {\n setScrollableShadow(firstHeader, 0);\n secondHeader.style.zIndex = \"\";\n } else {\n setScrollableShadow(firstHeader, ui.sidebar.dom.scrollTop);\n secondHeader.style.zIndex = \"4\";\n }\n setScrollableShadow(\n secondHeader,\n secondHeader.offsetTop +\n secondHeader.offsetHeight -\n this.listView.dom.offsetTop\n );\n }\n },\n { passive: true }\n );\n this.listView.scrollBox = ui.sidebar.dom;\n router.addRoute({\n path: [\"list\"],\n onNav: async (arg) => {\n await user.waitLogin(false);\n var id = window.parseInt(arg.remaining[0]);\n var list = this.getList(id);\n var content = list.createView();\n ui.content.setCurrent(content);\n var item = this.getViewItem(id);\n ui.sidebarList.setActive(item);\n if (!item) {\n await list.fetch();\n item = this.addListInfo(list.info!);\n if (user.state == \"logged\") this.putUser();\n }\n item.contentView = content;\n },\n });\n\n let initialPlayingList: number | null = null;\n user.onSwitchedUser.add((userInfo) => {\n if (userInfo) {\n this.setIndex({ lists: userInfo.lists! });\n initialPlayingList = userInfo.playing?.listid ?? null;\n } else {\n this.setIndex(null);\n }\n });\n router.addRoute({\n path: [\"\"],\n onNav: async (arg) => {\n if (await user.waitLogin(false)) {\n let id: number | null = null;\n if (initialPlayingList !== null) {\n id = initialPlayingList;\n } else if (this.listView.length > 0) {\n id = this.listView.get(0).listInfo.id;\n }\n if (id !== null) {\n router.nav(\n id === 0 ? [\"uploads\"] : [\"list\", id.toString()],\n { pushState: false },\n );\n }\n }\n },\n });\n }\n setIndex(index: Api.TrackListIndex | null) {\n this.listView.clear();\n for (const item of index?.lists ?? []) {\n this.addListInfo(item);\n }\n }\n addListInfo(listinfo: Api.TrackListInfo) {\n var item = new ListIndexViewItem({\n index: this,\n listInfo: listinfo,\n playing: listinfo.id === playerCore.track?._bind?.list?.id,\n });\n this.listView.add(item);\n var curContent = ui.content.current;\n if (\n curContent instanceof TrackListView &&\n curContent.list?.id === listinfo.id\n )\n ui.sidebarList.setActive(item);\n return item;\n }\n getListInfo(id: number) {\n return this.getViewItem(id)?.listInfo;\n }\n getList(id: number) {\n var list = this.loadedList[id];\n if (!list) {\n list = new TrackList();\n const listInfo = this.getListInfo(id);\n if (listInfo) {\n list.loadInfo(listInfo);\n if (!list.apiid) list.loadEmpty();\n } else {\n list.loadApiId(id);\n }\n this.loadedList[id] = list;\n }\n return list;\n }\n getViewItem(id: number) {\n return this.listView.find((lvi) => lvi.listInfo.id === id);\n }\n showTracklist(id: number) {\n router.nav([\"list\", id.toString()]);\n }\n onInfoChanged(id: number, info: Api.TrackListInfo) {\n var lvi = this.getViewItem(id);\n if (lvi) {\n objectApply(lvi.listInfo, info);\n lvi.updateDom();\n }\n }\n\n async removeList(id: number) {\n if (id < 0) {\n id = await this.getList(id).getRealId();\n }\n await api.delete({\n path: \"my/lists/\" + id,\n });\n this.getViewItem(id)?.remove();\n const curContent = ui.content.current;\n if (curContent instanceof TrackListView && curContent.list.id === id) {\n ui.content.setCurrent(null);\n }\n }\n\n private nextId = -100;\n private _toastLogin: Toast;\n /**\n * Create a Tracklist with an temporary local ID (negative number).\n * It should be sync to server and get a real ID later.\n */\n async newTracklist() {\n if (!(await user.waitLogin(false))) {\n this._toastLogin =\n this._toastLogin || new Toast({ text: I`Login to create playlists.` });\n this._toastLogin.show(3000);\n return;\n }\n var id = this.nextId--;\n var list: Api.TrackListInfo = {\n id,\n owner: user.id,\n name: createName(\n (x) => (x ? I`New Playlist (${x + 1})` : I`New Playlist`),\n (x) => !!this.listView.find((l) => l.listInfo.name === x)\n ),\n visibility: 0,\n version: 0,\n };\n this.addListInfo(list);\n var listview = this.getList(id);\n listview.postToUser().then(\n () => {\n list.id = listview.apiid!;\n },\n (err) => {\n Toast.show(\n I`Failed to create playlist \"${list.name}\".` + \"\\n\" + err,\n 5000\n );\n }\n );\n }\n}\n\nexport class ListIndexViewItem extends SidebarItem {\n index: ListIndex;\n listInfo: Api.TrackListInfo;\n viewState: View | null = null;\n playing = false;\n constructor(init: Partial) {\n super({});\n objectApply(this, init);\n }\n protected createDom(): BuildDomExpr {\n return {\n tag: \"li.item.indexitem.no-selection\",\n tabIndex: 0,\n child: [\n { _id: \"tag\", tag: \"span.tag\" },\n {\n tag: \"span.name.flex-1\",\n text: () => this.listInfo?.name ?? this.text,\n },\n ],\n };\n }\n updateDom() {\n super.updateDom();\n var domtag = this.getDomById(\"tag\")!;\n var tagText =\n !this.listInfo || this.listInfo.visibility == 0\n ? \"\"\n : this.listInfo.owner == user.id && this.listInfo.visibility == 1\n ? I`my_visibility_1`\n : this.listInfo.ownerName;\n domtag.textContent = tagText ?? \"\";\n domtag.style.display = tagText ? \"block\" : \"none\";\n this.dom.style.paddingTop = tagText ? \"6px\" : \"\";\n this.dom.style.paddingBottom = tagText ? \"20px\" : \"\";\n if (this.playing && !this.viewState) {\n this.viewState = new View({\n tag: \"span.state\",\n child: new Icon({ icon: svgAudio }),\n });\n this.appendView(this.viewState);\n } else if (!this.playing && this.viewState) {\n this.removeView(this.viewState);\n this.viewState = null;\n }\n }\n onContextMenu = (item: ListIndexViewItem, ev: MouseEvent) => {\n var m = new ContextMenu();\n if (this.index && this.listInfo) {\n if (this.listInfo.visibility == 1) {\n m.add(\n new CopyMenuItem({\n text: I`Copy link`,\n textToCopy: api.appBaseUrl + \"#list/\" + this.listInfo.id,\n })\n );\n }\n if (this.listInfo.owner == user.id) {\n const targetVisibility = this.listInfo.visibility ? 0 : 1;\n m.add(\n new MenuItem({\n text: i18n.get(\"make_it_visibility_\" + targetVisibility),\n onActive: () => {\n const list = this.index.getList(item.listInfo.id);\n list.info!.visibility = targetVisibility;\n list.onInfoChanged();\n list.put();\n },\n })\n );\n }\n m.add(\n new MenuItem({\n text: I`Remove`,\n cls: \"dangerous\",\n onActive: () => {\n this.index.removeList(this.listInfo.id);\n },\n })\n );\n }\n if (this.listInfo)\n m.add(\n new MenuInfoItem({\n text: I`List ID` + \": \" + this.listInfo.id,\n })\n );\n if (m.length) {\n ev.preventDefault();\n ui.showContextMenuForItem([item], m, { ev: ev });\n }\n };\n}\n\nexport const listIndex = new ListIndex();\n","// file: User.ts\n\nimport {\n SettingItem,\n Callbacks,\n Action,\n TextCompositionWatcher,\n LoadingIndicator,\n i18n,\n} from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { listIndex } from \"../Track/ListIndex\";\nimport {\n Dialog,\n View,\n TextBtn,\n LabeledInput,\n TextView,\n ButtonView,\n Toast,\n base64EncodeUtf8,\n buildDOM,\n objectApply,\n Ref,\n FileSelector,\n} from \"../Infra/viewlib\";\nimport { Api } from \"./apidef\";\nimport { ui } from \"../Infra/UI\";\nimport { api } from \"./Api\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { uploads } from \"../Track/Uploads\";\nimport { TrackList } from \"../Track/TrackList\";\nimport { Track } from \"../Track/Track\";\nimport { settingsUI } from \"../Settings/SettingsUI\";\n\nexport const user = new (class User {\n siLogin = new SettingItem(\"mcloud-login\", \"json\", {\n id: -1,\n username: null! as string,\n passwd: undefined as string | undefined,\n token: null! as string,\n avatar: undefined as string | undefined,\n lastBaseUrl: null! as string,\n });\n loginDialog: LoginDialog;\n readonly info = this.siLogin.data;\n get id() {\n return this.info.id;\n }\n\n role?: Api.UserInfo[\"role\"];\n get isAdmin() {\n return this.role === \"admin\";\n }\n\n private _serverOptions: Api.ServerConfig = {};\n get serverOptions() {\n return this._serverOptions;\n }\n\n state: \"none\" | \"logging\" | \"error\" | \"logged\" = \"none\";\n onSwitchedUser = new Callbacks>();\n onApiReady = new Callbacks();\n isApiReady = false;\n loggingin: Promise | null = null;\n pendingInfo: User[\"info\"] | null = null;\n setState(state: User[\"state\"]) {\n this.state = state;\n ui.sidebarLogin.update();\n }\n init() {\n this.onApiReady.add(() => {\n this.isApiReady = true;\n console.info('[User] api ready.');\n });\n playerCore.onTrackChanged.add(() => this.playingTrackChanged());\n const preLogin = window[\"preload\"]?.preLoginTask;\n if (window[\"preload\"]?.[\"inputToken\"]) {\n this.info.token = window[\"preload\"][\"inputToken\"];\n }\n if (this.info.username || this.info.token || preLogin) {\n this.login(preLogin ? { preLogin: preLogin } : { info: this.info }).then(\n null,\n (err) => {\n Toast.show(I`Failed to login.` + \"\\n\" + err, 5000);\n }\n );\n } else {\n this.setState(\"none\");\n this.openUI();\n }\n\n if (window.location.href.indexOf(\"#social-link-success\") >= 0) {\n window.history.replaceState(\n null,\n \"\",\n window.location.href.split(\"#social-link-success\")[0]\n );\n Toast.show(I`Account has been linked successfully.`, 5000);\n new LoginSettingsDialog().show();\n }\n if (window.location.href.indexOf(\"#social-link-error\") >= 0) {\n var splits = window.location.href.split(\"#social-link-error=\");\n window.history.replaceState(null, \"\", splits[0]);\n var error = splits[1];\n Toast.show(\n I`Account linking error: ${i18n.get(\"social-link-error_\" + error)}`,\n 5000\n );\n new LoginSettingsDialog().show();\n }\n }\n openUI(login?: boolean, ev?: MouseEvent) {\n login = login ?? this.state !== \"logged\";\n if (login) {\n if (!this.loginDialog) this.loginDialog = new LoginDialog();\n this.loginDialog.show(ev);\n } else {\n new MeDialog().show(ev);\n }\n }\n closeUI() {\n this.loginDialog?.close();\n }\n getBasicAuth(info: Api.UserInfo) {\n return \"Basic \" + base64EncodeUtf8(info.username + \":\" + info.passwd);\n }\n getBearerAuth(token: string) {\n return \"Bearer \" + token;\n }\n async login(arg: { info?: Api.UserInfo; preLogin?: Promise; isAutoLogin?: boolean }) {\n if (this.state !== \"logged\") this.setState(\"logging\");\n this.isApiReady = false;\n // try GET `api/users/me` using the new info\n var promise = (async () => {\n let resp: Api.UserInfo;\n try {\n if (arg.isAutoLogin && this.info.token) {\n api.defaultAuth = this.getBearerAuth(this.info.token);\n this.onApiReady.invoke();\n }\n if (arg.info) {\n const info = arg.info;\n const token = info.token;\n console.info({ info, token });\n resp = token\n ? await api.get(\"users/me\")\n : await api.post({\n path: \"users/me/login\",\n auth: this.getBasicAuth(info),\n });\n } else if (arg.preLogin) {\n resp = await arg.preLogin;\n } else {\n throw new Error(\"Unexpected login argument\");\n }\n } catch (err) {\n if (this.state !== \"logged\") this.setState(\"error\");\n if (err.message === \"user_not_found\")\n throw new Error(I`Username or password is not correct.`);\n throw err;\n } finally {\n this.pendingInfo = null;\n }\n await this.handleLoginResult(resp);\n })();\n this.loggingin = promise;\n await promise;\n }\n async register(info: Api.UserInfo) {\n this.setState(\"logging\");\n var promise = (async () => {\n var resp = await api.post({\n path: \"users/new\",\n obj: info,\n });\n if (resp.error) {\n this.setState(\"error\");\n if (resp.error === \"dup_user\")\n throw new Error(I`A user with the same username exists`);\n throw new Error(resp.error);\n }\n await this.handleLoginResult(resp);\n })();\n this.loggingin = promise;\n await promise;\n }\n async handleLoginResult(info: Api.UserInfo) {\n if (!info.username || !info.id) throw new Error(I`iNTernEL eRRoR`);\n var switchingUser = this.info.username != info.username;\n this.info.id = info.id;\n this.info.username = info.username;\n this.info.avatar = info.avatar ?? undefined;\n this.info.passwd = undefined;\n if (info.token) this.info.token = info.token;\n this.info.lastBaseUrl = api.baseUrl;\n this.role = info.role;\n this.siLogin.save();\n\n if (info.serverOptions) {\n const options = (this._serverOptions = info.serverOptions);\n if (options.msg) Toast.show(I`Server: ` + options.msg, 3000);\n api.storageUrlBase = options.storageUrlBase || \"\";\n }\n\n api.defaultAuth = this.getBearerAuth(this.info.token);\n ui.sidebarLogin.update();\n this.setState(\"logged\");\n this.loggingin = null;\n this.onSwitchedUser.invoke(info);\n if (!this.isApiReady) this.onApiReady.invoke();\n\n if (info.playing && !playerCore.track) this.tryRestorePlaying(info.playing);\n }\n async logout() {\n if (this.info.token) {\n var toast = Toast.show(I`Logging out...`);\n try {\n await api.post({ path: \"users/me/logout\" });\n toast.close();\n } catch (error) {\n toast.text = I`Failed to logout.` + \"\\n\" + error;\n toast.show(5000);\n return;\n }\n }\n objectApply(this.info, {\n id: -1,\n username: undefined,\n passwd: undefined,\n token: undefined,\n avatar: undefined,\n });\n this.role = undefined;\n this.siLogin.save();\n api.defaultAuth = null;\n ui.content.setCurrent(null);\n this.setState(\"none\");\n this.loggingin = null;\n this.onSwitchedUser.invoke(null);\n }\n async setListids(listids: number[]) {\n var obj: Api.UserInfo = {\n id: this.info.id,\n username: this.info.username,\n listids: listids,\n };\n await api.put({\n path: \"users/me\",\n obj,\n });\n }\n /**\n * Wait until finished logging in. Returns true if sucessfully logged in.\n */\n async waitLogin(throwOnFail: boolean = false, fastLogin: boolean = true): Promise {\n do {\n if (this.state === \"logged\") return true;\n if (this.state === \"logging\") {\n if (fastLogin) {\n if (this.isApiReady) {\n return true;\n } else {\n await this.onApiReady.waitOnce();\n if ((this.state as any) !== 'error') {\n return true;\n } else {\n break;\n }\n }\n }\n try {\n await this.loggingin;\n if ((this.state as any) != \"logged\") break;\n return true;\n } catch {\n break;\n }\n }\n } while (0);\n if (throwOnFail) throw new Error(\"No login\");\n return false;\n }\n\n _ignore_track_once: Track | null = null;\n playingTrackChanged() {\n var track = playerCore.track;\n if (track && this._ignore_track_once === track) {\n this._ignore_track_once = null;\n return;\n }\n var tl: Api.TrackLocation = {\n listid: track?._bind?.list?.id ?? 0,\n position: track?._bind?.position ?? 0,\n trackid: track?.id ?? 0,\n profile: playerCore.trackProfile?.profile ?? \"\",\n };\n this.postPlaying(tl).then(\n () => console.info(\"[User] post playing OK\"),\n (err) => console.warn(\"[User] post playing error\", err)\n );\n }\n async tryRestorePlaying(playing: Api.TrackLocation) {\n if (playing.trackid) {\n var tmpTrack: Track | null = null;\n if (playing.track) {\n tmpTrack = new Track({ infoObj: playing.track });\n this._ignore_track_once = tmpTrack;\n playerCore.setTrack(tmpTrack);\n }\n var list: TrackList = playing.listid\n ? listIndex.getList(playing.listid)\n : uploads;\n await list.fetch();\n var track: Track | null = list.tracks[playing.position];\n if (track?.id !== playing.trackid)\n track = list.tracks.find((x) => x.id === playing.trackid) || null;\n if (\n (!tmpTrack && playerCore.track == null) ||\n (tmpTrack && playerCore.track == tmpTrack)\n ) {\n this._ignore_track_once = track;\n playerCore.setTrack(track);\n }\n }\n }\n async getPlaying(): Promise {\n await this.waitLogin(true);\n var result: Api.TrackLocation = await api.get(\"my/playing\");\n return result;\n }\n\n async postPlaying(trackLocation: Api.TrackLocation): Promise {\n await this.waitLogin(true);\n await api.post({\n path: \"my/playing\",\n obj: trackLocation,\n });\n }\n\n async changePassword(newPasswd: string) {\n var toast = Toast.show(I`Changing password...`);\n try {\n await api.put({\n path: \"users/me\",\n obj: {\n id: this.info.id,\n username: this.info.username,\n passwd: newPasswd,\n },\n });\n this.info.passwd = newPasswd;\n api.defaultAuth = this.getBasicAuth(this.info);\n this.siLogin.save();\n } catch (error) {\n toast.updateWith({ text: I`Failed to change password.` + \"\\n\" + error });\n toast.show(3000);\n return;\n }\n toast.updateWith({ text: I`Password changed successfully.` });\n toast.show(3000);\n }\n})();\n\nclass LoginDialog extends Dialog {\n tabLogin = new TextBtn({ text: I`Login`, active: true });\n tabCreate = new TextBtn({ text: I`Create account` });\n inputUser = new LabeledInput({ label: I`Username` });\n inputPasswd = new LabeledInput({ label: I`Password`, type: \"password\" });\n inputPasswd2 = new LabeledInput({\n label: I`Confirm password`,\n type: \"password\",\n });\n viewStatus = new TextView({\n tag: \"div.input-label\",\n style: \"white-space: pre-wrap; color: red;\",\n });\n btn = new ButtonView({ text: I`Login`, type: \"big\" });\n socialLogins: ButtonView[] = [];\n isRegistering = false;\n compositionWatcher: TextCompositionWatcher;\n constructor() {\n super();\n var dig = this;\n dig.title = \"\";\n [this.tabLogin, this.tabCreate].forEach((x) => {\n dig.addBtn(x);\n x.onActive.add(() => toggle(x));\n });\n\n [this.inputUser, this.inputPasswd, this.inputPasswd2].forEach((x) =>\n dig.addContent(x)\n );\n dig.addContent(\n buildDOM({\n tag: \"div\",\n child: [this.viewStatus, this.btn],\n }) as any\n );\n this.compositionWatcher = new TextCompositionWatcher(this.dom);\n dig.dom.addEventListener(\"keydown\", (ev) => {\n if (!this.compositionWatcher.isCompositing && ev.code === \"Enter\") {\n this.btnClicked();\n ev.preventDefault();\n }\n });\n dig.autoFocus = this.inputUser.input;\n this.btn.toggleClass(\"bigbtn\", true);\n this.btn.dom.addEventListener(\"click\", () => this.btnClicked());\n\n var toggle = (btn: TextBtn) => {\n if (btn.active) return;\n this.isRegistering = !this.isRegistering;\n this.inputPasswd2.hidden = !this.isRegistering;\n this.btn.text = btn.text;\n this.tabLogin.updateWith({ active: !this.isRegistering });\n this.tabCreate.updateWith({ active: this.isRegistering });\n this.socialLogins.forEach((x) => (x.hidden = this.isRegistering));\n };\n this.inputPasswd2.hidden = true;\n\n this.addBtn(\n new TextBtn({\n text: I`Settings`,\n right: true,\n onActive: (ev) => {\n settingsUI.openUI(ev);\n this.close();\n },\n })\n );\n\n this.tabCreate.hidden = true;\n this.inputUser.hidden = this.inputPasswd.hidden = this.btn.hidden = true;\n\n const onServerconfig = (serverConfig: Api.ServerConfig) => {\n this.tabCreate.hidden = serverConfig.allowRegistration == false;\n this.inputUser.hidden =\n this.inputPasswd.hidden =\n this.btn.hidden =\n serverConfig.passwordLogin == false;\n serverConfig.socialLogin?.forEach((l) => {\n const btn = new ButtonView({\n text: I`Login via ${l.name}`,\n type: \"big\",\n onActive: () => {\n window.location.href = api.processUrl(\n `users/me/socialLogin?provider=${\n l.id\n }&returnUrl=${encodeURIComponent(window.location.href)}`\n );\n },\n });\n this.socialLogins.push(btn);\n this.addContent(btn);\n });\n };\n\n if (user.state == \"logged\") {\n onServerconfig(user.serverOptions);\n } else {\n const li = new LoadingIndicator({});\n this.addContent(li);\n api\n .get(\"users/me/serverconfig\")\n .then((config) => {\n li.removeFromParent();\n onServerconfig(config);\n })\n .catch((e) => {\n li.error(e);\n });\n }\n }\n\n show(...args: Parameters) {\n this.center();\n super.show(...args);\n }\n\n btnClicked() {\n if (this.btn.dom.classList.contains(\"disabled\")) return;\n var precheckErr: string[] = [];\n if (!this.inputUser.value) precheckErr.push(I`Please input the username!`);\n if (!this.inputPasswd.value)\n precheckErr.push(I`Please input the password!`);\n else if (\n this.isRegistering &&\n this.inputPasswd.value !== this.inputPasswd2.value\n )\n precheckErr.push(I`Password confirmation does not match!`);\n this.viewStatus.dom.textContent = precheckErr.join(\"\\r\\n\");\n if (precheckErr.length) {\n return;\n }\n (async () => {\n this.viewStatus.text = I`Requesting...`;\n this.btn.updateWith({ disabled: true });\n var info = {\n username: this.inputUser.value,\n passwd: this.inputPasswd.value,\n };\n try {\n user.pendingInfo = info as any;\n if (this.isRegistering) {\n await user.register(info);\n } else {\n await user.login({ info });\n }\n this.viewStatus.text = \"\";\n [this.inputUser, this.inputPasswd, this.inputPasswd2].forEach(\n (x) => (x.value = \"\")\n );\n user.closeUI();\n } catch (e) {\n this.viewStatus.text = e;\n // fallback to previous login info\n if (user.state === \"logged\" && user.info.username) {\n this.viewStatus.text +=\n \"\\r\\n\" + I`Logged in with previous working account.`;\n }\n } finally {\n user.pendingInfo = null;\n this.btn.updateWith({ disabled: false });\n }\n })();\n }\n}\n\nclass MeDialog extends Dialog {\n btnLoginSettings = new ButtonView({ text: I`Login settings`, type: \"big\" });\n btnSwitch = new ButtonView({ text: I`Switch user`, type: \"big\" });\n btnLogout = new ButtonView({ text: I`Logout`, type: \"big\" });\n btnChangeAvatar = new ButtonView({ text: I`Change avatar`, type: \"normal\" });\n fileSelector = new FileSelector({ accept: \"image/*\", multiple: false });\n constructor() {\n super();\n var username = user.info.username;\n this.title = I`User`;\n const domimg = new Ref();\n this.addContent(\n new View({\n tag: \"div.user-info\",\n child: [\n {\n tag: \"img.user-avatar\",\n ref: domimg,\n src: user.info.avatar ? api.processUrl(user.info.avatar!) : \"\",\n hidden: !user.info.avatar,\n },\n {\n tag: \"div\",\n child: [\n { tag: \"div.user-name\", text: user.info.username },\n this.btnChangeAvatar,\n ],\n },\n this.fileSelector,\n ],\n })\n );\n this.btnChangeAvatar.toggleClass(\"user-change-avatar\", true);\n this.btnChangeAvatar.onActive.add(() => {\n this.fileSelector.open();\n });\n this.fileSelector.onfile = async (file) => {\n await api.put({\n path: \"users/me/avatar\",\n mode: \"raw\",\n obj: await file.arrayBuffer(),\n });\n const { avatar } = await api.get(\"users/me\");\n user.info.avatar = avatar;\n domimg.value!.src = api.processUrl(user.info.avatar!);\n };\n if (user.isAdmin)\n this.addContent(new View({ tag: \"p\", textContent: I`You are admin.` }));\n this.addContent(this.btnLoginSettings);\n this.addContent(this.btnSwitch);\n this.addContent(this.btnLogout);\n this.btnLoginSettings.onActive.add((ev) => {\n new LoginSettingsDialog().show(ev);\n this.close();\n });\n this.btnSwitch.onActive.add((ev) => {\n user.openUI(true, ev);\n this.close();\n });\n this.btnLogout.onActive.add(() => {\n user.logout();\n this.close();\n });\n this.addBtn(\n new TextBtn({\n text: I`Settings`,\n right: true,\n onActive: (ev) => {\n settingsUI.openUI(ev);\n this.close();\n },\n })\n );\n }\n}\n\nclass LoginSettingsDialog extends Dialog {\n inputPasswd = new LabeledInput({ label: I`New password`, type: \"password\" });\n inputPasswd2 = new LabeledInput({\n label: I`Confirm password`,\n type: \"password\",\n });\n status = new TextView({\n tag: \"div.input-label\",\n style: \"white-space: pre-wrap;\",\n });\n btnChangePassword = new ButtonView({ text: I`Change password`, type: \"big\" });\n constructor() {\n super();\n this.title = I`Login settings`;\n [\n new SocialLogins(),\n new View({ tag: \"h3\", textContent: I`Change password` }),\n this.inputPasswd,\n this.inputPasswd2,\n this.status,\n this.btnChangePassword,\n ].forEach((x) => this.addContent(x));\n this.btnChangePassword.onActive.add(() => {\n if (!this.inputPasswd.value) {\n this.status.text = I`Please input the new password!`;\n this.status.dom.style.color = \"red\";\n } else if (this.inputPasswd.value !== this.inputPasswd2.value) {\n this.status.text = I`Password confirmation does not match!`;\n this.status.dom.style.color = \"red\";\n } else {\n user.changePassword(this.inputPasswd.value).then(() => {\n this.status.text = I`Password changed.`;\n this.status.dom.style.color = \"#00FF00\";\n });\n }\n });\n }\n}\n\nclass SocialLogins extends View {\n constructor() {\n super({ tag: \"div\" });\n this.appendView(new View({ tag: \"h3\", textContent: I`Linked accounts` }));\n this.initAsync();\n }\n\n async initAsync() {\n const statusView = new TextView({\n tag: \"div\",\n text: I`Loading`,\n style: \"color: var(--text-gray)\",\n });\n this.appendView(statusView);\n await user.waitLogin(true);\n const { links } = await api.get(\"users/me/socialLinks\");\n if (!links || links.length == 0) {\n statusView.text = I`(Not available)`;\n return;\n } else {\n statusView.removeFromParent();\n }\n links.forEach((x) => {\n this.appendView(new SocialLoginItem(x));\n });\n }\n}\n\nclass SocialLoginItem extends View {\n constructor(data: { id: string; name: string; username: string | null }) {\n var btn: ButtonView;\n super({\n tag: \"div.social-login-item\",\n child: [\n {\n tag: \"span.name\",\n text: data.name + (data.username ? ` (${data.username})` : \"\"),\n },\n (btn = new ButtonView({\n text: () => (data.username ? I`Unlink` : I`Link`),\n onActive: () => {\n if (data.username) {\n api\n .delete({ path: `users/me/socialLinks/${data.id}` })\n .then(() => {\n data.username = null;\n btn.updateDom();\n Toast.show(I`Account has been unlinked successfully.`, 5000);\n });\n } else {\n btn.disabled = true;\n api\n .post({\n path: `users/me/socialLinks/${\n data.id\n }?returnUrl=${encodeURIComponent(window.location.href)}`,\n })\n .then(({ url }) => {\n window.location.href = url;\n });\n }\n },\n })),\n ],\n });\n }\n}\n","import {\n ContextMenu,\n MenuItem,\n I,\n formatFileSize,\n MenuLinkItem,\n i18n,\n formatDuration,\n arraySum,\n MenuInfoItem,\n} from \"@yuuza/webfx\";\nimport { api } from \"../API/Api\";\nimport { Api } from \"../API/apidef\";\nimport { user } from \"../API/User\";\nimport { router } from \"../Infra/Router\";\nimport { ui } from \"../Infra/UI\";\nimport { CopyMenuItem } from \"../Infra/ui-views\";\nimport { settings } from \"../Settings/Settings\";\nimport { Track } from \"./Track\";\nimport { TrackViewItem } from \"./TrackList\";\n\nexport const trackContextMenu = (\n selected: Track[],\n ev: MouseEvent,\n trackViewItems?: TrackViewItem[]\n) => {\n ev.preventDefault();\n var m = new ContextMenu();\n const item = selected[0];\n if (selected.length == 1) {\n if (\n item.id &&\n user.state != \"none\" &&\n user.serverOptions.trackCommentsEnabled !== false\n )\n m.add(\n new MenuItem({\n text: I`Comments`,\n onActive: () => {\n router.nav([\"track-comments\", item.id.toString()]);\n },\n })\n );\n if (settings.showDownloadOptions && item.url) {\n var ext = item.getExtensionName();\n ext = ext ? ext.toUpperCase() + \", \" : \"\";\n var fileSize = formatFileSize(item.size);\n var files = [...(item.files ?? [])];\n files.sort((a, b) => b.bitrate - a.bitrate);\n if (!files.find((f) => f.profile === \"\"))\n m.add(\n new MenuLinkItem({\n text: I`Download` + \" (\" + ext + fileSize + \")\",\n link: api.processUrl(item.url)!,\n download: item.artist + \" - \" + item.name + \".\" + ext,\n })\n );\n files.forEach((f) => {\n var format = f.format?.toUpperCase();\n var url = item.getFileUrl(f);\n if (url)\n m.add(\n new MenuLinkItem({\n text: I`Download` + \" (\" + format + \", \" + f.bitrate + \" Kbps)\",\n link: api.processUrl(url)!,\n download: item.artist + \" - \" + item.name + \".\" + format,\n })\n );\n else if (item.canEdit)\n m.add(\n new MenuItem({\n text: I`Convert` + \" (\" + format + \", \" + f.bitrate + \" Kbps)\",\n onActive: () => {\n item.requestFileUrl(f);\n },\n })\n );\n });\n }\n if (item.picurl) {\n m.add(\n new MenuLinkItem({\n text: I`Show picture`,\n link: api.processUrl(item.picurl)!,\n })\n );\n }\n }\n const targetGroup = (item.groupId || null) ?? item.id;\n const nonSameGroupItems = selected.filter(\n (x) => x != item && x.groupId !== targetGroup\n );\n if (nonSameGroupItems.length > 0) {\n m.add(\n new MenuItem({\n text: I`Group to this`,\n onActive: async () => {\n if (!item.groupId) {\n await item.put({\n ...item.infoObj,\n groupId: item.id,\n });\n }\n await Promise.all(\n nonSameGroupItems.map((other) => {\n return other.put({\n ...other.infoObj,\n groupId: item.groupId,\n });\n })\n );\n },\n })\n );\n }\n const groupedItems = selected.filter((x) => x.groupId && x.groupId !== x.id);\n if (groupedItems.length > 0) {\n m.add(\n new MenuItem({\n text: I`Ungroup`,\n onActive: async () => {\n await Promise.all(\n groupedItems.map((x) => {\n return x.put({\n ...x.infoObj,\n groupId: x.id,\n });\n })\n );\n },\n })\n );\n }\n if (item.canEdit)\n [0, 1].forEach((visi) => {\n var count = 0;\n for (const item of selected) {\n if (item.visibility != visi) count++;\n }\n if (!count) return;\n m.add(\n new MenuItem({\n text: i18n.get(\n count == 1\n ? \"make_it_visibility_\" + visi\n : \"make_{0}_visibility_\" + visi,\n [count]\n ),\n onActive: () => {\n api\n .post({\n path: \"tracks/visibility\",\n obj: {\n trackids: selected.map((x) => x.id),\n visibility: visi,\n } as Api.VisibilityChange,\n })\n .then((r) => {\n selected.forEach((t) => {\n t.infoObj!.visibility = visi;\n api.onTrackInfoChanged.invoke(t.infoObj!);\n });\n });\n },\n })\n );\n });\n if (selected.length == 1) {\n if (item.visibility == 1)\n m.add(\n new CopyMenuItem({\n text: I`Copy link`,\n textToCopy: api.appBaseUrl + \"#track/\" + item.id,\n })\n );\n m.add(\n new MenuItem({\n text: item.canEdit ? I`Edit` : I`Details`,\n onActive: (ev) => item.startEdit(ev),\n })\n );\n }\n if (trackViewItems) {\n const trackViewItem = trackViewItems[0];\n if (\n selected.length == 1 &&\n trackViewItem.actionHandler?.onTrackRemove &&\n trackViewItem.actionHandler?.canRemove?.([trackViewItem]) != false\n ) {\n m.add(\n new MenuItem({\n text: I`Remove`,\n cls: \"dangerous\",\n onActive: () =>\n trackViewItem.actionHandler!.onTrackRemove?.([trackViewItem]),\n })\n );\n }\n if (\n trackViewItem.actionHandler?.onTrackRemove &&\n selected.length > 1 &&\n trackViewItem.actionHandler?.canRemove?.([...trackViewItems]) != false\n )\n m.add(\n new MenuItem({\n text: I`Remove ${selected.length} tracks`,\n cls: \"dangerous\",\n onActive: () => {\n trackViewItem.actionHandler!.onTrackRemove?.([...trackViewItems]);\n },\n })\n );\n }\n let infoText =\n I`Track ID` +\n \": \" +\n selected.map((x) => x.id).join(\", \") +\n \"\\n\" +\n I`Duration` +\n \": \" +\n formatDuration(arraySum(selected, (x) => x.length!)) +\n \"\\n\" +\n I`Size` +\n \": \" +\n formatFileSize(arraySum(selected, (x) => x.size!));\n if (selected.length == 1) {\n const my = item.owner == user.info.id ? \"my_\" : \"\";\n infoText += \"\\n\" + i18n.get(my + \"visibility_\" + selected[0].visibility);\n }\n m.add(new MenuInfoItem({ text: infoText }));\n if (trackViewItems) {\n ui.showContextMenuForItem(trackViewItems, m, { ev: ev });\n } else {\n m.show(ev);\n }\n};\n","const desktopApi = window[\"_mcDesktop\"] as\n | import(\"../Electron/rendererPreload\").McDesktopType\n | undefined;\n\nexport { desktopApi };\n","import { ContextMenu, fadeout, FadeoutResult, Ref, Timer } from \"@yuuza/webfx\";\nimport { api } from \"../API/Api\";\nimport {\n playerCore,\n PlayingLoopMode,\n playingLoopModes,\n} from \"../Player/PlayerCore\";\nimport { ui } from \"./UI\";\nimport {\n BuildDomExpr,\n Callbacks,\n formatDuration,\n InputStateTracker,\n jsx,\n listenPointerEvents,\n numLimit,\n TextView,\n ToolTip,\n View,\n} from \"./viewlib\";\nimport play from \"../../resources/play.svg\";\nimport pause from \"../../resources/pause.svg\";\nimport prev from \"../../resources/prev.svg\";\nimport next from \"../../resources/next.svg\";\nimport order_seq from \"../../resources/order_seq.svg\";\nimport order_random from \"../../resources/order_random.svg\";\nimport order_repeat from \"../../resources/order_repeat.svg\";\nimport order_repeat_1 from \"../../resources/order_repeat_1.svg\";\nimport volume from \"../../resources/volume.svg\";\nimport expand from \"../../resources/expand.svg\";\nimport icon_switch from \"../../resources/switch.svg\";\nimport type { Track } from \"../Track/Track\";\nimport { router } from \"./Router\";\nimport { Line, Lyrics, parse } from \"../Lyrics/Lyrics\";\nimport { LineView } from \"../Lyrics/LineView\";\nimport { I, i18n } from \"../I18n/I18n\";\nimport { trackContextMenu } from \"../Track/TrackContextMenu\";\nimport { desktopApi } from \"./desktopApi\";\n\nconst loopModeToIcon: Record = {\n \"list-seq\": order_seq,\n \"list-loop\": order_repeat,\n \"list-shuffle\": order_random,\n \"track-loop\": order_repeat_1,\n};\n\nexport class BottomBar extends View {\n trackImg = new View();\n trackImgOuter = new View(\n (\n router.nav(\"nowplaying\")}\n oncontextmenu={(ev) => this.onContextMenu(ev)}\n >\n {this.trackImg}\n \n )\n );\n progressBar = new ProgressBar();\n btnPlay = new PlayButton();\n btnPrev = new ControlButton({ icon: prev, title: () => I`prev_track` });\n btnNext = new ControlButton({ icon: next, title: () => I`next_track` });\n btnOrder = new ControlButton({\n icon: order_random,\n title: () => i18n.get(\"loopmode_\" + this.loopMode),\n });\n btnVolume = new VolumeButton();\n btnGroup = new ControlButton({\n icon: icon_switch,\n title: () => I`Next in group`,\n });\n trackInfo = new TextView(\n (\n router.nav(\"nowplaying\")}\n oncontextmenu={(ev) => this.onContextMenu(ev)}\n hidden={() => !this.track}\n >\n {() => this.track?.name}\n {() => this.track?.artist}\n \n )\n );\n lyrics = new SimpleLyricsView();\n btnFullscreen = new ControlButton({\n icon: expand,\n title: () => I`Fullscreen`,\n });\n\n track?: Track;\n loopMode: PlayingLoopMode = \"list-seq\";\n\n createDom() {\n return (\n
\n {this.trackImgOuter}\n
\n {this.progressBar}\n
\n {this.trackInfo}\n {this.btnOrder}\n {this.btnPrev}\n {this.btnPlay}\n {this.btnNext}\n {this.btnGroup}\n {this.btnVolume}\n {this.lyrics}\n {this.btnFullscreen}\n
\n
\n
\n );\n }\n\n onContextMenu(ev: MouseEvent) {\n if (this.track) {\n trackContextMenu([this.track], ev);\n }\n }\n\n bindPlayer(player: typeof playerCore) {\n const updatePrevNext = () => {\n this.btnPrev.disabled = !player.getNextTrack(-1);\n this.btnNext.disabled = !player.getNextTrack(1);\n };\n player.onTrackChanged.add(() => {\n if (player.track?.thumburl) {\n this.trackImg.dom.src = \"data:,\";\n this.trackImg.dom.src = api.processUrl(player.track?.thumburl)!;\n }\n this.trackImgOuter.toggleClass(\"noimg\", !player.track?.thumburl);\n this.track = player.track!;\n updatePrevNext();\n this.btnFullscreen.hidden = !player.isVideo;\n this.btnGroup.hidden = !player.track?.groupId;\n this.trackInfo.updateDom();\n })();\n player.onStateChanged.add(() => {\n this.btnPlay.setAction(player.isPlaying ? \"pause\" : \"play\");\n });\n player.onLoopModeChanged.add(() => {\n this.loopMode = player.loopMode;\n this.btnOrder.icon = loopModeToIcon[player.loopMode];\n this.btnOrder.updateDom();\n updatePrevNext();\n })();\n this.progressBar.bindPlayer(player);\n this.btnVolume.bindPlayer(player);\n this.lyrics.bindPlayer(player);\n this.lyrics.onLyricsChanged.add(() => {\n const hasLyrics = !!this.lyrics.lyrics?.lines?.length;\n this.toggleClass(\"has-lyrics\", hasLyrics);\n this.toggleClass(\"no-lyrics\", !hasLyrics);\n });\n\n this.btnPlay.onActive.add((e) => {\n e.preventDefault();\n player.isPlaying ? player.pause() : player.play();\n });\n this.btnNext.onActive.add((e) => {\n e.preventDefault();\n player.next();\n });\n this.btnPrev.onActive.add((e) => {\n e.preventDefault();\n player.prev();\n });\n this.btnOrder.onActive.add((e) => {\n e.preventDefault();\n const modes = playingLoopModes;\n player.loopMode =\n modes[(modes.indexOf(player.loopMode) + 1) % modes.length];\n });\n this.btnFullscreen.onActive.add((e) => {\n e.preventDefault();\n router.nav(\"nowplaying\");\n ui.sidebar.toggleHide(true);\n document.documentElement.requestFullscreen();\n });\n this.btnGroup.onActive.add((e) => {\n e.preventDefault();\n const current = playerCore.track!;\n playerCore.track!.getGroup().then((group) => {\n let next =\n group.tracks[\n (group.tracks.findIndex((x) => x.id == current.id) + 1) %\n group.tracks.length\n ];\n // TODO: import Track won't run because of circular deps\n const Track = Object.getPrototypeOf(current).constructor;\n const nextTrack =\n current._bind?.list?.tracks.find((x) => x.id === next.id) ??\n new Track({ infoObj: next, _bind: current._bind });\n const time = playerCore.currentTime;\n playerCore.setTrack(nextTrack, time);\n });\n });\n }\n}\n\nclass ControlButton extends View {\n title: () => string = () => \"\";\n constructor({ icon, title }: { icon: string; title: () => string }) {\n super(
);\n this.icon = icon;\n this.title = title;\n }\n set icon(val: string) {\n this.dom.innerHTML = val;\n }\n set disabled(val: boolean) {\n this.toggleClass(\"disabled\", val);\n }\n override updateDom() {\n super.updateDom();\n this.dom.title = this.title?.() ?? \"\";\n }\n}\n\nclass PlayButton extends ControlButton {\n constructor() {\n super({\n icon: play,\n title: () => (this._action == \"play\" ? I`Play` : I`Pause`),\n });\n this.toggleClass(\"play-btn\", true);\n }\n _action: \"play\" | \"pause\";\n setAction(action: \"play\" | \"pause\") {\n this._action = action;\n this.dom.innerHTML = action == \"play\" ? play : pause;\n this.updateDom();\n }\n}\n\nclass ProgressBar extends View {\n refCurrentTime = new Ref();\n refTotalTime = new Ref();\n refBackground = new Ref();\n refFill = new Ref();\n loudnessMap = new LoudnessMap();\n createDom() {\n return (\n
\n \n --:--\n \n
\n
\n {this.loudnessMap}\n
\n \n --:--\n \n
\n );\n }\n bindPlayer(player: typeof playerCore) {\n player.onTrackChanged.add(() => {\n this.refTotalTime.value!.textContent = formatDuration(\n player.track?.length\n );\n this.loudnessMap.updateLoudnessMap(player);\n });\n player.onProgressChanged.add(() => {\n this.refCurrentTime.value!.textContent = formatDuration(\n player.currentTime\n );\n this.refFill.value!.style.width = `${numLimit(\n (player.currentTime / (player.track?.length ?? 0)) * 100,\n 0,\n 100\n )}%`;\n });\n listenPointerEvents(this.refBackground.value!, (e) => {\n e.ev.preventDefault();\n if (e.action == \"up\") return;\n const rect = this.refBackground.value!.getBoundingClientRect();\n player.currentTime =\n ((e.point.clientX - rect.left) / rect.width) * player.duration!;\n if (e.action == \"down\") {\n return \"track\";\n }\n });\n }\n}\n\nclass LoudnessMap extends View {\n createDom() {\n return ;\n }\n\n async updateLoudnessMap(player: typeof playerCore) {\n const track = player.track;\n if (track && !track._loudmap && this.dom) {\n const ctx = this.dom.getContext(\"2d\")!;\n const { width, height } = this.dom;\n ctx.clearRect(0, 0, width, height);\n }\n const louds = await track?.getLoudnessMap();\n if (player.track !== track) return;\n if (louds && louds.length > 20) {\n const [width, height] = [Math.min(1024, louds.length / 4), 32];\n this.dom.width = width;\n const smoothWindow = 2;\n const scale = louds.length / (width + (smoothWindow - 1));\n const scaleY = (height / 256) * (256 / Math.log(256));\n const ctx = this.dom.getContext(\"2d\")!;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n let peakAvgs: number[] = [];\n for (let i = 0; i < width + (smoothWindow - 1); i += 1) {\n const begin = Math.floor(i * scale);\n const end = Math.floor(i * scale + scale);\n let sum = 0;\n for (let i = begin; i < end; i++) {\n sum += louds[i];\n }\n peakAvgs.push(sum / scale);\n }\n\n peakAvgs = this.smooth(peakAvgs);\n\n // scale after log()\n const tmp = [...peakAvgs].filter((x) => x > 0).sort((a, b) => a - b);\n const low = Math.log(tmp[Math.floor(tmp.length * 0.02)]) * scaleY;\n const high = Math.log(tmp[Math.floor(tmp.length * 0.99)]) * scaleY;\n const scaleY2 = (height * (0.95 - 0.2)) / (high - low);\n const offsetY2 = height * 0.2 - low * scaleY2;\n\n ctx.moveTo(-1, height);\n for (let i = 0; i < width; i++) {\n let y = peakAvgs[i];\n if (y <= 0) y = 0;\n else {\n y = Math.log(y);\n y = y * scaleY;\n y *= scaleY2;\n y += offsetY2;\n }\n ctx.lineTo(i, height - y);\n ctx.lineTo(i + 1, height - y);\n }\n ctx.lineTo(width, height);\n ctx.fillStyle = \"white\";\n ctx.fill();\n this.hidden = false;\n } else {\n this.hidden = true;\n }\n }\n\n smooth(arr: number[]) {\n var val = arr[0];\n var r: number[] = [];\n for (let i = 1; i < arr.length; i++) {\n var cur = arr[i];\n val += (cur - val) * 0.25;\n if (Math.abs(val) < 1) val = 0;\n r.push(val);\n }\n console.info({ arr, r });\n return r;\n }\n}\n\nclass ProgressButton extends View {\n fill = new View({\n tag: \"div.btn-fill\",\n });\n textSpan = new TextView({ tag: \"span.text\" });\n\n get text() {\n return this.textSpan.text;\n }\n set text(val) {\n this.textSpan.text = val;\n }\n\n private _progress: number;\n public get progress(): number {\n return this._progress;\n }\n public set progress(v: number) {\n this.fill.dom.style.width = v * 100 + \"%\";\n this._progress = v;\n }\n\n constructor(dom?: BuildDomExpr) {\n super(dom ?? { tag: \"div.btn\" });\n this.dom.classList.add(\"btn-progress\");\n this.appendView(this.fill);\n this.appendView(this.textSpan);\n }\n}\n\nclass VolumeButton extends ProgressButton {\n onChanging = new Callbacks<(delta: number) => void>();\n tipView = new ToolTip();\n InputStateTracker: InputStateTracker;\n get state() {\n return this.InputStateTracker.state;\n }\n\n get progress() {\n return super.progress;\n }\n set progress(val: number) {\n super.progress = val;\n this.updateTip();\n this.toggleClass(\"full-volume\", this.progress == 1);\n }\n\n constructor(dom?: HTMLElement) {\n super(dom);\n this.addView(new View());\n this.toggleClass(\"volume-btn\", true);\n this.tipView.toggleClass(\"volume-tip\", true);\n this.InputStateTracker = new InputStateTracker(this.dom);\n this.InputStateTracker.onChanged.add(() => this.updateTip());\n this.dom.addEventListener(\"wheel\", (ev) => {\n ev.preventDefault();\n var delta = ev.deltaY * -0.0005 + ev.deltaX * 0.0005;\n this.onChanging.invoke(this.progress + delta);\n });\n var startX: number;\n var startVol: number;\n listenPointerEvents(this.dom, (e) => {\n if (e.type === \"mouse\" && e.action === \"down\" && e.ev.buttons != 1)\n return;\n e.ev.preventDefault();\n if (e.action === \"down\") {\n this.dom.focus();\n startX = e.point.pageX;\n startVol = this.progress;\n this.dom.classList.add(\"btn-down\");\n this.fill.dom.style.transition = \"none\";\n return \"track\";\n } else if (e.action === \"move\") {\n var deltaX = e.point.pageX - startX;\n this.onChanging.invoke(startVol + deltaX * 0.01);\n } else if (e.action === \"up\") {\n if (e.ev.type == \"touchcancel\") this.onChanging.invoke(startVol);\n this.dom.classList.remove(\"btn-down\");\n this.fill.dom.style.transition = \"\";\n }\n this.updateTip();\n });\n this.dom.addEventListener(\"click\", (e) => {\n this.updateTip();\n });\n const mapKeyAdjustment = {\n ArrowUp: 0.05,\n ArrowDown: -0.05,\n ArrowRight: 0.01,\n ArrowLeft: -0.01,\n };\n this.dom.addEventListener(\"keydown\", (e) => {\n var adj = mapKeyAdjustment[e.code] as number;\n if (adj) {\n e.preventDefault();\n this.onChanging.invoke(this.progress + adj);\n }\n });\n }\n\n private updateTip() {\n const percent = Math.floor(this.progress * 100);\n this.tipView.text = percent + \"%\";\n const showing =\n this.state.mouseIn ||\n this.state.mouseDown ||\n (this.state.focusIn && ui.usingKeyboardInput);\n if (showing == this.tipView.shown) {\n } else if (showing) {\n const rect = this.dom.getBoundingClientRect();\n const parent = this.parentView!.dom;\n const parentRect = parent.getBoundingClientRect();\n this.tipView.show({\n x: rect.left + rect.width / 2 - parentRect.left,\n y: rect.top - parentRect.top - 3,\n parent: parent,\n });\n } else {\n this.tipView.close({\n className: \"animation-fading-out\",\n });\n }\n }\n\n bindPlayer(player: typeof playerCore) {\n player.onVolumeChanged.add(() => {\n this.progress = player.volume;\n })();\n this.onChanging.add((x) => {\n var r = numLimit(x, 0, 1);\n r = Math.round(r * 100) / 100;\n player.volume = r;\n });\n }\n}\n\nclass SimpleLyricsView extends View {\n lyricsRef = new Ref();\n get lyrics() {\n return this.lyricsRef.value;\n }\n currentLine: Line | null = null;\n lineView: LineView | null = null;\n onLyricsChanged = this.lyricsRef.onChanged;\n createDom() {\n return
;\n }\n postCreateDom() {\n super.postCreateDom();\n this.onActive.add(() => {\n if (desktopApi?.toggleDesktopLyrics) {\n desktopApi.toggleDesktopLyrics();\n return;\n }\n router.nav(\"nowplaying\");\n });\n this.onLyricsChanged.add((_) => {\n this.dom.lang = this.lyrics?.lang ?? \"\";\n })(this.lyricsRef);\n }\n bindPlayer(player: typeof playerCore) {\n const updateLyrics = async () => {\n const track = player.track;\n this.fadeoutCurrentLineView();\n if (!track) {\n this.lyricsRef.value = null;\n return;\n }\n const raw = await track.getLyrics();\n if (track !== player.track) return;\n this.lyricsRef.value = parse(raw);\n };\n\n player.onTrackChanged.add(updateLyrics);\n api.onTrackInfoChanged.add((newTrack) => {\n if (newTrack.id && newTrack.id === player.track?.id) {\n updateLyrics();\n }\n });\n\n const updateLine = () => {\n if (!this.lyrics) return;\n const time = player.currentTime;\n const timeForLine = time + 0.5;\n const timeForSpan = time + 0.1;\n let line: Line | null = null;\n for (const x of this.lyrics.lines) {\n if (x.startTime == null) continue;\n if (\n x.startTime > timeForLine &&\n line &&\n !(line.spans?.length == 1 && !line.spans[0].text)\n )\n break;\n line = x;\n }\n if (this.currentLine !== line) {\n this.currentLine = line;\n this.fadeoutCurrentLineView();\n if (line) {\n this.lineView = new LineView(line);\n this.addView(this.lineView);\n }\n if (navigator.mediaSession?.metadata) {\n navigator.mediaSession.metadata.artist =\n line?.spans?.map((x) => x.text).join(\"\") || \"\";\n }\n }\n if (this.lineView) {\n this.lineView.setCurrentTime(timeForSpan);\n }\n timer.timeout(100);\n };\n\n const timer = new Timer(updateLine);\n\n player.onProgressChanged.add(() => {\n updateLine();\n });\n }\n currentFadingout: FadeoutResult | null = null;\n fadeoutCurrentLineView() {\n const view = this.lineView;\n if (view) {\n if (this.currentFadingout) {\n this.currentFadingout.cancel(true);\n }\n this.lineView = null;\n this.currentFadingout = fadeout(view.dom, { remove: false }).onFinished(\n () => {\n this.removeView(view);\n this.currentFadingout = null;\n }\n );\n }\n }\n}\n","// file: UI.ts\n\nimport {\n ListViewItem,\n Dialog,\n ToastsContainer,\n TextView,\n View,\n DialogParent,\n MessageBox,\n Overlay,\n ItemActiveHelper,\n dragManager,\n ContextMenu,\n fadeout,\n numLimit,\n toggleClass,\n mountView,\n} from \"./viewlib\";\nimport * as views from \"./ui-views\";\nimport { MainContainer } from \"./ui-views\";\nimport { BottomBar } from \"./BottomBar\";\n\nView.debugging = true;\n\nviews.SidebarItem.prototype.bindContentView = function (\n viewFunc: Func,\n) {\n this.onActive.add(() => {\n if (!this.contentView) this.contentView = viewFunc();\n if (ui.content.current === this.contentView) {\n this.contentView.onSidebarItemReactived();\n return;\n }\n ui.content.setCurrent(this.contentView);\n ui.sidebarList.setActive(this);\n });\n return this;\n};\n\nconst mainContainer = new MainContainer();\nconst bottomBar = new BottomBar();\nmountView(document.body, mainContainer);\nmountView(document.body, bottomBar);\n\nimport { router } from \"./Router\";\nimport {\n SettingItem,\n Func,\n Callbacks,\n Timer,\n Toast,\n clearChildren,\n isIOS,\n} from \"./utils\";\nimport { I18n, i18n, I } from \"../I18n/I18n\";\nimport { Track } from \"../Track/Track\";\nimport { user } from \"../API/User\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { uploads } from \"../Track/Uploads\";\nimport { api } from \"../API/Api\";\n\nexport const ui = new (class {\n usingKeyboardInput = false;\n init() {\n this.addErrorListener();\n this.lang.init();\n this.theme.init();\n this.sidebar.init();\n this.contentBg.init();\n bottomBar.bindPlayer(playerCore);\n this.sidebarLogin.init();\n this.windowTitle.init();\n this.notification.init();\n Dialog.defaultParent = new DialogParent(mainContainer);\n ToastsContainer.default.parentDom = mainContainer.dom;\n ToastsContainer.default.dom.style.position = \"absolote\";\n router.addRoute({\n path: [\"home\"],\n onNav: () => {\n ui.content.setCurrent(null);\n ui.sidebarList.currentActive.set(null);\n },\n });\n document.addEventListener(\"dragover\", (ev) => {\n ev.preventDefault();\n });\n document.addEventListener(\"drop\", (ev) => {\n if (ev.defaultPrevented) return;\n ev.preventDefault();\n const files = ev.dataTransfer?.files;\n if (files && files.length) {\n new MessageBox()\n .setTitle(I`Question`)\n .addText(\n files.length === 1\n ? I`Did you mean to upload 1 file?`\n : I`Did you mean to upload ${files.length} files?`,\n )\n .addResultBtns([\"no\", \"yes\"])\n .allowCloseWithResult(\"no\")\n .showAndWaitResult()\n .then((r) => {\n if (r === \"yes\") {\n if (router.currentStr !== \"uploads\") router.nav(\"uploads\");\n for (let i = 0; i < files.length; i++) {\n const file = files[i];\n uploads.uploadFile(file);\n }\n }\n });\n }\n });\n document.addEventListener(\n \"keydown\",\n (e) => {\n this.usingKeyboardInput = true;\n document.body.classList.add(\"keyboard-input\");\n },\n true,\n );\n [\"mousedown\", \"touchstart\"].forEach((evt) =>\n document.addEventListener(\n evt,\n (e) => {\n this.usingKeyboardInput = false;\n document.body.classList.remove(\"keyboard-input\");\n },\n { passive: true, capture: true },\n ),\n );\n }\n addErrorListener() {\n window.addEventListener(\"error\", (e) => {\n Toast.show(I`Error:` + \"\\n\" + e.error, 5000);\n });\n window.addEventListener(\"unhandledrejection\", (e) => {\n Toast.show(I`Error:` + \"\\n\" + e.reason, 5000);\n });\n }\n isVisible() {\n return !document[\"hidden\"];\n }\n updateAllViews() {\n mainContainer.updateAll();\n bottomBar.updateAll();\n }\n preload = new (class {\n domInfos = document.getElementById(\"preload-infos\");\n domProgress = document.getElementById(\"preload-progress-bar-fill\");\n jsok() {\n window[\"preload\"]?.jsOk();\n if (this.domInfos) {\n clearChildren(this.domInfos);\n }\n }\n log(text: string, type: \"info\" | \"error\") {\n const p = new TextView({ tag: `p.${type}`, text });\n if (this.domInfos) mountView(this.domInfos, p);\n return p;\n }\n progress(value: number) {\n if (this.domProgress) {\n this.domProgress.style.width = `${value * 100}%`;\n }\n }\n end() {\n setTimeout(() => {\n ui.mainContainer.dom.classList.remove(\"no-transition\");\n fadeout(document.getElementById(\"preload-overlay\")!);\n }, 1);\n }\n })();\n theme = new (class {\n colors = [\"light\", \"dark\", \"auto\"] as const;\n styles = [\"\", \"-rounded\"] as const;\n current: `${(typeof this.colors)[number]}${(typeof this.styles)[number]}` =\n \"light\";\n timer = new Timer(() =>\n toggleClass(document.body, \"changing-theme\", false),\n );\n siTheme = new SettingItem(\n \"mcloud-theme\",\n \"str\",\n \"auto-rounded\", // the default value should be sync with the preload script\n );\n\n init() {\n this.siTheme.render(this.render);\n }\n\n private rendered = false;\n render = () => {\n const theme = this.siTheme.data;\n this.current = theme;\n if (this.rendered) toggleClass(document.body, \"changing-theme\", true);\n const [color, rounded] = theme.split(\"-\");\n let computedColor = color;\n if (computedColor === \"auto\") {\n if (\"matchMedia\" in window) {\n this._toggleColorSchemeWatcher(true);\n computedColor = this._watchingColorSchema?.matches ? \"dark\" : \"light\";\n }\n } else {\n this._toggleColorSchemeWatcher(false);\n }\n toggleClass(document.body, \"dark\", computedColor === \"dark\");\n toggleClass(document.body, \"rounded\", rounded === \"rounded\");\n var meta = document.getElementById(\"meta-theme-color\") as HTMLMetaElement;\n if (meta) {\n meta.content = computedColor === \"dark\" ? \"black\" : \"\";\n } else {\n console.warn('[UI] Failed to get the \"meta-theme-color\" element');\n }\n if (this.rendered) this.timer.timeout(500);\n this.rendered = true;\n };\n\n set(theme: this[\"current\"]) {\n this.siTheme.set(theme);\n }\n\n private _watchingColorSchema: MediaQueryList | null = null;\n private _toggleColorSchemeWatcher(enable: boolean) {\n if (!!this._watchingColorSchema === enable || !(\"matchMedia\" in window))\n return;\n if (enable) {\n this._watchingColorSchema = window.matchMedia(\n \"(prefers-color-scheme: dark)\",\n );\n this._watchingColorSchema.addEventListener(\"change\", this.render);\n } else {\n this._watchingColorSchema!.removeEventListener(\"change\", this.render);\n this._watchingColorSchema = null;\n }\n }\n })();\n lang = new (class {\n availableLangs = [\"en\", \"zh\", \"ja\"];\n siLang = new SettingItem(\"mcloud-lang\", \"str\", \"\");\n curLang: string;\n init() {\n this.siLang.render((lang) => {\n if (!lang) lang = I18n.detectLanguage(this.availableLangs);\n this.curLang = lang;\n i18n.curLang = lang;\n document.body.lang = lang;\n console.info(\n `[UI] Current language: '${i18n.curLang}' - '${I`English`}'`,\n );\n ui.updateAllViews();\n });\n i18n.renderElements(document.querySelectorAll(\".i18ne\"));\n }\n setLang(lang: string, reload?: boolean) {\n this.siLang.set(lang ?? \"\");\n if (reload === undefined || reload) window.location.reload();\n }\n })();\n mainContainer = new (class {\n dom = document.getElementById(\"main-container\")!;\n })();\n sidebar = new (class {\n dom = document.getElementById(\"sidebar\")!;\n header = mainContainer.sidebar.header;\n sidebarToggle = mainContainer.sidebarToggle;\n overlay: Overlay | null;\n\n private _float = false;\n get float() {\n return this._float;\n }\n\n private _hide = false;\n private _hideMobile = true;\n private _hideLarge = false;\n get hide() {\n return this._hide && this._float;\n }\n\n private _btnShown = false;\n get btnShown() {\n return this._btnShown;\n }\n\n private _isMobile = false;\n\n init() {\n this.initPanHandler();\n this.toggleBtn(true);\n this.checkWidth();\n window.addEventListener(\"resize\", () => this.checkWidth());\n router.onNavCompleted.add(() => {\n if (this.float) this.toggleHide(true);\n });\n dragManager.onDragStart.add(() => {\n toggleClass(this.dom, \"peek\", true);\n });\n dragManager.onDragEnd.add(() => {\n toggleClass(this.dom, \"peek\", false);\n });\n this.dom.addEventListener(\"dragover\", () => this.toggleHide(false));\n\n if (isIOS) {\n // prevent navigation\n ui.mainContainer.dom.addEventListener(\"touchstart\", (e) => {\n if (e.touches[0].pageX > 20 && e.touches[0].pageX < window.innerWidth - 20) return;\n e.preventDefault();\n });\n }\n }\n\n private _panxHandler: TouchPanListener = null!;\n private _leftPadding = 200;\n private _getWidth() {\n return this.dom.offsetWidth - 200;\n }\n private _movingPos: number | null = null;\n private get movingPos() {\n return this._movingPos;\n }\n private set movingPos(pos: number | null) {\n this._movingPos = pos;\n const width = this._getWidth();\n if (pos != null) pos = numSoftLimit(pos, -width, 0, 0.15);\n const ratio = 1 + pos! / width;\n this.overlay!.dom.style.opacity = pos == null ? \"\" : `${ratio}`;\n this.overlay!.dom.style.transition = pos == null ? \"opacity .3s\" : \"none\";\n this.dom.style.transform = pos == null ? \"\" : `translate(${pos}px, 0)`;\n this.dom.style.transition = pos == null ? \"\" : \"none\";\n ui.content.container.dom.style.transition = pos == null ? \"\" : \"none\";\n ui.content.container.dom.style.transform =\n pos == null ? \"\" : `translate(${30 * ratio}%, 0)`;\n this.dom.style.boxShadow =\n pos == null\n ? \"\"\n : `0 0 20px var(--color-shadow)`;\n if (pos != null && pos > 0) {\n this.sidebarToggle.dom.style.transform = `translate(${pos}px, 0)`;\n this.sidebarToggle.dom.style.transition = \"none\";\n } else {\n this.sidebarToggle.dom.style.transform = \"\";\n this.sidebarToggle.dom.style.transition = \"\";\n }\n }\n\n initPanHandler() {\n this._panxHandler = new TouchPanListener(mainContainer.dom, \"x\");\n this._panxHandler.filter = (e) => {\n return (\n this.dom.contains(e.target as Node) ||\n this.overlay?.dom.contains(e.target as Node) ||\n ui.content.container.dom.contains(e.target as Node)\n );\n };\n this._panxHandler.onStart.add(() => {\n this.toggleHide(false);\n this.movingPos =\n this.dom.getBoundingClientRect().left + this._leftPadding;\n });\n var lastDelta = 0;\n this._panxHandler.onMove.add(({ deltaX }) => {\n lastDelta = deltaX;\n this.movingPos! += deltaX;\n });\n this._panxHandler.onEnd.add(() => {\n var hide = this.movingPos! + lastDelta * 10 < -this._getWidth() / 2;\n this.movingPos = null;\n this.toggleHide(hide);\n });\n }\n\n isMobile() {\n var width = window.innerWidth;\n return width < 800;\n }\n checkWidth() {\n const mobile = this.isMobile();\n if (mobile != this._isMobile) {\n this._isMobile = mobile;\n this.toggleHide(\n mobile\n ? this._hideMobile || this._hideLarge\n : this._hideLarge && this._hideMobile,\n );\n }\n }\n toggleFloat(float?: boolean) {\n if (float !== undefined && !!float === this._float) return;\n this._float = toggleClass(document.body, \"float-sidebar\", float);\n this._panxHandler.enabled = this._float;\n this.updateOverlay();\n }\n toggleBtn(show: boolean) {\n this.sidebarToggle.hidden = !show;\n }\n\n toggleHide(hide?) {\n this._hide = toggleClass(this.dom, \"hide\", hide);\n if (this.isMobile()) this._hideMobile = this._hide;\n else this._hideLarge = this._hide;\n this.toggleFloat(this.isMobile() || this._hide);\n ui.content.container.toggleClass(\"sidebar-shown\", !this._hide);\n this.updateOverlay();\n }\n updateOverlay() {\n var showOverlay = this.float && !this.hide;\n if (showOverlay != !!this.overlay) {\n if (showOverlay) {\n this.overlay = new Overlay({\n tag: \"div.overlay\",\n style: \"z-index: 99; animation: none; transition: opacity .3s;\",\n onclick: () => this.toggleHide(true),\n ondragover: () => this.toggleHide(true),\n });\n this.overlay.dom.style.opacity = \"0\";\n mainContainer.appendView(this.overlay);\n this.overlay.dom.offsetLeft;\n this.overlay.dom.style.opacity = \"1\";\n } else {\n const overlay = this.overlay!;\n this.overlay = null;\n overlay.dom.style.opacity = \"0\";\n fadeout(overlay.dom).onFinished(() => {\n mainContainer.removeView(overlay);\n });\n }\n }\n }\n })();\n sidebarLogin = new (class {\n container = mainContainer.sidebar.header;\n loginState = new View({ tag: \"div.item.no-selection\", tabIndex: 0 });\n loginName = new TextView({ tag: \"span.user-name\" });\n loginAvatar = new View({ tag: \"img.user-avatar\" });\n init() {\n this.loginState.addView(this.loginAvatar, 0);\n this.loginState.addView(this.loginName, 1);\n this.container.addView(this.loginState, 0);\n this.loginState.dom.id = \"login-state\";\n this.loginState.onActive.add((ev) => {\n user.openUI(undefined, ev);\n });\n }\n update() {\n var text = this.loginName.text;\n var username = user.pendingInfo?.username ?? user.info.username;\n var avatar = api.processUrl(user.info?.avatar) ?? \"\";\n if (username) {\n text = username;\n if (user.state === \"logging\") text += I` (logging in...)`;\n if (user.state === \"error\") text += I` (error!)`;\n if (user.state === \"none\") text += I` (not logged in)`;\n } else {\n if (user.state === \"logging\") text = I`(logging...)`;\n else text = I`Guest (click to login)`;\n }\n this.loginName.text = text;\n this.loginAvatar.hidden = !avatar;\n (this.loginAvatar.dom as HTMLImageElement).src = avatar;\n }\n })();\n sidebarList = new (class {\n container = mainContainer.sidebar.list;\n\n featuresListview = mainContainer.sidebar.features;\n\n currentActive = new ItemActiveHelper();\n\n setActive(item: ListViewItem | null) {\n this.currentActive.set(item);\n }\n addFeatureItem(item: ListViewItem) {\n this.featuresListview.add(item);\n }\n })();\n content = new (class {\n container = mainContainer.contentOuter;\n current: views.ContentView | null = null;\n removeCurrent() {\n const cur = this.current;\n this.current = null;\n if (!cur) return;\n cur.fadeOut();\n }\n setCurrent(view: views.ContentView | null) {\n if (view === this.current) return;\n this.container.toggleClass(\"content-animation-reverse\", router.wasBacked);\n this.removeCurrent();\n if (view) {\n if (!view.parentView) {\n view.onShow();\n this.container.appendView(view);\n view.onDomInserted();\n }\n view.fadeIn();\n }\n this.current = view;\n }\n })();\n contentBg = new (class {\n bgView: View | null = null;\n imgView: View | null = null;\n videoView: View | null = null;\n curImg = \"\";\n init() {\n this.bgView = new View({ tag: \"div.content-bg\" });\n ui.content.container.addView(this.bgView, 0);\n\n playerCore.onTrackChanged.add(() => this.update());\n playerCore.onAudioCreated.add(() => {\n if (!playerCore.audio) return;\n this.videoView = new View(playerCore.audio);\n this.bgView!.addView(this.videoView);\n })();\n playerCore.onStateChanged.add(() => {\n this.bgView!.toggleClass(\n \"has-video\",\n playerCore.track?.infoObj?.type === \"video\",\n );\n });\n api.onTrackInfoChanged.add(\n (t) => t.id === playerCore.track?.id && this.update(),\n );\n }\n\n toggleFullVideo(full: boolean) {\n this.bgView!.toggleClass(\"full-video\", full);\n }\n\n update() {\n const newTrack = playerCore.track;\n if (newTrack?.thumburl && newTrack.type != \"video\") {\n const url = \"url(\" + api.processUrl(newTrack.thumburl) + \")\";\n if (this.curImg != url) {\n const newView = new View({\n tag: \"div.content-bg-img\",\n style: { backgroundImage: url },\n });\n this.bgView!.addView(newView, 0);\n this.fadeoutCurrent();\n this.imgView = newView;\n this.curImg = url;\n }\n } else {\n this.fadeoutCurrent();\n }\n }\n\n fadeoutCurrent() {\n const oldbg = this.imgView;\n if (oldbg) {\n fadeout(oldbg.dom, { remove: false }).onFinished(() => {\n oldbg!.removeFromParent();\n });\n this.curImg = \"\";\n }\n }\n })();\n windowTitle = new (class {\n appName = I`Music Cloud`;\n init() {\n this.reset();\n playerCore.onTrackChanged.add(() => {\n ui.windowTitle.setFromTrack(playerCore.track);\n });\n }\n reset() {\n this.setTitle(null);\n }\n setTitle(title: string | null) {\n if (title) title += \" - \" + this.appName;\n else title = this.appName;\n document.title = title;\n }\n setFromTrack(track: Track | null) {\n if (!track) this.setTitle(null);\n else this.setTitle(track.name + \" - \" + track.artist);\n }\n })();\n notification = new (class {\n siNotification = new SettingItem(\"mcloud-notif\", \"json\", {\n enabled: false,\n nowPlaying: true,\n });\n lastNotif: Notification | null = null;\n get config() {\n return this.siNotification.data;\n }\n isEnabledFor(key: keyof this[\"config\"]) {\n return this.config.enabled && this.config[key as any];\n }\n browserSupport() {\n return \"Notification\" in window;\n }\n checkPermission() {\n return Notification.permission == \"granted\";\n }\n async requestPermission(): Promise {\n if (!this.browserSupport()) return false;\n if (this.checkPermission()) return true;\n return (await Notification.requestPermission()) == \"granted\";\n }\n show(title: string, options?: NotificationOptions, timeout = 5000) {\n console.info(\"[UI] notification\", { title, options, timeout });\n if (this.lastNotif) this.lastNotif.close();\n var current = (this.lastNotif = new Notification(title, options));\n if (timeout) {\n setTimeout(() => {\n current.close();\n }, timeout);\n }\n return current;\n }\n init() {\n if (\n this.config.enabled &&\n (!this.browserSupport() || !this.checkPermission())\n ) {\n this.config.enabled = false;\n this.siNotification.save();\n }\n playerCore.onTrackChanged.add(() => {\n if (\n this.isEnabledFor(\"nowPlaying\") &&\n !ui.isVisible() &&\n this.config.nowPlaying &&\n (playerCore.state == \"playing\" || playerCore.state == \"stalled\")\n ) {\n const track = playerCore.track!;\n this.show(track.name, {\n body: I`Artist` + \": \" + track?.artist,\n requireInteraction: false,\n image: !track?.picurl ? undefined : api.processUrl(track.picurl)!,\n silent: true,\n });\n }\n });\n }\n async setEnable(enable: boolean) {\n if (\n enable &&\n !(this.browserSupport() && (await this.requestPermission()))\n )\n return;\n this.config.enabled = enable;\n this.siNotification.save();\n }\n })();\n\n showContextMenuForItem(\n items: ListViewItem[],\n menu: ContextMenu,\n ...args: Parameters\n ) {\n menu.show(...args);\n items.forEach((t) => t.toggleClass(\"menu-shown\", true));\n menu.onClose.add(() => {\n items.forEach((t) => t.toggleClass(\"menu-shown\", false));\n });\n }\n})(); // ui\n\nclass TouchPanListener {\n onStart = new Callbacks<() => void>();\n onMove = new Callbacks<(data: { deltaX: number; deltaY: number }) => void>();\n onEnd = new Callbacks<() => void>();\n filter: (e: TouchEvent) => boolean;\n constructor(\n readonly element: HTMLElement,\n public mode: \"x\" | \"y\" | \"both\" = \"both\",\n ) {}\n\n private _enabled = false;\n get enabled() {\n return this._enabled;\n }\n set enabled(v: boolean) {\n if (v == this._enabled) return;\n this._enabled = v;\n if (v) {\n this.element.addEventListener(\"touchstart\", this._listener, true);\n } else {\n this.element.removeEventListener(\"touchstart\", this._listener, true);\n }\n }\n\n private _listener = (ev: TouchEvent) => {\n if (this.filter && !this.filter(ev)) return;\n if (ev.touches.length > 1) return;\n var startX = ev.touches[0].pageX;\n var startY = ev.touches[0].pageY;\n var state: \"begin\" | \"moving\" | \"ignore\" = \"begin\";\n const move = (ev: TouchEvent) => {\n const x = ev.touches[0].pageX;\n const y = ev.touches[0].pageY;\n // console.info({ state, x, y, startX, startY });\n if (state == \"ignore\") return;\n else if (state == \"moving\") {\n ev.preventDefault();\n ev.stopPropagation();\n var deltaX = x - startX;\n var deltaY = y - startY;\n this.onMove.invoke({ deltaX, deltaY });\n startX = x;\n startY = y;\n } else {\n // begin\n if (\n this.mode == \"x\" &&\n Math.abs(y - startY) > 10 &&\n Math.abs(y - startY) > Math.abs(x - startX)\n ) {\n state = \"ignore\";\n } else if (\n this.mode == \"y\" &&\n Math.abs(x - startX) > 10 &&\n Math.abs(x - startX) > Math.abs(y - startY)\n ) {\n state = \"ignore\";\n } else if (Math.abs(x - startX) > 10 || Math.abs(y - startY) > 10) {\n state = \"moving\";\n ev.preventDefault();\n ev.stopPropagation();\n this.onStart.invoke();\n }\n }\n };\n const end = (ev: TouchEvent) => {\n if (ev.touches.length == 0) {\n if (state == \"moving\") {\n this.onEnd.invoke();\n }\n this.element.removeEventListener(\"touchmove\", move, true);\n this.element.removeEventListener(\"touchend\", end, true);\n this.element.removeEventListener(\"touchcancel\", end, true);\n }\n };\n this.element.addEventListener(\"touchmove\", move, true);\n this.element.addEventListener(\"touchend\", end, true);\n this.element.addEventListener(\"touchcancel\", end, true);\n };\n}\n\nfunction numSoftLimit(num: number, low: number, high: number, factor: number) {\n if (num > high) {\n return high + (num - high) * factor;\n } else if (num < low) {\n return low + (num - low) * factor;\n }\n return num;\n}\n","import { api } from \"../API/Api\";\nimport {\n Action,\n BuildDomExpr,\n ContextMenu,\n formatDateTime,\n FuncOrVal,\n jsx,\n LazyListView,\n ListViewItem,\n LoadingIndicator,\n MenuInfoItem,\n MenuItem,\n View,\n} from \"../Infra/viewlib\";\nimport { Lazy, DataUpdatingHelper } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { user } from \"../API/User\";\nimport { Api } from \"../API/apidef\";\nimport { msgcli } from \"../API/MessageClient\";\nimport { ui } from \"../Infra/UI\";\nimport { ListContentView } from \"../Infra/ListContentView\";\n\nexport class CommentsContentView extends ListContentView {\n comments: CommentsView;\n editorNew: CommentEditor;\n listView: LazyListView;\n constructor(comments: CommentsView) {\n super();\n this.comments = comments;\n }\n protected appendHeader() {\n super.appendHeader();\n this.header.appendView((this.editorNew = new CommentEditor()));\n this.editorNew.dom.classList.add(\"comment-editor-new\");\n this.editorNew.onsubmit = (editor) => {\n var content = editor.content;\n editor.content = \"\";\n if (content === \"\") return;\n this.comments.post(content);\n };\n this.refreshBtn.onActive.add(() => {\n this.comments.fetch();\n });\n }\n protected appendListView() {\n super.appendListView();\n if (!this.comments.state) this.comments.fetch();\n }\n}\n\nexport class CommentsView {\n endpoint: string;\n eventName: string;\n eventRegistered: boolean;\n title: FuncOrVal;\n lazyView = new Lazy(() => this.createContentView());\n get view() {\n return this.lazyView.value;\n }\n state: false | \"waiting\" | \"fetching\" | \"error\" | \"fetched\" = false;\n async fetch(slient?: boolean) {\n if (this.state === \"fetching\" || this.state === \"waiting\") {\n console.warn(\"[Comments] another fetch task is running.\");\n return;\n }\n this.state = \"waiting\";\n var li = new LoadingIndicator();\n if (!slient) this.view.useLoadingIndicator(li);\n try {\n await user.waitLogin(true);\n this.state = \"fetching\";\n var resp = (await api.get(\n this.endpoint + \"?reverse=1\"\n )) as Api.CommentList;\n this.view.useLoadingIndicator(null);\n } catch (error) {\n this.state = \"error\";\n li.error(error, () => this.fetch());\n this.view.useLoadingIndicator(li);\n throw error;\n }\n const thiz = this;\n new (class extends DataUpdatingHelper {\n items = thiz.view.listView;\n addItem(c: Api.Comment, pos: number) {\n thiz.addItem(c, pos);\n }\n updateItem(view: CommentViewItem, c: Api.Comment) {\n view.comment = c;\n }\n removeItem(view: CommentViewItem) {\n view.remove();\n }\n })().update(resp.comments);\n this.view.updateView();\n this.state = \"fetched\";\n if (this.eventName && !this.eventRegistered) {\n msgcli.listenEvent(\n this.eventName,\n () => {\n this.fetch(true);\n },\n true\n );\n this.eventRegistered = true;\n }\n }\n private addItem(c: Api.Comment, pos?: number): void {\n const comm = new CommentViewItem(c);\n if (c.uid === user.info.id || user.isAdmin)\n comm.onremove = () => {\n this.ioAction(() =>\n api.delete({\n path: this.endpoint + \"/\" + comm.comment.id,\n })\n );\n };\n return this.view.listView.add(comm, pos);\n }\n private async ioAction(func: () => Promise) {\n var li = new LoadingIndicator({ content: I`Submitting` });\n this.view.useLoadingIndicator(li);\n await li.action(async () => {\n await func();\n await this.fetch();\n });\n }\n async post(content: string) {\n await this.ioAction(() =>\n api.post({\n path: this.endpoint + \"/new\",\n obj: {\n content: content,\n },\n })\n );\n }\n createContentView() {\n var view = new CommentsContentView(this);\n view.title = this.title ?? (() => I`Comments`);\n return view;\n }\n}\n\nclass CommentViewItem extends ListViewItem {\n constructor(comment: Api.Comment) {\n super();\n this.comment = comment;\n }\n comment: Api.Comment;\n get id() {\n return this.comment.id;\n }\n onremove: Action;\n onedit: Action;\n createDom(): BuildDomExpr {\n return (\n
\n
{() => this.comment.username}
\n
\n {() => formatDateTime(new Date(this.comment.date))}\n
\n
{() => this.comment.content}
\n
\n );\n }\n onContextMenu = (item, ev) => {\n ev.preventDefault();\n var m = new ContextMenu([\n new MenuInfoItem({ text: I`Comment ID` + \": \" + this.comment.id }),\n ]);\n if (this.onremove) {\n m.add(\n new MenuItem({\n text: I`Remove`,\n cls: \"dangerous\",\n onActive: () => {\n this.onremove(this);\n },\n }),\n 0\n );\n }\n if (this.onedit) {\n m.add(\n new MenuItem({\n text: I`Edit`,\n onActive: () => {\n this.onedit(this);\n },\n }),\n 0\n );\n }\n ui.showContextMenuForItem([this], m, { ev: ev });\n };\n}\n\nclass CommentEditor extends View {\n domcontent: HTMLTextAreaElement;\n domsubmit: HTMLDivElement;\n onsubmit: Action;\n get content() {\n this.ensureDom();\n return this.domcontent.value;\n }\n set content(val) {\n this.ensureDom();\n this.domcontent.value = val;\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"div.comment-editor\",\n child: [\n { tag: \"textarea.input-text.content\", _id: \"content\" },\n { tag: \"div.btn.submit\", textContent: I`Submit`, _id: \"submit\" },\n ],\n };\n }\n postCreateDom() {\n this.domcontent = this.getDomById(\"content\") as HTMLTextAreaElement;\n this.domsubmit = this.getDomById(\"submit\") as HTMLDivElement;\n this.domcontent.addEventListener(\"keydown\", (ev) => {\n if (ev.ctrlKey && ev.keyCode === 13) {\n this.onsubmit(this);\n }\n });\n this.domsubmit.addEventListener(\"click\", () => {\n this.onsubmit(this);\n });\n }\n}\n","// file: discussion.ts\n\nimport { ui } from \"../Infra/UI\";\nimport { I } from \"../I18n/I18n\";\nimport { user } from \"../API/User\";\nimport { router } from \"../Infra/Router\";\nimport { SidebarItem } from \"../Infra/ui-views\";\nimport { settings } from \"../Settings/Settings\";\nimport { CommentsView } from \"./CommentsView\";\n\nexport const discussion = new (class extends CommentsView {\n endpoint = \"discussion\";\n eventName = \"diss-changed\";\n init() {\n this.title = () => I`Discussion`;\n this.sidebarItem = new SidebarItem({ text: () => I`Discussion` });\n router.addRoute({\n path: [\"discussion\"],\n sidebarItem: () => this.sidebarItem,\n contentView: () => this.lazyView.value,\n });\n ui.sidebarList.addFeatureItem(this.sidebarItem);\n user.onSwitchedUser.add(() => {\n this.sidebarItem.hidden = !(\n user.state == \"logged\" &&\n user.serverOptions.discussionEnabled &&\n settings.showDiscussion\n );\n })(null);\n }\n sidebarItem: SidebarItem;\n})();\n\nexport const notes = new (class extends CommentsView {\n endpoint = \"my/notes\";\n eventName = \"note-changed\";\n init() {\n this.title = () => I`Notes`;\n this.sidebarItem = new SidebarItem({ text: () => I`Notes` });\n router.addRoute({\n path: [\"notes\"],\n sidebarItem: () => this.sidebarItem,\n contentView: () => this.lazyView.value,\n });\n ui.sidebarList.addFeatureItem(this.sidebarItem);\n user.onSwitchedUser.add(() => {\n if (this.state && notes.state !== \"waiting\") this.fetch();\n });\n user.onSwitchedUser.add(() => {\n this.sidebarItem.hidden = !(\n user.state == \"logged\" &&\n user.serverOptions.notesEnabled &&\n settings.showNotes\n );\n })(null);\n }\n sidebarItem: SidebarItem;\n})();\n\nexport const comments = new (class {\n init() {\n router.addRoute({\n path: [\"track-comments\"],\n onNav: ({ remaining }) => {\n var id = parseInt(remaining[0]);\n ui.sidebarList.setActive(null);\n var comments = new CommentsView();\n comments.endpoint = \"tracks/\" + id + \"/comments\";\n ui.content.setCurrent(comments.view);\n },\n });\n }\n})();\n","import { router } from \"../Infra/Router\";\nimport { ui } from \"../Infra/UI\";\nimport { Lazy, BuildDomExpr, SettingItem } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { LyricsView } from \"../Lyrics/LyricsView\";\nimport { api } from \"../API/Api\";\nimport {\n SidebarItem,\n ContentView,\n ContentHeader,\n ActionBtn,\n setScrollableShadow,\n} from \"../Infra/ui-views\";\nimport { LoadingIndicator, View, ViewToggle } from \"../Infra/viewlib\";\nimport { Api } from \"../API/apidef\";\nimport { Track } from \"./Track\";\n\nexport const nowPlaying = new (class {\n init() {\n var sidebarItem = new SidebarItem({ text: () => I`Now Playing` });\n router.addRoute({\n path: [\"nowplaying\"],\n contentView: () => this.view,\n sidebarItem: () => sidebarItem,\n });\n router.addRoute({\n path: [\"tracks\"],\n onNav: (arg) => {\n router.nav([\"track\", ...arg.remaining], { pushState: \"replace\" });\n },\n });\n router.addRoute({\n path: [\"track\"],\n onNav: (arg) => {\n router.nav([\"nowplaying\"], { pushState: false });\n if (arg.remaining[0] != (playerCore.track?.id as any)) {\n // compare string to number\n api.get(\"tracks/\" + arg.remaining[0]).then((t: Api.Track) => {\n playerCore.setTrack(new Track({ infoObj: t }));\n });\n }\n },\n });\n ui.sidebarList.addFeatureItem(sidebarItem);\n playerCore.onTrackChanged.add(() => {\n sidebarItem.hidden = !playerCore.track;\n })();\n }\n get view() {\n return this.lazyView.value;\n }\n lazyView = new Lazy(() => new PlayingView());\n})();\n\nclass PlayingView extends ContentView {\n header = new (class extends ContentHeader {\n lines: View;\n onScrollboxScroll() {\n setScrollableShadow(\n this.dom,\n this.scrollbox!.scrollTop - this.lines.dom.offsetTop\n );\n }\n })({\n title: () => I`Now Playing`,\n });\n infoView = new View({\n tag: \"div.infoview\",\n child: [\n { tag: \"div.name\", text: () => playerCore.track?.name },\n { tag: \"div.artist\", text: () => playerCore.track?.artist },\n ],\n });\n lyricsView = new LyricsView();\n loading = new LoadingIndicator();\n loadingOuter = new View({\n tag: \"div\",\n child: this.loading,\n style: {\n flex: 1,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n },\n });\n viewToggle = new ViewToggle({\n container: this,\n items: {\n header: this.header,\n normal: this.lyricsView,\n loading: this.loadingOuter,\n },\n });\n editBtn: ActionBtn;\n si = new SettingItem(\"mcloud-nowplaying\", \"json\", {\n lyricsScale: 100,\n });\n loadedLyrics: string = \"\";\n constructor() {\n super();\n this.header.lines = this.lyricsView.lines;\n this.header.dom.style.background = \"none\";\n this.lyricsView.scale = this.si.data.lyricsScale;\n this.lyricsView.onFontSizeChanged.add(() => {\n this.si.data.lyricsScale = this.lyricsView.scale;\n this.si.save();\n this.lyricsView.centerLyrics();\n });\n this.lyricsView.onLyricsChanged.add(() => {\n this.header.onScrollboxScroll();\n });\n this.lyricsView.onSpanClick.add((s) => {\n if (s.span.startTime && s.span.startTime >= 0)\n playerCore.currentTime = s.span.startTime;\n });\n this.header.actions.addView(\n (this.editBtn = new ActionBtn({\n text: I`Edit`,\n onActive: (ev) => {\n playerCore.track?.startEdit(ev);\n },\n }))\n );\n this.header.appendView(this.infoView);\n this.header.bindScrollBox(this.lyricsView.dom);\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"div.playingview\",\n child: [this.header, this.lyricsView],\n };\n }\n postCreateDom() {\n super.postCreateDom();\n }\n onShow() {\n super.onShow();\n this.ensureDom();\n }\n onDomInserted() {\n super.onDomInserted();\n this.shownEvents.add(playerCore.onTrackChanged, () => {\n this.checkTrack();\n })();\n this.shownEvents.add(playerCore.onProgressChanged, () =>\n this.lyricsView.onProgressChanged()\n );\n this.shownEvents.add(api.onTrackInfoChanged, (track) => {\n if (track.id === playerCore.track?.id) {\n this.checkTrack();\n }\n });\n this.lyricsView.onShow();\n }\n onShowing() {\n super.onShowing();\n ui.contentBg.toggleFullVideo(true);\n }\n onHiding() {\n super.onHiding();\n ui.contentBg.toggleFullVideo(false);\n }\n onRemove() {\n super.onRemove();\n this.lyricsView.onHide();\n }\n onSidebarItemReactived() {\n this.lyricsView.setScrollingPause(null);\n this.lyricsView.setCurrentTime(this.lyricsView.curTime, \"smooth\");\n }\n _checkTrackVersion = 0;\n async checkTrack() {\n var version = ++this._checkTrackVersion;\n this.infoView.updateDom();\n const newTrack = playerCore.track;\n let newLyrics = \"\";\n this.editBtn.hidden = !newTrack;\n this.editBtn.text = newTrack?.canEdit ? I`Edit` : I`Details`;\n\n this.loadingOuter.dom.remove();\n\n if (newTrack?.type == \"video\") {\n this.viewToggle.setShownKeys([]);\n return;\n }\n\n if (newTrack && !newTrack.isLyricsGotten()) {\n this.loading.reset();\n this.viewToggle.setShownKeys([\"header\", \"loading\"]);\n try {\n newLyrics = await newTrack.getLyrics();\n } catch (error) {\n if (version != this._checkTrackVersion) return;\n this.loading.error(error, () => this.checkTrack());\n return;\n }\n if (version != this._checkTrackVersion) return;\n } else {\n newLyrics = newTrack?.lyrics || \"\";\n }\n\n this.viewToggle.setShownKeys([\"header\", \"normal\"]);\n\n this.lyricsView.track = newTrack;\n\n if (this.loadedLyrics != newLyrics) {\n this.loadedLyrics = newLyrics;\n this.lyricsView.reset();\n this.lyricsView.setLyrics(newLyrics);\n }\n }\n}\n","import { msgcli } from \"../API/MessageClient\";\nimport { playerCore } from \"./PlayerCore\";\n\n// TODO\nexport const listenTogether = new (class ListenTogether {\n init() {}\n\n createSession() {\n // Generate random id\n // this.joinSession(id)\n }\n\n joinSession() {\n // msgcli.listenEvent('lt/${id}')\n }\n\n leaveSession() {}\n\n openUI() {}\n})();\n","import { router } from \"../Infra/Router\";\nimport { ui } from \"../Infra/UI\";\nimport { Lazy, Callbacks, BuildDomExpr } from \"../Infra/utils\";\nimport { I } from \"../I18n/I18n\";\nimport { ListContentView } from \"../Infra/ListContentView\";\nimport {\n InputView,\n View,\n ButtonView,\n LoadingIndicator,\n ListView,\n LazyListView,\n} from \"../Infra/viewlib\";\nimport { api } from \"../API/Api\";\nimport { Api } from \"../API/apidef\";\nimport { TrackViewItem, TrackList } from \"./TrackList\";\nimport { Track } from \"./Track\";\nimport { playerCore } from \"../Player/PlayerCore\";\nimport { ListIndexViewItem } from \"./ListIndex\";\n\nexport const search = new (class {\n init() {\n this.sidebarItem = new ListIndexViewItem({ text: () => I`Search` });\n router.addRoute({\n path: [\"search\"],\n contentView: () => this.view,\n sidebarItem: () => this.sidebarItem,\n onNav: (arg) => {\n const query = arg.remaining[0];\n if (query && query != this.view.currentQuery)\n this.view.performSearch(query);\n },\n });\n ui.sidebarList.addFeatureItem(this.sidebarItem);\n playerCore.onTrackChanged.add(this.checkPlaying)();\n }\n get view() {\n return this.lazyView.value;\n }\n lazyView = new Lazy(() => new SearchView());\n sidebarItem: ListIndexViewItem;\n checkPlaying = () => {\n var thisPlaying =\n this.lazyView.computed &&\n !!this.view.tempList &&\n playerCore.track?._bind?.list === this.view.tempList;\n this.sidebarItem.updateWith({ playing: thisPlaying });\n };\n})();\n\nclass SearchView extends ListContentView {\n title = () => I`Search`;\n searchbar = new SearchBar();\n currentQuery: string;\n tempList: TrackList | null = null;\n listView: LazyListView;\n appendListView() {\n super.appendListView();\n this.listView.toggleClass(\"tracklistview\", true);\n this.listView.dragging = true;\n this.listView.onItemClicked = (item) => {\n var track = this.getTempList().tracks[item.position!];\n if (playerCore.track === track && playerCore.isPlaying) {\n router.nav(\"nowplaying\");\n return;\n }\n playerCore.playTrack(track);\n };\n }\n appendHeader() {\n super.appendHeader();\n this.refreshBtn.hidden = true;\n this.header.appendView(this.searchbar);\n this.searchbar.onSearch.add(() => {\n this.performSearch(this.searchbar.input.value);\n });\n }\n getTempList() {\n if (!this.tempList) {\n this.tempList = new TrackList();\n this.listView.forEach((t) => this.tempList!.addTrack(t.track.infoObj!));\n }\n return this.tempList;\n }\n async performSearch(query: string) {\n this.currentQuery = query;\n if (this.searchbar.value != query) this.searchbar.value = query;\n var li = new LoadingIndicator();\n this.useLoadingIndicator(li);\n router.nav([\"search\", query]);\n try {\n var r = (await api.get(\"tracks?query=\" + encodeURIComponent(query))) as {\n tracks: Api.Track[];\n };\n this.tempList = null;\n search.checkPlaying();\n this.listView.removeAll();\n r.tracks.forEach((t) => {\n this.listView.add(new TrackViewItem(new Track({ infoObj: t })));\n });\n this.updatePlaying();\n this.useLoadingIndicator(null);\n } catch (error) {\n li.error(error, () => this.performSearch(query));\n }\n }\n onShow() {\n super.onShow();\n this.updatePlaying();\n this.shownEvents.add(playerCore.onTrackChanged, () => this.updatePlaying());\n }\n onRemove() {\n super.onRemove();\n }\n updatePlaying() {\n var playing = playerCore.track;\n this.listView.forEach((t) => {\n t.updateWith({ playing: !!playing && t.track.id === playing.id });\n });\n }\n}\n\nclass SearchBar extends View {\n input = new InputView();\n btn = new ButtonView({\n text: I`Search`,\n onActive: () => this.onSearch.invoke(),\n });\n onSearch = new Callbacks();\n get value() {\n return this.input.value;\n }\n set value(val) {\n this.input.value = val;\n }\n createDom(): BuildDomExpr {\n return {\n tag: \"div.searchbar\",\n child: [this.input, this.btn],\n };\n }\n postCreateDom() {\n super.postCreateDom();\n this.input.dom.addEventListener(\"keydown\", (ev) => {\n if (ev.code === \"Enter\") {\n ev.preventDefault();\n this.onSearch.invoke();\n }\n });\n }\n}\n","export const serviceWorkerClient = new (class ServiceWorkerClient {\n reg: ServiceWorkerRegistration | null = null;\n async init() {\n if (window.location.protocol == \"https:\") {\n try {\n this.reg = await navigator.serviceWorker.register(\"sw.bundle.js\", {\n scope: \".\",\n });\n console.info(\"[sw client] service worker registered\", this.reg);\n } catch (error) {\n console.error(\"[sw client] error\", error);\n }\n } else {\n console.info(\n \"[sw client] non-https protocol, skipping service worker registration\"\n );\n }\n }\n})();\n","import type { playerCore } from \"../Player/PlayerCore\";\n\nexport const infoProvider = {\n init(player: typeof playerCore) {\n const channel = new BroadcastChannel(\"mc-player\");\n\n channel.addEventListener(\"message\", (ev) => {\n const {\n data: { type },\n } = ev;\n if (type === \"request_state\") {\n postTrack();\n postLyrics();\n postTime();\n }\n });\n\n player.onTrackChanged.add((e) => {\n postTrack();\n postLyrics();\n });\n player.onProgressChanged.add((e) => {\n postTime();\n });\n\n function postTrack() {\n const track = player.track;\n channel.postMessage({\n type: \"track\",\n track: track?.infoObj,\n });\n }\n\n function postLyrics() {\n const track = player.track;\n (track?.getLyrics() ?? Promise.resolve(null)).then((lyrics) => {\n if (track !== player.track) {\n return;\n }\n channel.postMessage({\n type: \"lyrics\",\n trackId: track?.id,\n lyrics: lyrics,\n });\n });\n }\n\n function postTime() {\n channel.postMessage({\n type: \"time\",\n time: player.currentTime,\n });\n }\n },\n};\n","/*! *************************************************\n Copyright (c) 2020 lideming\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n************************************************* */\n\n// file: main.ts\n// TypeScript is required.\n\n// Why do we need React and Vue.js? ;)\n// Update: We have webfx now.\n\nimport { injectCss, Toast, ToastsContainer } from \"./Infra/viewlib\";\nimport { ui } from \"./Infra/UI\";\nimport { playerCore } from \"./Player/PlayerCore\";\nimport { api } from \"./API/Api\";\nimport { user } from \"./API/User\";\nimport { listIndex } from \"./Track/ListIndex\";\nimport { uploads } from \"./Track/Uploads\";\nimport { comments, discussion, notes } from \"./Comments/Discussion\";\nimport { router } from \"./Infra/Router\";\nimport { settingsUI } from \"./Settings/SettingsUI\";\nimport { msgcli } from \"./API/MessageClient\";\nimport { nowPlaying } from \"./Track/NowPlaying\";\nimport { listenTogether } from \"./Player/ListenTogether\";\nimport { search } from \"./Track/Search\";\nimport * as Lyrics from \"./Lyrics/Lyrics\";\nimport { lyricsEdit } from \"./Lyrics/LyricsEdit\";\nimport { appVersion } from \"./Settings/AppVersion\";\nimport { settings } from \"./Settings/Settings\";\nimport { playerFX } from \"./Player/PlayerFX\";\nimport { serviceWorkerClient } from \"./ServiceWorker/client\";\nimport { infoProvider } from \"./Overlay/infoProvider\";\nimport { userStore, UserStoreFields, UserStoreItem } from \"./API/UserStore\";\nimport { plugins } from \"./Plugins/plugins\";\n\nimport * as webfx from \"@yuuza/webfx\";\n\nimport style from \"../style.less\";\n\nfunction init() {\n console.time(\"[Main] app init()\");\n settings.init();\n checkMode();\n injectStyle();\n playerCore.init();\n ui.init();\n playerFX.init();\n user.init();\n uploads.init();\n search.init();\n discussion.init();\n notes.init();\n nowPlaying.init();\n listenTogether.init();\n comments.init();\n listIndex.init();\n msgcli.init();\n router.init();\n appVersion.showUpdatedToast();\n serviceWorkerClient.init();\n plugins.init();\n infoProvider.init(playerCore);\n console.timeEnd(\"[Main] app init()\");\n\n waitInitialLoading();\n}\n\nasync function waitInitialLoading() {\n try {\n ui.preload.jsok();\n ui.preload.progress(0.33);\n const stateText = ui.preload.log(\"Logging in...\", \"info\");\n await Promise.race([\n webfx.sleepAsync(1000),\n user\n .waitLogin(false)\n .then(() => {\n stateText.text = \"Loading plugins...\";\n ui.preload.progress(0.66);\n })\n .then(() => plugins.waitPluginsLoading())\n .then(() => {\n stateText.text = \"\";\n ui.preload.progress(1);\n }),\n ]);\n } finally {\n ui.preload.end();\n }\n}\n\nfunction checkMode() {\n if (localStorage.getItem(\"mcloud-dev\") == \"1\") {\n webfx.startBlockingDetect();\n }\n}\n\nfunction injectStyle() {\n webfx.injectWebfxCss();\n injectCss(style, { tag: \"style#mcloud-injected-style\" });\n}\n\nexport {\n api,\n discussion,\n listIndex,\n Lyrics,\n lyricsEdit,\n msgcli,\n notes,\n nowPlaying,\n playerCore,\n playerFX,\n plugins,\n router,\n settings,\n settingsUI,\n Toast,\n ToastsContainer,\n ui,\n uploads,\n user,\n userStore,\n UserStoreItem,\n UserStoreFields,\n webfx,\n};\n\ninit();\n"],"names":["__awaiter$2","this","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","adopt","then","apply","_object_assign","Object","assign","_object_hasOwnProperty","prototype","hasOwnProperty","strPadLeft","str","len","ch","length","formatDuration","sec","isNaN","Math","round","min","floor","toString","fileSizeUnits","formatFileSize","size","unit","toFixed","formatDateTime","date","now","Date","getFullYear","getMonth","getDate","toLocaleTimeString","toLocaleString","numLimit","num","max","createName","nameFunc","existsFunc","base64EncodeUtf8","btoa","encodeURIComponent","replace","toSolidBytes","match","p1","String","fromCharCode","sleepAsync","time","setTimeout","arrayRemove","array","val","i","splice","arrayInsert","pos","undefined","push","arrayMap","arr","func","Array","map","idx","ret","item","arrayForeach","foreachFlaten","it","arrayFind","find","arraySum","sum","x","objectApply","obj","kv","keys","key","call","indexOf","objectInit","startsWith","Callbacks","add","mod","a","b","remove","CallbacksImpl","constructor","_cbs","_cbs_invoking","_hook","_invoking","onChanged","_a","invoke","args","Error","forEach","error","console","clear","callback","_b","Set","delete","waitOnce","arguments","cb","accessedRefs","Ref","_value","_onChanged","static","ref","deps","updateValue","dep","beginRefCollect","endRefCollect","Lazy","_func","computed","rawValue","Semaphore","init","queue","maxCount","runningCount","enter","prom","res","exit","window","queueMicrotask","shift","run","CancelToken","cancelled","onCancelled","cancel","throwIfCancelled","EventRegistrations","list","event","removeAll","r","pop","View","dom","parentView","_position","_domctx","BuildDOMCtx","_dom","_baseView","_mountState","MountState","Unmounted","_onActive","_childViews","view","domExprCreated","position","ensureDom","domCreated","baseView","mountState","hidden","createDom","buildView","postCreateDom","updateDom","document","createElement","debugging","dataset","update","mountStateChanged","state","trace","child","getDomById","id","dict","updateWith","updateAllWith","updateAll","toggleClass","clsName","force","getDOM","addChild","appendView","appendChild","onActive","addEventListener","handleKeyDown","code","rect","getBoundingClientRect","MouseEvent","clientX","clientY","y","relatedTarget","preventDefault","childViews","addView","_registerChild","Mounted","Mounting","_insertToDom","changeMountState","items","removeView","_ensureItem","_removeFromDom","removeAllView","removeFromParent","updateChildren","insertBefore","tryGetDOM","idom","Node","parent","childView","warnMountingView","buildDOM","data","mountView","unmountView","ContainerView","super","Symbol","iterator","get","actions","setDict","node","addUpdateAction","action","TextAction","textContent","HiddenAction","UpdateAction","tryHandleValues","ctx","createTextNode","buildDomCore","ttl","JsxNode","tag","ele","reg","exec","classList","substr","createElementFromTag","buildDOMHandleKey","className","styleKey","styleVal","style","attrs","childs","buildDom","jsxBuildCore","c","jsxBuild","jsxFactory","jsx","clearChildren","lastChild","removeChild","element","clsList","toggle","contains","fadeout","options","duration","end","finish","removeEventListener","onTransitionend","eventPhase","Event","AT_TARGET","finished","onFinished","startBlockingDetect","threshold","begin","lastRun","setInterval","info","Timer","cancelFunc","timeout","tryCancel","handle","clearTimeout","interval","clearInterval","animationFrame","requestAnimationFrame","cancelAnimationFrame","listenPointerEvents","touchDown","mouseDown","type","ev","point","mousemove","mouseup","touchStart","ct","changedTouches","touch","touchmove","touchend","touches","listenEvent","handler","listenEvents","events","injectCss","css","head","text","TextCompositionWatcher","isCompositing","_isCompositing","onCompositingChanged","InputStateTracker","mouseIn","focusIn","_removeEvents","_removePointerEvents","stateChanged","removeListeners","DataUpdatingHelper","newData","oldData","dataDict","n","dataSelectId","itemDict","removed","d","selectId","removeItem","updateItem","addItem","updateOrRebuildAll","isSame","rebuildAll","t","o","old","I18n","curLang","missing","Map","arg","get2","lang","langObj","log","has","set","add2dArray","langObjs","langs","line","j","renderElements","elements","childNodes","nodeType","TEXT_NODE","beforeI18n","cur","curIdx","languages","navigator","language","l","createStringBuilder","i18n","arrBuilder","createArrayBuilder","literals","placeholders","join","formatCache","WeakMap","parseCache","format","translatedFormat","parsed","parseTemplate","template","buf","I","getWebfxCss","cssInjected","injectWebfxCss","TextView","_text","textFunc","ButtonView","disabled","tabIndex","TextBtn","clickable","active","right","float","TabBtn","setPosition","anchor","left","top","FlagsInput","dragManager","DragManager","_currentItem","_currentArray","onDragStart","onDragEnd","currentItem","_c","currentArray","start","startArray","EditableHelper","editing","beforeEdit","onComplete","startEdit","input","firstChild","select","focus","stopEdit","evv","startEditAsync","ViewToggle","shownKeys","toggleMode","container","setShownKeys","oldVal","toggleView","show","v","mode","display","ItemActiveHelper","funcSetActive","current","ToolTip","_shown","_timer","close","_cancelClose","shown","body","fadeOutOptions","FlagsInput_1","flags","f","flag","Flag","parentInput","Overlay","setCenterChild","centerChild","setFlags","setNoBg","nobg","setFixed","fixed","__awaiter$1","Dialog","domheader","header","defaultParent","_defaultParent","DialogParent","width","contentFlex","content","resizable","overlay","btnTitle","btnClose","title","allowClose","showCloseButton","onShown","onClose","focusTrap","addBtn","button","target","keyCode","shiftKey","tabables","querySelectorAll","offset","rectOverlay","pageX","pageY","bottom","setOffset","btn","addContent","getOffset","parseFloat","center","_cancelFadeout","onDialogShowing","setTransformOrigin","autoFocus","transformOrigin","onDialogClosing","waitClose","MessageBox","addResultBtns","results","addBtnWithResult","setTitle","addText","allowCloseWithResult","showAndWaitResult","bgOverlay","dialogCount","getView","dialog","clickThrough","InputView","multiline","placeholder","HTMLInputElement","LabeledInputBase","dominput","label","LabeledInput","ListViewItem","dragging","_selected","onSelectedChanged","enterctr","dragoverPlaceholder","listview","ListView","selectionHelper","dragData","selected","setAttribute","handleItemClicked","onItemClicked","_d","_e","_f","altKey","mouseev","onContextMenu","handleItemKeyDown","dir","scrollBox","targetY","offsetTop","offsetHeight","nextIdx","direction","selectedItems","sort","dataTransfer","setData","opacity","dragHandler","_g","_h","drop","source","sourceItems","accept","moveByDragging","selfInside","after","newpos","move","dropEffect","onDragover","hover","before","nextElementSibling","parentElement","_scrollBox","SelectionHelper","onItemMoved","itemProvider","draggable","keepSelected","toggleItemSelection","ReplaceChild","_enabled","onEnabledChanged","ctrlForceSelect","onSelectedItemsChanged","lastToggledItem","enabled","count","ctrlKey","toSelect","LazyListView","_loaded","_lazy","_slowLoading","_autoLoad","loaded","slowLoading","autoLoad","lazy","ensureLoaded","loadNext","batchSize","slowlyLoad","enableAutoLoad","cont","timer","stopLoading","unload","LoadingIndicator","_status","onclick","_textdom","reset","err","retry","_id","MenuItem","cls","keepOpen","ContextMenu","_lastcls","MenuLinkItem","link","download","href","MenuInfoItem","visible","_visible","useOverlay","_originalFocused","background","activeElement","parentWidth","offsetWidth","parentHeight","overlayDom","maxHeight","height","Section","titleView","headerView","setContent","addAction","SectionAction","ToastsContainer","parentDom","toasts","addToast","toast","removeToast","default","Toast","AutoResetEvent","_whenNotify","_callback","wait","readBlobAsDataUrl","blob","reader","FileReader","onload","onerror","readAsDataURL","replaceChild","newChild","isIOS","test","userAgent","ScrollAnimator","beginTime","beginPos","lastPos","targetPos","_rafHandle","posType","scrollEventPending","onUserScroll","_rafCallback","currentPos","scrollTop","scrollTo","_startRaf","performance","_render","abs","_easeInOutQuad","SettingItem","initial","onRender","types","serialize","deserialize","readFromStorage","localStorage","getItem","isInitial","render","fn","dontRaiseNow","oldFn","newFn","bindToBtn","prefix","bool","span","thiz","save","setItem","dontSave","loop","curData","oldIndex","findIndex","SettingItem$1","json","JSON","stringify","parse","FileSelector","domfile","multiple","files","handleFiles","open","click","file","name","onfile","IA","settings","defaultApiBaseUrl","apiBaseUrl","debug","apiDebugDelay","showDownloadOptions","showDiscussion","showNotes","server","api","API","appBaseUrl","getAppBaseUrl","location","queryStrStart","substring","hash","storageUrlBase","debugSleep","defaultAuth","onTrackInfoChanged","onTrackDeleted","baseUrl","async","random","fetch","credentials","getHeaders","headers","auth","cache","path","resp","_fetch","checkResp","method","contentType","put","post","upload","cancelToken","xhr","abort","XMLHttpRequest","whenXhrComplete","onabort","onprogress","onprogerss","processUrl","url","setRequestHeader","send","complete","checkStatus","status","resperr","creating","getTrack","getList","playerFX","PlayerFX","lastBuffers","suspendTimer","suspend","webAudioInited","AudioContext","latencyHint","createMediaElementSource","playerCore","audio","chainNodes","nodes","last","connect","analyser","createAnalyser","fftSize","gainNode","createGain","destination","resume","onStateChanged","audioWorklet","addModule","URL","createObjectURL","Blob","AudioCollector","AudioWorkletProcessor","process","inputs","outputs","parameters","port","postMessage","registerProcessor","workletNode","AudioWorkletNode","onmessage","showUI","initWebAudio","FXDialog","WIDTH","HEIGHT","canvas","getContext","createImageData","history","analyzer","freq","Uint8Array","getByteFrequencyData","unshift","buffers","totalSamples","reduce","clearRect","bufferIndex","sampleIndex","strokeStyle","beginPath","sample","moveTo","lineTo","stroke","PlayerCore","track","trackProfile","audioLoaded","objectUrl","onTrackChanged","siPlayer","loopMode","volume","preferBitrate","loudnessNormalization","onLoopModeChanged","_state","onAudioCreated","_loadRetryCount","_loadRetryTimer","play","onProgressChanged","_volume","onVolumeChanged","normalizingGain","effectiveGain","pow","volumeByGainNode","preloadedTrack","currentTime","readyState","HTMLMediaElement","HAVE_METADATA","isVideo","playbackRate","isPlaying","paused","isPaused","canPlay","siLoop","initAudio","newTrack","infoObj","crossOrigin","checkPreload","wasPlaying","msg","message","ui","isVisible","notification","isEnabledFor","requireInteraction","gain","prev","nextTrack","getNextTrack","playTrack","_bind","loadUrl","src","revokeObjectURL","load","pause","playNow","artist","oldTrack","loadTrack","forceStart","setTrack","_loadct","decideFileFromTrack","requestFileUrl","profile","bitrate","prefer","all","computeNormalizingGain","getLoudnessMap","avg","sorted","slice","trackGain","trackDb","log10","timeBegin","preload","dur","playingLoopModes","mediaSession","metadata","MediaMetadata","artwork","picurl","playbackState","setActionHandler","returnValue","buildInfo","appVersion","siVersion","currentVersion","currentDate","prevDate","versionChanged","showUpdatedToast","TypedArray","getPrototypeOf","userStore","UserStore","ok","arrayBuffer","fields","URLSearchParams","visibility","revision","ArrayBuffer","ChangeReason","UserStoreItem","remoteChangeReason","Init","remote","fetched","_putInProgress","_putPending","pendingTask","putTask","LocalSet","effect","retries","watchRemote","bytes","plugins","Plugins","userPluginList","loadedPlugin","promiseLoadingPlugins","_currentRegisterCallback","_loadingLock","user","waitLogin","loadUserPlguins","getLoadedPlugins","promises","plugin","getUserPlugins","loadingTask","loadPlugin","finally","race","allSettled","concurrencyAwareUpdate","description","filter","parsePluginURL","deletePluginCode","loadPluginFromUserStore","loadPluginFromURL","_info","rej","_afterPluginLoad","getUserStorePluginKey","getPluginCodeItem","nanoid","crypto","getRandomValues","byte","toUpperCase","setPluginCode","addUserPlugin","storeKey","keyValue","oldCallback","eval","version","registerPlugin","PluginsUI","pluginListView","_firstFetch","fetchList","loadedPlugins","PluginListViewItem","loadedInfo","onChange","addUrl","AddByUrlDialog","onSubmit","addCode","PluginCodeDialog","urlInput","storeItem","codeInput","addPluginCode","color","toEnable","toggleUserPlugin","removeUserPlugin","Boolean","settingsUI","openUI","SettingsDialog","bitrates","getThemeAndStyle","theme","split","setThemeAndStyle","RadioContainer","currentValue","currentActive","unselect","onCurrentChange","setCurrent","class","RadioOption","inputServer","btnNotification","option","colors","styles","siLang","availableLangs","config","setEnable","devFeatures","devClickCount","AboutDialog","createCommitsTable","loading","lastSha","allLoaded","table","addCommit","commit","loadMore","sha","at","parents","checkToLoadMore","scrollHeight","clientHeight","onscroll","Sidebar","SettingsBtn","features","SidebarItem","getFuncVal","contentView","bindContentView","viewFunc","Icon","icon","ContentView","_isVisible","_lastRenderedLanguage","_fadeout","_shownEvents","onShow","onDomInserted","onShowing","onHiding","onRemove","onDomRemoved","onSidebarItemReactived","fadeIn","fadeOut","shownEvents","ContentHeader","titleEditable","scrollbox","scrollboxScrollHandler","removeAttribute","titlebar","catalog","editHelper","newName","onTitleEdit","bindScrollBox","onScrollboxScroll","passive","setScrollableShadow","ActionBtn","boxShadow","CopyMenuItem","inputView","textToCopy","execCommand","innerHTML","SidebarToggle","sidebar","toggleHide","ondragover","matchMedia","matches","FakeHistory","pushState","unused","replaceState","router","routes","currentIdx","wasBacked","onNavCompleted","navByLocation","nav","addRoute","sidebarItem","parsePath","decodeURIComponent","strPath","currentStr","evenIsCurrent","oldIdx","sidebarList","setActive","onNav","remaining","route","rp","Parser","LookaheadBuffer","consumed","consume","peek","provider","mapCharToken","charCodeAt","Lexer","read","toArray","token","readCore","lastToken","Token","chCur","tokenType","tryExpect","tryExpectSeq","expect","TokenTypeEnum","tryExpectAndConsume","expectAndConsume","lines","bpm","curTime","tlang","haveReadLyrics","lex","tokens","lastpos","skipLineFeeds","parseLine","orderTime","translationLang","startTime","duplicateTime","spans","trans","lastSpan","timeStamp","lineStart","ts","beats","beatsDiv","pushRawLine","parseTimestamp","ruby","nextline","translation","rawLine","s","skipLine","parseInt","lyrics","extended","headersPending","padLeft","pad","SpanView","isNext","lineView","startX","startY","offsetX","offsetY","context","onSpanClicked","LineView","spansView","currentIndex","enableTranslation","setCurrentTime","ListContentView","_scrollPos","rendered","canMultiSelect","_canMultiSelect","selectBtn","listView","appendHeader","appendScrollBox","createHeader","refreshBtn","selectAllBtn","createScrollBox","appendListView","minHeight","useLoadingIndicator","li","loadingIndicator","insertLoadingIndicator","updateView","emptyIndicator","loadingAction","LyricsView","hasVisibleLyrics","curLine","scrollingTarget","onSpanClick","onFontSizeChanged","onLyricsChanged","scrollAnimator","_fontSize","scrollPos","_resize","resize","lastChangedRealTime","isTrackPlaying","realTime","pauseScrollTime","setLyrics","setScrollingPause","startFontSize","distance","dist","dx","screenX","dy","screenY","sqrt","scale","newdist","deltaY","scroll","getLineByTime","laterLine","isScrollingPaused","boxHeight","contentHeight","margin","centerLyrics","fontSize","onHide","hint","lyricsEdit","LyricsEditContentView","addFeatureItem","_mode","setMode","lyricsView","EditableLyricsView","sourceView","LyricsSourceView","currentView","originalLyrics","btnLyrics","btnSource","serializeLyricsFromView","setCurrentView","modified","back","inputLyrics","nextSpans","firstSpan","setNextSpans","getSpans","Infinity","go","colPos","LyricsSourceEditView","selectionStart","selectionEnd","origstr","setRangeText","cursorPos","setSelectionRange","border","padding","Track","owner","album","albumArtist","thumburl","displayName","groupId","canEdit","role","_loudmap","_lyricsFetchTask","_group","toApiTrack","getExtensionName","updateFromApiTrack","TrackDialog","getFileUrl","isLyricsGotten","getLyrics","newInfo","getGroup","groupCache","ab","catch","apiFile","fileUrl","range","preloadTrackFile","preloadThumb","inputName","inputArtist","inputAlbum","inputAlbumArtist","LabeledInputWithLoading","fileSelector","btnSave","btnEditLyrics","btnSetPicture","flex","updated","compositionWatcher","checkIfChanged","msgcli","ws","loginState","onConnected","onLogin","lastQueryId","queries","permEvents","connected","WebSocket","OPEN","onSwitchedUser","login","listenPermEvents","eventlist","sendQuery","cmd","getUrl","_","protocol","host","pathroot","pathname","onopen","onclose","warn","reason","queryId","evt","sendQueryAsync","objWithId","printFilter","autoRetry","TrackList","tracks","tracksSuffled","fetching","posting","eventListening","putDelaying","putInProgress","apiid","setLoadIndicator","loadIndicator","loadInfo","updateCanEdit","loadApiId","loadFromGetResult","onInfoChanged","addTrack_NoUpdating","remove_NoUpdating","updateTracksState","addTrack","loadEmpty","fetchImpl","postToUser","_post","getTrackListPutInfo","trackids","putCore","origVersion","getListAsync","listIndex","createView","TrackListView","bind","shuffleArray","temp","suffled","updateTracksFromListView","lvi","updateTrackInfo","curPlaying","playing","trackActionHandler","currentTracking","trackChanged","updateCurPlaying","centerCurrentTrack","onTrackRemove","canRemove","rename","lv","createViewItem","TrackViewItem","actionHandler","identical","noPos","trackContextMenu","dompic","bg","viewPos","_item","UploadTrack","uploads","_upload","setState","inprogress","unreadError","uploadSemaphore","usage","uploadArea","UploadArea","uploadFile","removeTrack","updateSidebarItem","updateUsage","original","converted","UploadViewItem","noPrompt","ListIndexViewItem","newer","deleted","insertTrack","updateview","doneTracks","firstPos","apitrack","uploadCore","uploadReq","filename","respTrack","lengthComputable","progress","total","jsonBlob","finalBlob","BlockFormat","encodeBlock","responseText","domstate","newState","_lastUploadState","stopPropagation","encodeLen","viewState","m","index","listInfo","targetVisibility","removeList","showContextMenuForItem","domtag","tagText","ownerName","paddingTop","paddingBottom","ListIndex","loadedList","nextId","from","putUser","effectAllowed","showTracklist","setListids","getViewItem","section","newTracklist","firstHeader","secondHeader","zIndex","addListInfo","initialPlayingList","userInfo","setIndex","lists","listid","listinfo","curContent","getListInfo","getRealId","_toastLogin","User","siLogin","username","passwd","avatar","lastBaseUrl","_serverOptions","onApiReady","isApiReady","loggingin","pendingInfo","_ignore_track_once","isAdmin","serverOptions","sidebarLogin","playingTrackChanged","preLogin","preLoginTask","LoginSettingsDialog","splits","loginDialog","LoginDialog","MeDialog","closeUI","getBasicAuth","getBearerAuth","promise","isAutoLogin","handleLoginResult","tryRestorePlaying","listids","throwOnFail","fastLogin","tl","trackid","postPlaying","tmpTrack","trackLocation","newPasswd","tabLogin","tabCreate","inputUser","inputPasswd","inputPasswd2","viewStatus","socialLogins","isRegistering","dig","btnClicked","onServerconfig","serverConfig","allowRegistration","passwordLogin","socialLogin","precheckErr","register","btnLoginSettings","btnSwitch","btnLogout","btnChangeAvatar","domimg","logout","btnChangePassword","SocialLogins","changePassword","initAsync","statusView","links","SocialLoginItem","trackViewItems","trackCommentsEnabled","ext","fileSize","targetGroup","nonSameGroupItems","other","groupedItems","visi","trackViewItem","infoText","my","desktopApi","loopModeToIcon","order_random","ControlButton","PlayButton","_action","setAction","ProgressBar","refCurrentTime","refTotalTime","refBackground","refFill","loudnessMap","LoudnessMap","bindPlayer","player","updateLoudnessMap","louds","smoothWindow","scaleY","peakAvgs","smooth","tmp","low","scaleY2","offsetY2","fillStyle","fill","ProgressButton","textSpan","_progress","VolumeButton","updateTip","startVol","onChanging","tipView","delta","deltaX","buttons","transition","mapKeyAdjustment","ArrowUp","ArrowDown","ArrowRight","ArrowLeft","adj","percent","showing","usingKeyboardInput","parentRect","SimpleLyricsView","lyricsRef","currentLine","currentFadingout","toggleDesktopLyrics","updateLyrics","fadeoutCurrentLineView","raw","updateLine","timeForLine","timeForSpan","views.SidebarItem","mainContainer","MainContainer","sidebarToggle","contentOuter","bottomBar","BottomBar","trackImg","trackImgOuter","oncontextmenu","progressBar","btnPlay","btnPrev","btnNext","btnOrder","btnVolume","btnGroup","trackInfo","btnFullscreen","updatePrevNext","hasLyrics","modes","documentElement","requestFullscreen","group","domInfos","getElementById","domProgress","jsok","jsOk","p","siTheme","rounded","computedColor","_toggleColorSchemeWatcher","_watchingColorSchema","meta","enable","detectLanguage","updateAllViews","setLang","reload","_float","_hide","_hideMobile","_hideLarge","_btnShown","_isMobile","_panxHandler","_leftPadding","_movingPos","hide","btnShown","initPanHandler","toggleBtn","checkWidth","innerWidth","_getWidth","movingPos","numSoftLimit","high","factor","ratio","transform","TouchPanListener","onStart","lastDelta","onMove","onEnd","isMobile","mobile","toggleFloat","updateOverlay","showOverlay","offsetLeft","loginName","loginAvatar","featuresListview","removeCurrent","contentBg","bgView","imgView","videoView","curImg","toggleFullVideo","full","newView","backgroundImage","fadeoutCurrent","oldbg","windowTitle","appName","setFromTrack","siNotification","nowPlaying","lastNotif","browserSupport","checkPermission","Notification","permission","requestPermission","image","silent","addErrorListener","defaultPrevented","capture","menu","_listener","CommentsContentView","comments","editorNew","CommentEditor","onsubmit","editor","CommentsView","lazyView","createContentView","slient","endpoint","comment","eventName","eventRegistered","comm","CommentViewItem","uid","onremove","ioAction","onedit","domcontent","domsubmit","discussion","discussionEnabled","notes","notesEnabled","PlayingView","infoView","loadingOuter","flexDirection","justifyContent","viewToggle","normal","si","lyricsScale","loadedLyrics","_checkTrackVersion","editBtn","checkTrack","newLyrics","listenTogether","ListenTogether","createSession","joinSession","leaveSession","search","SearchView","checkPlaying","thisPlaying","tempList","query","currentQuery","performSearch","searchbar","SearchBar","getTempList","onSearch","updatePlaying","serviceWorkerClient","ServiceWorkerClient","serviceWorker","scope","infoProvider","channel","BroadcastChannel","postTrack","postLyrics","trackId","postTime","checkMode","webfx.startBlockingDetect","injectStyle","webfx.injectWebfxCss","timeEnd","waitInitialLoading","stateText","webfx.sleepAsync","waitPluginsLoading"],"mappings":"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"}