platypush/platypush/backend/http/dist/static/js/chunk-7c2209ed.46b43454.js.map

1 line
25 KiB
Plaintext

{"version":3,"sources":["webpack:///./node_modules/core-js/modules/es.string.repeat.js","webpack:///./node_modules/core-js/modules/es.object.entries.js","webpack:///./node_modules/core-js/internals/object-to-array.js","webpack:///./src/components/widgets/Music/Index.vue?1e56","webpack:///./node_modules/core-js/modules/es.array.join.js","webpack:///./src/components/widgets/Music/Index.vue","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./src/components/widgets/Music/Index.vue?d7d3"],"names":["$","repeat","target","proto","$entries","entries","stat","O","DESCRIPTORS","objectKeys","toIndexedObject","propertyIsEnumerable","f","createMethod","TO_ENTRIES","it","key","keys","length","i","result","call","push","module","exports","values","IndexedObject","arrayMethodIsStrict","nativeJoin","join","ES3_STRINGS","Object","STRICT_METHOD","forced","separator","this","undefined","class","loading","status","state","track","artist","title","style","time","elapsed","volume","random","single","consume","_arrayWithHoles","arr","Array","isArray","_iterableToArrayLimit","Symbol","iterator","_arr","_n","_d","_e","_s","_i","next","done","value","err","_nonIterableRest","TypeError","_slicedToArray","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","name","components","Loading","mixins","Utils","props","refreshSeconds","type","Number","required","default","data","timer","syncTime","timestamp","methods","refresh","request","_parseStatus","_parseTrack","stopTimer","startTimer","convertTime","parseFloat","t","h","parseInt","m","s","attr","ret","indexOf","showNewTrackNotification","notify","html","image","icon","onNewPlayingTrack","event","previousTrack","file","onMusicStop","onMusicPlay","onMusicPause","Date","onSeekChange","position","onVolumeChange","onRepeatChange","onRandomChange","onConsumeChange","onSingleChange","setInterval","timerFunc","clearInterval","getTime","mounted","toFixed","subscribe","render","__scopeId"],"mappings":"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","file":"static/js/chunk-7c2209ed.46b43454.js","sourcesContent":["var $ = require('../internals/export');\nvar repeat = require('../internals/string-repeat');\n\n// `String.prototype.repeat` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n$({ target: 'String', proto: true }, {\n repeat: repeat\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","export * from \"-!../../../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../../../node_modules/vue-loader-v16/dist/stylePostLoader.js!../../../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader-v16/dist/index.js??ref--0-1!./Index.vue?vue&type=style&index=0&id=5de2d5af&lang=scss&scoped=true\"","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","<template>\n <Loading v-if=\"loading\" />\n <div class=\"music\" v-else>\n <div class=\"track\">\n <div class=\"unknown\" v-if=\"!status\">[Unknown state]</div>\n <div class=\"no-track\" v-if=\"status && status.state === 'stop'\">No media is being played</div>\n <div class=\"artist\" v-if=\"status && status.state !== 'stop' && track && track.artist\" v-text=\"track.artist\"></div>\n <div class=\"title\" v-if=\"status && status.state !== 'stop' && track && track.title\" v-text=\"track.title\"></div>\n </div>\n\n <div class=\"time\" v-if=\"status && status.state === 'play'\">\n <div class=\"row\">\n <div class=\"progress-bar\">\n <div class=\"elapsed\" :style=\"{width: track.time ? 100*(status.elapsed/track.time) + '%' : '100%'}\"></div>\n <div class=\"total\"></div>\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"col-6 time-elapsed\" v-text=\"convertTime(status.elapsed)\"></div>\n <div class=\"col-6 time-total\" v-if=\"track.time\" v-text=\"convertTime(track.time)\"></div>\n </div>\n </div>\n\n <div class=\"playback-status\" v-if=\"status\">\n <div class=\"status-property col-4\">\n <i class=\"fa fa-volume-up\"></i>&nbsp; <span v-text=\"status.volume + '%'\"></span>\n </div>\n\n <div class=\"status-property col-2\">\n <i class=\"fas fa-random\" :class=\"{active: status.random}\"></i>\n </div>\n <div class=\"status-property col-2\">\n <i class=\"fas fa-redo\" :class=\"{active: status.repeat}\"></i>\n </div>\n <div class=\"status-property col-2\">\n <i class=\"fa fa-bullseye\" :class=\"{active: status.single}\"></i>\n </div>\n <div class=\"status-property col-2\">\n <i class=\"fa fa-utensils\" :class=\"{active: status.consume}\"></i>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\nimport Loading from \"@/components/Loading\";\n\nexport default {\n name: \"Music\",\n components: {Loading},\n mixins: [Utils],\n props: {\n // Refresh interval in seconds.\n refreshSeconds: {\n type: Number,\n required: false,\n default: 60,\n },\n },\n\n data() {\n return {\n track: undefined,\n status: undefined,\n timer: undefined,\n loading: false,\n\n syncTime: {\n timestamp: null,\n elapsed: null,\n },\n }\n },\n\n methods: {\n async refresh() {\n this.loading = true\n\n try {\n let status = await this.request('music.mpd.status')\n let track = await this.request('music.mpd.currentsong')\n\n this._parseStatus(status)\n this._parseTrack(track)\n\n if (status.state === 'play' && !this.timer)\n this.startTimer()\n else if (status.state !== 'play' && this.timer)\n this.stopTimer()\n } finally {\n this.loading = false\n }\n },\n\n convertTime(time) {\n time = parseFloat(time) // Normalize strings\n const t = {}\n t.h = parseInt(time/3600)\n t.m = parseInt(time/60 - t.h*60)\n t.s = parseInt(time - (t.h*3600 + t.m*60))\n\n for (const attr of ['m','s']) {\n t[attr] = '' + t[attr]\n }\n\n for (const attr of ['m','s']) {\n if (parseInt(t[attr]) < 10) {\n t[attr] = '0' + t[attr]\n }\n }\n\n const ret = []\n if (parseInt(t.h)) {\n ret.push(t.h)\n }\n\n ret.push(t.m, t.s)\n return ret.join(':')\n },\n\n async _parseStatus(status) {\n if (!status || status.length === 0)\n status = await this.request('music.mpd.status')\n\n if (!this.status)\n this.status = {}\n\n for (const [attr, value] of Object.entries(status)) {\n if (['consume','random','repeat','single','bitrate'].indexOf(attr) >= 0) {\n this.status[attr] = !!parseInt(value)\n } else if (['nextsong','nextsongid','playlist','playlistlength',\n 'volume','xfade','song','songid'].indexOf(attr) >= 0) {\n this.status[attr] = parseInt(value)\n } else if (['elapsed'].indexOf(attr) >= 0) {\n this.status[attr] = parseFloat(value)\n } else {\n this.status[attr] = value\n }\n }\n },\n\n async _parseTrack(track) {\n if (!track || track.length === 0) {\n track = await this.request('music.mpd.currentsong')\n }\n\n if (!this.track)\n this.track = {}\n\n for (const [attr, value] of Object.entries(track)) {\n if (['id','pos','time','track','disc'].indexOf(attr) >= 0) {\n this.track[attr] = parseInt(value)\n } else {\n this.track[attr] = value\n }\n }\n },\n\n showNewTrackNotification() {\n this.notify({\n html: '<b>' + (this.track.artist || '[No Artist]') + '</b><br>' +\n (this.track.title || '[No Title]'),\n image: {\n icon: 'play',\n }\n })\n },\n\n async onNewPlayingTrack(event) {\n let previousTrack = undefined\n\n if (this.track) {\n previousTrack = {\n file: this.track.file,\n artist: this.track.artist,\n title: this.track.title,\n }\n }\n\n this.status.state = 'play'\n this.status.elapsed = 0\n this.track = {}\n this._parseTrack(event.track)\n\n let status = event.status ? event.status : await this.request('music.mpd.status')\n this._parseStatus(status)\n this.startTimer()\n\n if (!previousTrack || (this.track.file !== previousTrack.file\n || this.track.artist !== previousTrack.artist\n || this.track.title !== previousTrack.title)) {\n this.showNewTrackNotification()\n }\n },\n\n onMusicStop(event) {\n this.status.state = 'stop'\n this.status.elapsed = 0\n this._parseStatus(event.status)\n this._parseTrack(event.track)\n this.stopTimer()\n },\n\n onMusicPlay(event) {\n this.status.state = 'play'\n this._parseStatus(event.status)\n this._parseTrack(event.track)\n this.startTimer()\n },\n\n onMusicPause(event) {\n this.status.state = 'pause'\n this._parseStatus(event.status)\n this._parseTrack(event.track)\n\n this.syncTime.timestamp = new Date()\n this.syncTime.elapsed = this.status.elapsed\n },\n\n onSeekChange(event) {\n if (event.position != null)\n this.status.elapsed = parseFloat(event.position)\n if (event.status)\n this._parseStatus(event.status)\n if (event.track)\n this._parseTrack(event.track)\n\n this.syncTime.timestamp = new Date()\n this.syncTime.elapsed = this.status.elapsed\n },\n\n onVolumeChange(event) {\n if (event.volume != null)\n this.status.volume = parseFloat(event.volume)\n if (event.status)\n this._parseStatus(event.status)\n if (event.track)\n this._parseTrack(event.track)\n },\n\n onRepeatChange(event) {\n this.status.repeat = event.state\n },\n\n onRandomChange(event) {\n this.status.random = event.state\n },\n\n onConsumeChange(event) {\n this.status.consume = event.state\n },\n\n onSingleChange(event) {\n this.status.single = event.state\n },\n\n startTimer() {\n if (this.timer != null) {\n this.stopTimer()\n }\n\n this.syncTime.timestamp = new Date()\n this.syncTime.elapsed = this.status.elapsed\n this.timer = setInterval(this.timerFunc, 1000)\n },\n\n stopTimer() {\n if (this.timer == null) {\n clearInterval(this.timer)\n this.timer = null\n }\n },\n\n timerFunc() {\n if (this.status.state !== 'play' || this.status.elapsed == null) {\n return\n }\n\n this.status.elapsed = this.syncTime.elapsed +\n ((new Date()).getTime()/1000) - (this.syncTime.timestamp.getTime()/1000)\n },\n },\n\n mounted() {\n this.refresh()\n if (this.refreshSeconds) {\n setInterval(this.refresh, parseInt((this.refreshSeconds*1000).toFixed(0)))\n }\n\n this.subscribe(this.onNewPlayingTrack, 'platypush.message.event.music.NewPlayingTrackEvent')\n this.subscribe(this.onMusicStop, 'platypush.message.event.music.MusicStopEvent')\n this.subscribe(this.onMusicPlay, 'platypush.message.event.music.MusicPlayEvent')\n this.subscribe(this.onMusicPause, 'platypush.message.event.music.MusicPauseEvent')\n this.subscribe(this.onSeekChange, 'platypush.message.event.music.SeekChangeEvent')\n this.subscribe(this.onVolumeChange, 'platypush.message.event.music.VolumeChangeEvent')\n this.subscribe(this.onRepeatChange, 'platypush.message.event.music.PlaybackRepeatModeChangeEvent')\n this.subscribe(this.onRandomChange, 'platypush.message.event.music.PlaybackRandomModeChangeEvent')\n this.subscribe(this.onConsumeChange, 'platypush.message.event.music.PlaybackConsumeModeChangeEvent')\n this.subscribe(this.onSingleChange, 'platypush.message.event.music.PlaybackSingleModeChangeEvent')\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n$progress-bar-bg: #ddd;\n$playback-status-color: #757f70;\n\n.music {\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n position: relative;\n\n .track {\n text-align: center;\n\n .unknown,\n .no-track {\n font-size: 2em;\n }\n\n .artist {\n font-size: 1.9em;\n font-weight: bold;\n margin-bottom: .25em;\n }\n\n .title {\n font-size: 1.8em;\n font-weight: normal;\n }\n }\n\n .time {\n width: 100%;\n margin-top: 1em;\n font-size: 1.2em;\n\n .row {\n padding: 0 .5em;\n }\n\n .time-total {\n text-align: right;\n }\n\n .progress-bar {\n width: 100%;\n height: 1em;\n position: relative;\n margin-bottom: .75em;\n\n .total {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n background: $progress-bar-bg;\n border-radius: 0.5em;\n }\n\n .elapsed {\n position: absolute;\n width: 100%;\n height: 100%;\n top: 0;\n background: $selected-bg;\n border-radius: 0.5em;\n z-index: 1;\n }\n }\n }\n\n .playback-status {\n position: absolute;\n bottom: 0;\n border-top: $default-border-2;\n color: $playback-status-color;\n width: 100%;\n height: 2em;\n\n .status-property {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n }\n\n .active {\n color: $default-hover-fg;\n }\n }\n}\n</style>\n","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithHoles from \"@babel/runtime/helpers/esm/arrayWithHoles\";\nimport iterableToArrayLimit from \"@babel/runtime/helpers/esm/iterableToArrayLimit\";\nimport unsupportedIterableToArray from \"@babel/runtime/helpers/esm/unsupportedIterableToArray\";\nimport nonIterableRest from \"@babel/runtime/helpers/esm/nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","import { render } from \"./Index.vue?vue&type=template&id=5de2d5af&scoped=true&bindings={\\\"refreshSeconds\\\":\\\"props\\\",\\\"track\\\":\\\"data\\\",\\\"status\\\":\\\"data\\\",\\\"timer\\\":\\\"data\\\",\\\"loading\\\":\\\"data\\\",\\\"syncTime\\\":\\\"data\\\",\\\"refresh\\\":\\\"options\\\",\\\"convertTime\\\":\\\"options\\\",\\\"_parseStatus\\\":\\\"options\\\",\\\"_parseTrack\\\":\\\"options\\\",\\\"showNewTrackNotification\\\":\\\"options\\\",\\\"onNewPlayingTrack\\\":\\\"options\\\",\\\"onMusicStop\\\":\\\"options\\\",\\\"onMusicPlay\\\":\\\"options\\\",\\\"onMusicPause\\\":\\\"options\\\",\\\"onSeekChange\\\":\\\"options\\\",\\\"onVolumeChange\\\":\\\"options\\\",\\\"onRepeatChange\\\":\\\"options\\\",\\\"onRandomChange\\\":\\\"options\\\",\\\"onConsumeChange\\\":\\\"options\\\",\\\"onSingleChange\\\":\\\"options\\\",\\\"startTimer\\\":\\\"options\\\",\\\"stopTimer\\\":\\\"options\\\",\\\"timerFunc\\\":\\\"options\\\"}\"\nimport script from \"./Index.vue?vue&type=script&lang=js\"\nexport * from \"./Index.vue?vue&type=script&lang=js\"\n\nimport \"./Index.vue?vue&type=style&index=0&id=5de2d5af&lang=scss&scoped=true\"\nscript.render = render\nscript.__scopeId = \"data-v-5de2d5af\"\n\nexport default script"],"sourceRoot":""}