platypush/platypush/backend/http/webapp/dist/static/js/4196.630e670c.js.map

1 line
96 KiB
Plaintext

{"version":3,"file":"static/js/4196.630e670c.js","mappings":"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","sources":["webpack://platypush/./src/components/panels/Media/Index.vue","webpack://platypush/./src/components/panels/Media/Header.vue","webpack://platypush/./src/components/panels/Media/Players.vue","webpack://platypush/./src/components/panels/Media/Players/Chromecast.vue","webpack://platypush/./src/components/panels/Media/Players/Mixin.vue","webpack://platypush/./src/components/panels/Media/Players/Mixin.vue?8a34","webpack://platypush/./src/components/panels/Media/Players/Chromecast.vue?c107","webpack://platypush/./src/components/panels/Media/Players/Kodi.vue","webpack://platypush/./src/components/panels/Media/Players/Kodi.vue?6dfd","webpack://platypush/./src/components/panels/Media/Players/Mplayer.vue","webpack://platypush/./src/components/panels/Media/Players/Mplayer.vue?eab0","webpack://platypush/./src/components/panels/Media/Players/Mpv.vue","webpack://platypush/./src/components/panels/Media/Players/Mpv.vue?06ab","webpack://platypush/./src/components/panels/Media/Players/Omxplayer.vue","webpack://platypush/./src/components/panels/Media/Players/Omxplayer.vue?69bd","webpack://platypush/./src/components/panels/Media/Players/Vlc.vue","webpack://platypush/./src/components/panels/Media/Players/Vlc.vue?4868","webpack://platypush/./src/components/panels/Media/Players.vue?c223","webpack://platypush/./src/components/panels/Media/Header.vue?b895","webpack://platypush/./src/components/panels/Media/Info.vue","webpack://platypush/./src/components/panels/Media/Info.vue?c19c","webpack://platypush/./src/components/panels/Media/Nav.vue","webpack://platypush/./src/components/panels/Media/Nav.vue?bae0","webpack://platypush/./src/components/panels/Media/Results.vue","webpack://platypush/./src/components/panels/Media/Results.vue?23d6","webpack://platypush/./src/components/panels/Media/Subtitles.vue","webpack://platypush/./src/components/panels/Media/Subtitles.vue?17fa","webpack://platypush/./src/components/File/Browser.vue","webpack://platypush/./src/components/File/Browser.vue?8abf","webpack://platypush/./src/components/panels/Media/Index.vue?1f2c","webpack://platypush/./src/components/panels/Torrent/View.vue","webpack://platypush/./src/components/panels/Torrent/View.vue?80df"],"sourcesContent":["<template>\n <keep-alive>\n <div class=\"media-plugin fade-in\">\n <Loading v-if=\"loading\" />\n\n <MediaView :plugin-name=\"pluginName\" :status=\"selectedPlayer?.status || {}\" :track=\"selectedPlayer?.status || {}\"\n :buttons=\"mediaButtons\" @play=\"pause\" @pause=\"pause\" @stop=\"stop\" @set-volume=\"setVolume\"\n @seek=\"seek\" @search=\"search\">\n <main>\n <div class=\"nav-container\">\n <Nav :selected-view=\"selectedView\" @input=\"selectedView = $event\" />\n </div>\n\n <div class=\"view-container\">\n <Header :plugin-name=\"pluginName\" :selected-view=\"selectedView\" :has-subtitles-plugin=\"hasSubtitlesPlugin\"\n ref=\"header\" :sources=\"sources\" :selected-item=\"selectedPlayer && selectedPlayer.status &&\n (selectedPlayer.status.state === 'play' || selectedPlayer.status.state === 'pause')\n ? selectedPlayer.status : results[selectedResult]\" :selected-subtitles=\"selectedSubtitles\"\n :browser-filter=\"browserFilter\" @search=\"search\" @select-player=\"selectedPlayer = $event\"\n @player-status=\"onStatusUpdate\" @torrent-add=\"downloadTorrent($event)\"\n @show-subtitles=\"showSubtitlesModal = !showSubtitlesModal\" @play-url=\"$refs.playUrlModal.show()\"\n @filter=\"browserFilter = $event\" @source-toggle=\"sources[$event] = !sources[$event]\" />\n\n <div class=\"body-container\" :class=\"{'expanded-header': $refs.header?.filterVisible}\">\n <Results :results=\"results\" :selected-result=\"selectedResult\" @select=\"onResultSelect($event)\"\n @play=\"play\" @info=\"$refs.mediaInfo.isVisible = true\" @view=\"view\" @download=\"download\"\n :sources=\"sources\" v-if=\"selectedView === 'search'\" />\n\n <TorrentView :plugin-name=\"torrentPlugin\" :is-media=\"true\" @play=\"play\"\n v-else-if=\"selectedView === 'torrents'\" />\n\n <Browser :plugin-name=\"torrentPlugin\" :is-media=\"true\" :filter=\"browserFilter\"\n @path-change=\"browserFilter = ''\" @play=\"play($event)\" v-else-if=\"selectedView === 'browser'\" />\n </div>\n </div>\n </main>\n </MediaView>\n\n <div class=\"media-info-container\">\n <Modal title=\"Media info\" ref=\"mediaInfo\">\n <Info :item=\"results[selectedResult]\" v-if=\"selectedResult != null\" />\n </Modal>\n </div>\n\n <div class=\"subtitles-container\">\n <Modal title=\"Available subtitles\" :visible=\"showSubtitlesModal\" ref=\"subtitlesSelector\"\n @close=\"showSubtitlesModal = false\">\n <div class=\"subtitles-content\" v-if=\"showSubtitlesModal && selectedResult != null\" >\n <Subtitles :item=\"selectedPlayer && selectedPlayer.status &&\n (selectedPlayer.status.state === 'play' || selectedPlayer.status.state === 'pause')\n ? selectedPlayer.status : results[selectedResult]\" @select-subs=\"selectSubtitles($event)\" />\n </div>\n </Modal>\n </div>\n\n <div class=\"play-url-container\">\n <Modal title=\"Play URL\" ref=\"playUrlModal\" @open=\"$refs.playUrlInput.focus()\">\n <form @submit.prevent=\"playUrl(urlPlay)\">\n <div class=\"row\">\n <label>\n Play URL (use <tt>file://</tt> prefix for local files)\n <input type=\"text\" v-model=\"urlPlay\" ref=\"playUrlInput\" autofocus />\n </label>\n </div>\n\n <div class=\"row footer\">\n <button type=\"submit\" :disabled=\"!urlPlay?.length\">Play</button>\n </div>\n </form>\n </Modal>\n </div>\n </div>\n </keep-alive>\n</template>\n\n<script>\nimport Loading from \"@/components/Loading\";\nimport Modal from \"@/components/Modal\";\nimport Utils from \"@/Utils\";\nimport MediaUtils from \"@/components/Media/Utils\";\nimport MediaView from \"@/components/Media/View\";\nimport Header from \"@/components/panels/Media/Header\";\nimport Info from \"@/components/panels/Media/Info\";\nimport Nav from \"@/components/panels/Media/Nav\";\nimport Results from \"@/components/panels/Media/Results\";\nimport Subtitles from \"@/components/panels/Media/Subtitles\";\nimport TorrentView from \"@/components/panels/Torrent/View\";\nimport Browser from \"@/components/File/Browser\";\n\nexport default {\n name: \"Media\",\n mixins: [Utils, MediaUtils],\n components: {Browser, Loading, MediaView, Header, Results, Modal, Info, Nav, TorrentView, Subtitles},\n props: {\n pluginName: {\n type: String,\n required: true,\n },\n\n mediaButtons: {\n type: Object,\n default: () => {\n return {\n previous: false,\n next: false,\n stop: true,\n }\n }\n }\n },\n\n data() {\n return {\n loading: false,\n results: [],\n selectedResult: null,\n selectedPlayer: null,\n selectedView: 'search',\n selectedSubtitles: null,\n showSubtitlesModal: false,\n awaitingPlayTorrent: null,\n urlPlay: null,\n browserFilter: null,\n torrentPlugin: null,\n torrentPlugins: [\n 'torrent',\n 'rtorrent',\n ],\n\n sources: {\n 'file': true,\n 'youtube': true,\n 'torrent': true,\n },\n }\n },\n\n computed: {\n hasSubtitlesPlugin() {\n return 'media.subtitles' in this.$root.config\n },\n },\n\n methods: {\n async search(event) {\n this.loading = true\n\n try {\n this.results = await this.request(`${this.pluginName}.search`, event)\n } finally {\n this.loading = false\n }\n },\n\n async play(item) {\n if (item?.type === 'torrent') {\n this.awaitingPlayTorrent = item.url\n await this.download(item)\n return\n }\n\n if (!this.selectedPlayer.component.supports(item))\n item = await this.startStreaming(item)\n\n await this.selectedPlayer.component.play(item, this.selectedSubtitles, this.selectedPlayer)\n await this.refresh()\n },\n\n async pause() {\n await this.selectedPlayer.component.pause(this.selectedPlayer)\n await this.refresh()\n },\n\n async stop() {\n await this.selectedPlayer.component.stop(this.selectedPlayer)\n await this.refresh()\n },\n\n async setVolume(volume) {\n await this.selectedPlayer.component.setVolume(volume, this.selectedPlayer)\n await this.refresh()\n },\n\n async seek(position) {\n await this.selectedPlayer.component.seek(position, this.selectedPlayer)\n await this.refresh()\n },\n\n async view(item) {\n const ret = await this.startStreaming(item, true)\n window.open(ret.url, '_blank')\n },\n\n async download(item) {\n if (item?.type === 'torrent') {\n await this.downloadTorrent(item)\n }\n },\n\n async refresh() {\n this.selectedPlayer.status = await this.selectedPlayer.component.status(this.selectedPlayer)\n },\n\n onStatusUpdate(status) {\n if (!this.selectedPlayer)\n return\n\n this.selectedPlayer.status = status\n },\n\n onTorrentQueued(event) {\n this.notify({\n title: 'Torrent queued for download',\n text: event.name,\n image: {\n iconClass: 'fa fa-magnet',\n }\n })\n },\n\n onTorrentMetadata(event) {\n this.notify({\n title: 'Torrent metadata downloaded',\n text: event.name,\n image: {\n iconClass: 'fa fa-info',\n }\n })\n },\n\n onTorrentDownloadStart(event) {\n this.notify({\n title: 'Torrent download started',\n text: event.name,\n image: {\n iconClass: 'fa fa-download',\n }\n })\n },\n\n onTorrentDownloadCompleted(event) {\n this.notify({\n title: 'Torrent download completed',\n text: event.name,\n image: {\n iconClass: 'fa fa-check',\n }\n })\n },\n\n getTorrentPlugin() {\n const pluginConf = this.$root.config[this.pluginName] || {}\n let torrentPlugin = pluginConf.torrent_plugin\n if (!torrentPlugin) {\n for (let plugin of this.torrentPlugins) {\n if (plugin in this.$root.config) {\n torrentPlugin = plugin\n break\n }\n }\n }\n\n return torrentPlugin\n },\n\n async downloadTorrent(item) {\n const torrentPlugin = this.getTorrentPlugin()\n if (!torrentPlugin) {\n this.notify({\n text: 'No torrent plugins configured',\n error: true,\n })\n\n return\n }\n\n return await this.request(`${torrentPlugin}.download`, {torrent: item?.url || item})\n },\n\n async selectSubtitles(item) {\n this.$refs.subtitlesSelector.close()\n if (!item) {\n this.selectedSubtitles = null\n return\n }\n\n this.notify({\n text: 'Downloading subtitles track',\n image: {\n iconClass: 'fa fa-download',\n }\n })\n\n const subs = await this.request('media.subtitles.download', {link: item.SubDownloadLink})\n this.selectedSubtitles = subs.filename\n\n this.notify({\n text: 'Subtitles track downloaded',\n image: {\n iconClass: 'fa fa-check',\n }\n })\n },\n\n onResultSelect(result) {\n if (this.selectedResult == null || this.selectedResult !== result) {\n this.selectedResult = result\n this.selectedSubtitles = null\n }\n },\n\n async playUrl(url) {\n this.loading = true\n\n try {\n await this.play({\n url: url,\n })\n\n this.$refs.playUrlModal.close()\n } finally {\n this.loading = false\n }\n },\n },\n\n mounted() {\n this.$watch(() => this.selectedPlayer, (player) => {\n if (player)\n this.refresh()\n })\n\n this.$watch(() => this.selectedSubtitles, (subs) => {\n if (new Set(['play', 'pause']).has(this.selectedPlayer?.status?.state)) {\n if (subs)\n this.selectedPlayer.component.addSubtitles(subs)\n else\n this.selectedPlayer.component.removeSubtitles()\n }\n })\n\n this.torrentPlugin = this.getTorrentPlugin()\n this.subscribe(this.onTorrentQueued,'notify-on-torrent-queued',\n 'platypush.message.event.torrent.TorrentQueuedEvent')\n this.subscribe(this.onTorrentMetadata,'on-torrent-metadata',\n 'platypush.message.event.torrent.TorrentDownloadedMetadataEvent')\n this.subscribe(this.onTorrentDownloadStart,'notify-on-torrent-download-start',\n 'platypush.message.event.torrent.TorrentDownloadStartEvent')\n this.subscribe(this.onTorrentDownloadCompleted,'notify-on-torrent-download-completed',\n 'platypush.message.event.torrent.TorrentDownloadCompletedEvent')\n\n if ('media.plex' in this.$root.config)\n this.sources.plex = true\n\n if ('media.jellyfin' in this.$root.config)\n this.sources.jellyfin = true\n },\n\n destroy() {\n this.unsubscribe('notify-on-torrent-queued')\n this.unsubscribe('on-torrent-metadata')\n this.unsubscribe('notify-on-torrent-download-start')\n this.unsubscribe('notify-on-torrent-download-completed')\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"vars\";\n@import \"~@/components/Media/vars\";\n\n.media-plugin {\n width: 100%;\n\n main {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row-reverse;\n\n .view-container {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n overflow: auto;\n background: $background-color;\n }\n\n .body-container {\n height: calc(100% - #{$media-header-height} - #{$media-ctrl-panel-height});\n padding-top: .1em;\n overflow: auto;\n\n &.expanded-header {\n height: calc(100% - #{$media-header-height} - #{$filter-header-height} - #{$media-ctrl-panel-height});\n }\n }\n }\n}\n\n::v-deep(.loading) {\n z-index: 10;\n}\n\n::v-deep(.media-info-container) {\n .modal-container {\n .content {\n max-width: 75%;\n }\n\n .body {\n padding: 1em .5em;\n overflow: auto;\n }\n }\n}\n\n::v-deep(.subtitles-container) {\n .body {\n padding: 0 !important;\n\n .item {\n padding: 1em;\n }\n }\n}\n\n::v-deep(.play-url-container) {\n .body {\n padding: 1em !important;\n }\n\n form {\n padding: 0;\n margin: 0;\n border: none;\n border-radius: 0;\n box-shadow: none;\n }\n\n input[type=text] {\n width: 100%;\n }\n\n [type=submit] {\n background: initial;\n border-color: initial;\n border-radius: 1.5em;\n\n &:hover {\n color: $default-hover-fg-2;\n }\n }\n\n .footer {\n display: flex;\n justify-content: right;\n padding: 0;\n }\n}\n</style>\n","<template>\n <div class=\"header\" :class=\"{'with-filter': filterVisible}\">\n <div class=\"row\">\n <div class=\"col-7 left side\" v-if=\"selectedView === 'search'\">\n <button title=\"Filter\" class=\"filter-btn\" :class=\"{selected: filterVisible}\"\n @click=\"filterVisible = !filterVisible\">\n <i class=\"fa fa-filter\" />\n </button>\n\n <form @submit.prevent=\"search\">\n <label class=\"search-box\">\n <input type=\"search\" placeholder=\"Search\" v-model=\"query\">\n </label>\n </form>\n </div>\n\n <div class=\"col-7 left side\" v-else-if=\"selectedView === 'torrents'\">\n <form @submit.prevent=\"$emit('torrent-add', torrentURL)\">\n <label class=\"search-box\">\n <input type=\"search\" placeholder=\"Add torrent URL\" v-model=\"torrentURL\">\n </label>\n </form>\n </div>\n\n <div class=\"col-7 left side\" v-else-if=\"selectedView === 'browser'\">\n <label class=\"search-box\">\n <input type=\"search\" placeholder=\"Filter\" :value=\"browserFilter\" @change=\"$emit('filter', $event.target.value)\"\n @keyup=\"$emit('filter', $event.target.value)\">\n </label>\n </div>\n\n <div class=\"col-5 right side\">\n <button title=\"Select subtitles\" class=\"captions-btn\" :class=\"{selected: selectedSubtitles != null}\"\n @click=\"$emit('show-subtitles')\" v-if=\"hasSubtitlesPlugin && selectedItem &&\n (selectedItem.type === 'file' || (selectedItem.url || '').startsWith('file://'))\">\n <i class=\"fas fa-closed-captioning\" />\n </button>\n\n <Players :plugin-name=\"pluginName\" @select=\"$emit('select-player', $event)\"\n @status=\"$emit('player-status', $event)\" />\n\n <button title=\"Play URL\" @click=\"$emit('play-url')\">\n <i class=\"fa fa-plus-circle\" />\n </button>\n </div>\n </div>\n\n <div class=\"row filter fade-in\" :class=\"{hidden: !filterVisible}\">\n <label v-for=\"source in Object.keys(sources)\" :key=\"source\">\n <input type=\"checkbox\" :checked=\"sources[source]\" @change=\"$emit('source-toggle', source)\" />\n {{ source }}\n </label>\n </div>\n </div>\n</template>\n\n<script>\nimport Players from \"@/components/panels/Media/Players\";\nexport default {\n name: \"Header\",\n components: {Players},\n emits: ['search', 'select-player', 'player-status', 'torrent-add', 'show-subtitles', 'play-url', 'filter',\n 'source-toggle'],\n\n props: {\n pluginName: {\n type: String,\n required: true,\n },\n\n selectedView: {\n type: String,\n required: true,\n },\n\n selectedSubtitles: {\n type: String,\n },\n\n selectedItem: {\n type: Object,\n },\n\n hasSubtitlesPlugin: {\n type: Boolean,\n default: false,\n },\n\n browserFilter: {\n type: String,\n default: '',\n },\n\n sources: {\n type: Object,\n default: () => {},\n }\n },\n\n data() {\n return {\n filterVisible: false,\n query: '',\n torrentURL: '',\n }\n },\n\n methods: {\n search() {\n const types = Object.keys(this.sources).filter((source) => this.sources[source])\n if (!this.query?.length || !types?.length)\n return\n\n this.$emit('search', {\n query: this.query,\n types: types,\n })\n },\n },\n\n mounted() {\n this.$watch(() => this.selectedView, () => {\n this.$emit('filter', '')\n this.torrentURL = ''\n this.query = ''\n })\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"vars\";\n\n.header {\n width: 100%;\n height: $media-header-height;\n position: relative;\n background: $menu-panel-bg;\n padding: .5em;\n box-shadow: $border-shadow-bottom;\n\n .filter-btn.selected {\n color: $selected-fg;\n }\n\n .row {\n display: flex;\n align-items: center;\n }\n\n &.with-filter {\n height: calc(#{$media-header-height} + #{$filter-header-height});\n padding-bottom: 0;\n }\n\n .side {\n display: inline-flex;\n align-items: center;\n\n &.right {\n justify-content: right;\n direction: rtl;\n }\n }\n\n ::v-deep(button) {\n background: none;\n padding: 0 .25em;\n border: 0;\n margin-right: .25em;\n\n &:hover {\n color: $default-hover-fg-2;\n }\n }\n\n form {\n width: 100%;\n padding: 0;\n border: 0;\n border-radius: 0;\n box-shadow: none;\n background: initial;\n }\n\n .search-box {\n width: 100%;\n margin-left: .5em;\n\n input[type=search] {\n width: 100%;\n }\n }\n\n .filter {\n width: 100%;\n height: $filter-header-height;\n margin-top: .5em;\n\n label {\n display: inline-flex;\n flex-direction: row;\n margin-right: 1em;\n\n input {\n margin-right: .5em;\n }\n }\n }\n\n .captions-btn {\n margin-right: .5em;\n\n &.selected {\n color: $selected-fg;\n }\n }\n}\n</style>\n","<template>\n <div class=\"plugins\">\n <Chromecast :player=\"selectedPlayer?.pluginName === 'media.chromecast' ? selectedPlayer : null\"\n ref=\"chromecastPlugin\" @status=\"$emit('status', $event)\" />\n <Kodi :player=\"selectedPlayer?.pluginName === 'media.kodi' ? selectedPlayer : null\" ref=\"kodiPlugin\"\n @status=\"$emit('status', $event)\" />\n <Mplayer :player=\"selectedPlayer?.pluginName === 'media.mplayer' ? selectedPlayer : null\" ref=\"mplayerPlugin\"\n @status=\"$emit('status', $event)\" />\n <Mpv :player=\"selectedPlayer?.pluginName === 'media.mpv' ? selectedPlayer : null\" ref=\"mpvPlugin\"\n @status=\"$emit('status', $event)\" />\n <Omxplayer :player=\"selectedPlayer?.pluginName === 'media.omxplayer' ? selectedPlayer : null\" ref=\"omxplayerPlugin\"\n @status=\"$emit('status', $event)\" />\n <Vlc :player=\"selectedPlayer?.pluginName === 'media.vlc' ? selectedPlayer : null\" ref=\"vlcPlugin\"\n @status=\"$emit('status', $event)\" />\n </div>\n\n <div class=\"players\">\n <Dropdown :title=\"selectedPlayer?.name || 'Players'\"\n :icon-class=\"selectedPlayer ? selectedPlayer.iconClass : 'fab fa-chromecast'\">\n <Loading v-if=\"loading\" />\n\n <div class=\"refresh\">\n <DropdownItem text=\"Refresh\" icon-class=\"fa fa-sync-alt\" @click=\"refresh\" />\n </div>\n\n <div class=\"no-results\" v-if=\"!players?.length\">No players found</div>\n\n <div class=\"player\" v-for=\"(player, i) in players\" :key=\"i\"\n :class=\"{selected: selectedPlayer != null && selectedPlayer.pluginName === player.pluginName\n && selectedPlayer.name === player.name}\">\n <DropdownItem :text=\"player.name\" :icon-class=\"player.iconClass\" @click=\"select(player)\" />\n </div>\n </Dropdown>\n </div>\n</template>\n\n<script>\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\nimport Loading from \"@/components/Loading\";\n\nimport Chromecast from \"@/components/panels/Media/Players/Chromecast\"\nimport Kodi from \"@/components/panels/Media/Players/Kodi\";\nimport Mplayer from \"@/components/panels/Media/Players/Mplayer\";\nimport Mpv from \"@/components/panels/Media/Players/Mpv\";\nimport Omxplayer from \"@/components/panels/Media/Players/Omxplayer\";\nimport Vlc from \"@/components/panels/Media/Players/Vlc\";\n\nexport default {\n name: \"Players\",\n components: {Loading, DropdownItem, Dropdown, Chromecast, Kodi, Mplayer, Mpv, Omxplayer, Vlc},\n emits: ['select', 'status'],\n\n props: {\n pluginName: {\n type: String,\n required: true,\n },\n },\n\n data() {\n return {\n loading: false,\n players: [],\n selectedPlayer: null,\n config: {},\n plugins: [],\n }\n },\n\n methods: {\n loadPlugins() {\n this.plugins = Object.entries(this.$refs).filter((p) => p[0].endsWith('Plugin')).map((p) => p[1])\n },\n\n async refresh() {\n this.players = []\n this.loading = true\n const config = this.$root.config\n\n try {\n await Promise.all(this.plugins.map(async (plugin) => {\n if (!(plugin.pluginName in config))\n return\n\n const players = await plugin.getPlayers()\n this.players.push(...players)\n\n if (this.selectedPlayer == null && plugin.pluginName === this.pluginName && players.length > 0) {\n this.select(players[0])\n }\n }))\n } finally {\n this.loading = false\n }\n },\n\n select(player) {\n this.selectedPlayer = player\n this.$emit('select', player)\n },\n },\n\n async mounted() {\n await this.loadPlugins()\n await this.refresh()\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.plugins {\n display: none;\n}\n\n.no-results {\n padding: 1em;\n}\n\n.players {\n ::v-deep(.dropdown) {\n direction: ltr;\n .item {\n padding: .5em;\n }\n\n .icon {\n margin-right: 1em !important;\n }\n }\n\n ::v-deep(.refresh) {\n font-weight: bold;\n font-size: .8em;\n opacity: .7;\n }\n\n ::v-deep(.player.selected) {\n color: $selected-fg;\n }\n}\n</style>\n","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Chromecast\",\n mixins: [Mixin],\n data() {\n return {\n name: 'Chromecast',\n pluginName: 'media.chromecast',\n iconClass: 'fab fa-chromecast',\n }\n },\n\n methods: {\n async getPlayers() {\n const devices = await this.request(`${this.pluginName}.get_chromecasts`)\n return Promise.all(devices.map(async (device) => {\n return {\n ...device,\n iconClass: device.type === 'audio' ? 'fa fa-volume-up' : 'fab fa-chromecast',\n pluginName: this.pluginName,\n status: this.request(`${this.pluginName}.status`, {chromecast: device.name}),\n component: this,\n }\n }))\n },\n\n getPlayerName(player) {\n if (typeof player === 'string')\n return player\n\n if (!player)\n return this.player?.name\n\n return player?.name\n },\n\n async status(player) {\n return await this.request(`${this.pluginName}.status`, {chromecast: this.getPlayerName(player)})\n },\n\n async play(resource, player) {\n if (!resource) {\n return await this.pause(player)\n }\n\n return await this.request(`${this.pluginName}.play`, {resource: resource.url, chromecast: this.getPlayerName(player)})\n },\n\n async pause(player) {\n return await this.request(`${this.pluginName}.pause`, {chromecast: this.getPlayerName(player)})\n },\n\n async stop(player) {\n return await this.request(`${this.pluginName}.quit`, {chromecast: this.getPlayerName(player)})\n },\n\n async setVolume(volume, player) {\n return await this.request(`${this.pluginName}.set_volume`, {volume: volume, chromecast: this.getPlayerName(player)})\n },\n\n async seek(position, player) {\n return await this.request(`${this.pluginName}.seek`, {position: position, chromecast: this.getPlayerName(player)})\n },\n\n async onMediaEvent(event) {\n if (event.plugin !== this.pluginName)\n return false\n\n this.$emit('status', await this.status(event.player))\n return true\n },\n\n supports(resource) {\n return resource?.type === 'youtube' ||\n (resource.url || resource).startsWith('http://') || (resource.url || resource).startsWith('https://')\n },\n },\n}\n</script>\n","<script>\nimport Utils from \"@/Utils\";\nimport MediaUtils from \"@/components/Media/Utils\";\n\nexport default {\n name: \"Mixin\",\n mixins: [Utils, MediaUtils],\n emits: ['status'],\n\n props: {\n player: {\n type: Object,\n },\n },\n\n data() {\n return {\n iconClass: null,\n name: null,\n pluginName: null,\n }\n },\n\n methods: {\n async getPlayers() {\n return [{\n iconClass: this.iconClass,\n name: this.name,\n pluginName: this.pluginName,\n component: this,\n status: await this.status(),\n }]\n },\n\n async status() {\n return await this.request(`${this.pluginName}.status`)\n },\n\n async play(resource, subs) {\n if (!resource) {\n return await this.pause()\n }\n\n return await this.request(`${this.pluginName}.play`, {resource: resource.url, subtitles: subs})\n },\n\n async pause() {\n return await this.request(`${this.pluginName}.pause`)\n },\n\n async stop() {\n return await this.request(`${this.pluginName}.stop`)\n },\n\n async setVolume(volume) {\n return await this.request(`${this.pluginName}.set_volume`, {volume: volume})\n },\n\n async seek(position) {\n return await this.request(`${this.pluginName}.seek`, {position: position})\n },\n\n async onNewMedia(event) {\n const isMine = await this.onMediaEvent(event)\n\n if (isMine && event.title) {\n this.notify({\n title: event.player || event.device || this.player?.name || this.name || this.pluginName,\n text: event.title,\n image: {\n iconClass: this.iconClass || 'fa fa-play',\n }\n })\n }\n },\n\n async onMediaEvent(event) {\n if (event.plugin !== this.pluginName)\n return false\n\n this.$emit('status', await this.status())\n return true\n },\n\n async addSubtitles(subs) {\n await this.request(`${this.pluginName}.add_subtitles`, {filename: subs})\n await this.request(`${this.pluginName}.toggle_subtitles`, {visible: true})\n },\n\n async removeSubtitles() {\n await this.request(`${this.pluginName}.toggle_subtitles`, {visible: false})\n },\n\n supports(resource) {\n return resource?.type === 'file' || resource?.type === 'youtube' ||\n (resource.url || resource).startsWith('file://') || (resource.url || resource).startsWith('http://') ||\n (resource.url || resource).startsWith('https://')\n },\n },\n\n mounted() {\n this.subscribe(this.onNewMedia, `on-new-media-${this.pluginName}`,\n 'platypush.message.event.media.NewPlayingMediaEvent')\n\n this.subscribe(this.onMediaEvent, `on-media-event-${this.pluginName}`,\n 'platypush.message.event.media.MediaPlayEvent',\n 'platypush.message.event.media.MediaStopEvent',\n 'platypush.message.event.media.MediaPauseEvent',\n 'platypush.message.event.media.MediaSeekEvent',\n 'platypush.message.event.media.MediaVolumeChangedEvent',\n 'platypush.message.event.media.MediaMuteChangedEvent')\n },\n\n destroy() {\n this.unsubscribe(`on-media-event-${this.pluginName}`)\n },\n}\n</script>\n","import script from \"./Mixin.vue?vue&type=script&lang=js\"\nexport * from \"./Mixin.vue?vue&type=script&lang=js\"\n\nconst __exports__ = script;\n\nexport default __exports__","import { render } from \"./Chromecast.vue?vue&type=template&id=55476f3a\"\nimport script from \"./Chromecast.vue?vue&type=script&lang=js\"\nexport * from \"./Chromecast.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Kodi\",\n mixins: [Mixin],\n data() {\n return {\n iconClass: 'fa fa-kodi',\n name: 'Kodi',\n pluginName: 'media.kodi',\n }\n },\n\n methods: {\n async getPlayers() {\n return [{\n iconClass: this.iconClass,\n pluginName: this.pluginName,\n name: this.$root.config['media.kodi']?.host || this.name,\n component: this,\n status: await this.request(`${this.pluginName}.status`)\n }]\n },\n\n supports(resource) {\n return resource?.type === 'youtube' || (resource.url || resource).startsWith('http://') ||\n (resource.url || resource).startsWith('https://')\n },\n },\n}\n</script>\n","import { render } from \"./Kodi.vue?vue&type=template&id=25a1a1cf\"\nimport script from \"./Kodi.vue?vue&type=script&lang=js\"\nexport * from \"./Kodi.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Mplayer\",\n mixins: [Mixin],\n data() {\n return {\n iconClass: 'fa fa-tv',\n name: 'MPlayer',\n pluginName: 'media.mplayer',\n }\n },\n}\n</script>\n","import { render } from \"./Mplayer.vue?vue&type=template&id=0caf2d73\"\nimport script from \"./Mplayer.vue?vue&type=script&lang=js\"\nexport * from \"./Mplayer.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Mpv\",\n mixins: [Mixin],\n data() {\n return {\n iconClass: 'fa fa-tv',\n name: 'mpv',\n pluginName: 'media.mpv',\n }\n },\n}\n</script>\n","import { render } from \"./Mpv.vue?vue&type=template&id=3b3bb533\"\nimport script from \"./Mpv.vue?vue&type=script&lang=js\"\nexport * from \"./Mpv.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Omxplayer\",\n mixins: [Mixin],\n data() {\n return {\n iconClass: 'fa fa-tv',\n name: 'OMXPlayer',\n pluginName: 'media.omxplayer',\n }\n },\n}\n</script>\n","import { render } from \"./Omxplayer.vue?vue&type=template&id=0f086473\"\nimport script from \"./Omxplayer.vue?vue&type=script&lang=js\"\nexport * from \"./Omxplayer.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","<template>\n <div />\n</template>\n\n<script>\nimport Mixin from \"@/components/panels/Media/Players/Mixin\";\n\nexport default {\n name: \"Vlc\",\n mixins: [Mixin],\n data() {\n return {\n iconClass: 'fa fa-tv',\n name: 'VLC',\n pluginName: 'media.vlc',\n }\n },\n}\n</script>\n","import { render } from \"./Vlc.vue?vue&type=template&id=5b5bcdd3\"\nimport script from \"./Vlc.vue?vue&type=script&lang=js\"\nexport * from \"./Vlc.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Players.vue?vue&type=template&id=27e87a29&scoped=true\"\nimport script from \"./Players.vue?vue&type=script&lang=js\"\nexport * from \"./Players.vue?vue&type=script&lang=js\"\n\nimport \"./Players.vue?vue&type=style&index=0&id=27e87a29&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-27e87a29\"]])\n\nexport default __exports__","import { render } from \"./Header.vue?vue&type=template&id=37a493ac&scoped=true\"\nimport script from \"./Header.vue?vue&type=script&lang=js\"\nexport * from \"./Header.vue?vue&type=script&lang=js\"\n\nimport \"./Header.vue?vue&type=style&index=0&id=37a493ac&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-37a493ac\"]])\n\nexport default __exports__","<template>\n <div class=\"row\" v-if=\"item?.title\">\n <div class=\"left side\">Title</div>\n <div class=\"right side\">\n <a :href=\"`https://www.imdb.com/title/${item.imdb_id}`\" target=\"_blank\" v-if=\"item.imdb_id\"\n v-text=\"item.title\" />\n <span v-else v-text=\"item.title\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"item?.series\">\n <div class=\"left side\">TV Series</div>\n <div class=\"right side\" v-text=\"item.series\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.season\">\n <div class=\"left side\">Season</div>\n <div class=\"right side\" v-text=\"item.season\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.episode\">\n <div class=\"left side\">Episode</div>\n <div class=\"right side\" v-text=\"item.episode\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.num_seasons\">\n <div class=\"left side\">Number of seasons</div>\n <div class=\"right side\" v-text=\"item.num_seasons\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.synopsis\">\n <div class=\"left side\">Synopsis</div>\n <div class=\"right side\" v-text=\"item.synopsis\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.description\">\n <div class=\"left side\">Description</div>\n <div class=\"right side\" v-text=\"item.description\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.summary\">\n <div class=\"left side\">Summary</div>\n <div class=\"right side\" v-text=\"item.summary\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.overview\">\n <div class=\"left side\">Overview</div>\n <div class=\"right side\" v-text=\"item.overview\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.duration\">\n <div class=\"left side\">Duration</div>\n <div class=\"right side\" v-text=\"convertTime(item.duration)\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.country\">\n <div class=\"left side\">Country</div>\n <div class=\"right side\" v-text=\"item.country\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.network\">\n <div class=\"left side\">Network</div>\n <div class=\"right side\" v-text=\"item.network\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.status\">\n <div class=\"left side\">Status</div>\n <div class=\"right side\" v-text=\"item.status\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.rating\">\n <div class=\"left side\">Rating</div>\n <div class=\"right side\" v-text=\"item.rating.percentage\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.rating\">\n <div class=\"left side\">Votes</div>\n <div class=\"right side\" v-text=\"item.rating.votes\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.genres\">\n <div class=\"left side\">Genres</div>\n <div class=\"right side\" v-text=\"item.genres.join(', ')\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.channelId\">\n <div class=\"left side\">Channel</div>\n <div class=\"right side\">\n <a :href=\"`https://www.youtube.com/channel/${item.channelId}`\" target=\"_blank\"\n v-text=\"item.channelTitle || `https://www.youtube.com/channel/${item.channelId}`\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"item?.year\">\n <div class=\"left side\">Year</div>\n <div class=\"right side\" v-text=\"item.year\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.publishedAt\">\n <div class=\"left side\">Published at</div>\n <div class=\"right side\" v-text=\"formatDate(item.publishedAt, true)\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.file\">\n <div class=\"left side\">File</div>\n <div class=\"right side\" v-text=\"item.file\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.url\">\n <div class=\"left side\">URL</div>\n <div class=\"right side url\">\n <a :href=\"item.url\" target=\"_blank\" v-text=\"item.url\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"item?.trailer\">\n <div class=\"left side\">Trailer</div>\n <div class=\"right side url\">\n <a :href=\"item.trailer\" target=\"_blank\" v-text=\"item.trailer\" />\n </div>\n </div>\n\n <div class=\"row\" v-if=\"item?.size\">\n <div class=\"left side\">Size</div>\n <div class=\"right side\" v-text=\"convertSize(item.size)\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.quality\">\n <div class=\"left side\">Quality</div>\n <div class=\"right side\" v-text=\"item.quality\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.seeds\">\n <div class=\"left side\">Seeds</div>\n <div class=\"right side\" v-text=\"item.seeds\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.peers\">\n <div class=\"left side\">Peers</div>\n <div class=\"right side\" v-text=\"item.peers\" />\n </div>\n\n <div class=\"row\" v-if=\"item?.language\">\n <div class=\"left side\">Language</div>\n <div class=\"right side\" v-text=\"item.language\" />\n </div>\n</template>\n\n<script>\nimport Utils from \"@/Utils\";\nimport MediaUtils from \"@/components/Media/Utils\";\n\nexport default {\n name: \"Info\",\n mixins: [Utils, MediaUtils],\n props: {\n item: {\n type: Object,\n default: () => {},\n }\n }\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.row {\n display: flex;\n min-height: 3em;\n padding: .5em 1em;\n\n @include until ($tablet) {\n flex-direction: column;\n }\n\n @include from ($tablet) {\n align-items: center;\n }\n\n &:not(:last-child) {\n border-bottom: $default-border-2;\n }\n\n &:hover {\n background: $hover-bg;\n border-radius: .5em;\n }\n\n .side {\n align-items: center;\n display: inline-flex;\n\n &.url {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n @include until ($tablet) {\n display: flex;\n\n &.left {\n font-weight: bold;\n }\n\n &.right {\n justify-content: left;\n }\n }\n\n @include from ($tablet) {\n display: inline-flex;\n\n &.left {\n width: 22%;\n margin-right: 3%;\n }\n\n &.right {\n width: 75%;\n justify-content: right;\n }\n }\n }\n}\n</style>\n","import { render } from \"./Info.vue?vue&type=template&id=28611e6c&scoped=true\"\nimport script from \"./Info.vue?vue&type=script&lang=js\"\nexport * from \"./Info.vue?vue&type=script&lang=js\"\n\nimport \"./Info.vue?vue&type=style&index=0&id=28611e6c&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-28611e6c\"]])\n\nexport default __exports__","<template>\n <nav>\n <li v-for=\"(view, name) in views\" :key=\"name\" :title=\"view.displayName\"\n :class=\"{selected: name === selectedView}\" @click=\"$emit('input', name)\">\n <i :class=\"view.iconClass\" />\n </li>\n </nav>\n</template>\n\n<script>\nexport default {\n name: \"Nav\",\n emits: ['input'],\n props: {\n selectedView: {\n type: String,\n },\n\n collapsed: {\n type: Boolean,\n default: false,\n },\n\n views: {\n type: Object,\n default: () => {\n return {\n search: {\n iconClass: 'fa fa-search',\n displayName: 'Search',\n },\n\n browser: {\n iconClass: 'fa fa-folder',\n displayName: 'Browser',\n },\n\n torrents: {\n iconClass: 'fa fa-magnet',\n displayName: 'Torrents',\n },\n }\n }\n },\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import 'vars.scss';\n\nnav {\n width: $media-nav-width;\n height: 100%;\n background: $nav-collapsed-bg;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n box-shadow: 2.5px 0 4.5px 2px $nav-collapsed-fg;\n margin-left: 2.5px;\n overflow: hidden;\n\n li {\n display: flex;\n align-items: center;\n font-size: 1.2em;\n cursor: pointer;\n list-style: none;\n padding: .6em;\n opacity: 0.7;\n\n &.selected,\n &:hover {\n border-radius: 1.2em;\n margin: 0 0.2em;\n }\n\n &:hover {\n background: $nav-entry-collapsed-hover-bg;\n }\n\n &.selected {\n background: $nav-entry-collapsed-selected-bg;\n }\n\n }\n}\n</style>\n","import { render } from \"./Nav.vue?vue&type=template&id=4597e14d&scoped=true\"\nimport script from \"./Nav.vue?vue&type=script&lang=js\"\nexport * from \"./Nav.vue?vue&type=script&lang=js\"\n\nimport \"./Nav.vue?vue&type=style&index=0&id=4597e14d&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4597e14d\"]])\n\nexport default __exports__","<template>\n <div class=\"media-results\">\n <div class=\"no-content\" v-if=\"!results?.length\">\n No search results\n </div>\n\n <div class=\"row item\" :class=\"{selected: selectedResult === i, hidden: !sources[result.type]}\"\n v-for=\"(result, i) in results\" :key=\"i\" @click=\"$emit('select', i)\">\n <div class=\"col-10 left side\">\n <div class=\"icon\">\n <i :class=\"typeIcons[result.type]\" />\n </div>\n <div class=\"title\" v-text=\"result.title\" />\n </div>\n\n <div class=\"col-2 right side\">\n <Dropdown title=\"Actions\" icon-class=\"fa fa-ellipsis-h\" @click=\"$emit('select', i)\">\n <DropdownItem icon-class=\"fa fa-play\" text=\"Play\" @click=\"$emit('play', result)\"\n v-if=\"result?.type !== 'torrent'\" />\n <DropdownItem icon-class=\"fa fa-download\" text=\"Download\" @click=\"$emit('download', result)\"\n v-if=\"result?.type === 'torrent'\" />\n <DropdownItem icon-class=\"fa fa-window-maximize\" text=\"View in browser\" @click=\"$emit('view', result)\"\n v-if=\"result?.type === 'file'\" />\n <DropdownItem icon-class=\"fa fa-info\" text=\"Info\" @click=\"$emit('info', result)\" />\n </Dropdown>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\n\nexport default {\n name: \"Results\",\n components: {Dropdown, DropdownItem},\n emits: ['select', 'info', 'play', 'view', 'download'],\n props: {\n results: {\n type: Array,\n default: () => [],\n },\n\n selectedResult: {\n type: Number,\n },\n\n sources: {\n type: Object,\n default: () => {},\n },\n },\n\n data() {\n return {\n typeIcons: {\n 'file': 'fa fa-hdd',\n 'torrent': 'fa fa-magnet',\n 'youtube': 'fab fa-youtube',\n 'plex': 'fa fa-plex',\n 'jellyfin': 'fa fa-jellyfin',\n },\n }\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n\n.media-results {\n width: 100%;\n height: 100%;\n background: $background-color;\n overflow: auto;\n\n .item {\n display: flex;\n align-items: center;\n\n &.selected {\n background: $selected-bg;\n }\n\n .side {\n display: inline-flex;\n align-items: center;\n\n &.right {\n justify-content: flex-end;\n margin-right: .5em;\n }\n\n ::v-deep(.dropdown-container) {\n .item {\n box-shadow: none;\n }\n\n button {\n border: 0;\n padding: 0;\n background: none;\n opacity: .7;\n\n &:hover {\n color: $default-hover-fg-2;\n }\n }\n }\n }\n }\n\n .no-content {\n height: 100%;\n }\n\n .icon {\n .fa-youtube {\n color: #d21;\n }\n }\n}\n</style>\n","import { render } from \"./Results.vue?vue&type=template&id=28f7c518&scoped=true\"\nimport script from \"./Results.vue?vue&type=script&lang=js\"\nexport * from \"./Results.vue?vue&type=script&lang=js\"\n\nimport \"./Results.vue?vue&type=style&index=0&id=28f7c518&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-28f7c518\"]])\n\nexport default __exports__","<template>\n <div class=\"subtitles-container\">\n <div class=\"items\">\n <Loading v-if=\"loading\" />\n <div class=\"row item\" :class=\"{selected: selectedItem == null}\" @click=\"selectedItem = null\">\n <div class=\"col-1 icon\">\n <i class=\"fa fa-ban\" />\n </div>\n\n <div class=\"col-11 title\">None</div>\n </div>\n\n <div class=\"row item\" :class=\"{selected: selectedItem === i}\" v-for=\"(sub, i) in items\" :key=\"i\"\n @click=\"selectedItem = i\">\n <div class=\"col-1 icon\">\n <i class=\"fa fa-file\" v-if=\"sub.IsLocal\" />\n <i class=\"flag-icon\" :class=\"`flag-icon-${sub.ISO639}`\" v-else-if=\"sub.ISO639\" />\n <i class=\"fa fa-closed-captioning\" v-else />\n </div>\n {{ sub.SubFileName }}\n </div>\n </div>\n\n <div class=\"footer\">\n <button @click=\"$emit('select-subs', selectedItem == null ? null : items[selectedItem])\">Select</button>\n </div>\n </div>\n</template>\n\n<script>\nimport Loading from \"@/components/Loading\"\nimport Utils from \"@/Utils\";\n\nexport default {\n name: \"Subtitles\",\n mixins: [Utils],\n components: {Loading},\n emits: ['select-subs'],\n props: {\n item: {\n type: Object,\n default: () => {},\n },\n },\n\n data() {\n return {\n loading: false,\n items: [],\n selectedItem: null,\n }\n },\n\n methods: {\n async refresh() {\n this.loading = true\n\n try {\n this.items = await this.request('media.subtitles.search', {resource: this.item.url, language: 'all'})\n } finally {\n this.loading = false\n }\n }\n },\n\n mounted() {\n this.refresh()\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n@import \"~@/style/flag-icons.css\";\n\n.subtitles-container {\n .items {\n overflow: auto;\n }\n\n .footer {\n display: flex;\n justify-content: right;\n padding: 1em;\n background: $default-bg-6;\n box-shadow: $border-shadow-top;\n }\n}\n</style>\n","import { render } from \"./Subtitles.vue?vue&type=template&id=77ae3705&scoped=true\"\nimport script from \"./Subtitles.vue?vue&type=script&lang=js\"\nexport * from \"./Subtitles.vue?vue&type=script&lang=js\"\n\nimport \"./Subtitles.vue?vue&type=style&index=0&id=77ae3705&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-77ae3705\"]])\n\nexport default __exports__","<template>\n <div class=\"browser-container\">\n <Loading v-if=\"loading\" />\n\n <div class=\"row item\" @click=\"path = (path || '') + '/..'\" v-if=\"path?.length && path !== '/'\">\n <div class=\"col-10 left side\">\n <i class=\"icon fa fa-folder\" />\n <span class=\"name\">..</span>\n </div>\n </div>\n\n <div class=\"row item\" v-for=\"(file, i) in filteredFiles\" :key=\"i\" @click=\"path = file.path\">\n <div class=\"col-10\">\n <i class=\"icon fa\" :class=\"{'fa-file': file.type !== 'directory', 'fa-folder': file.type === 'directory'}\" />\n <span class=\"name\">\n {{ file.name }}\n </span>\n </div>\n\n <div class=\"col-2 actions\">\n <Dropdown>\n <DropdownItem icon-class=\"fa fa-play\" text=\"Play\"\n @click=\"$emit('play', {type: 'file', url: `file://${file.path}`})\"\n v-if=\"isMedia && mediaExtensions.has(file.name.split('.').pop())\" />\n </Dropdown>\n </div>\n </div>\n </div>\n</template>\n\n<script>\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport MediaUtils from \"@/components/Media/Utils\";\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\n\nexport default {\n name: \"Browser\",\n components: {DropdownItem, Dropdown, Loading},\n mixins: [Utils, MediaUtils],\n emits: ['path-change'],\n\n props: {\n initialPath: {\n type: String,\n },\n\n isMedia: {\n type: Boolean,\n },\n\n filter: {\n type: String,\n default: '',\n },\n },\n\n data() {\n return {\n loading: false,\n path: this.initialPath,\n files: [],\n }\n },\n\n computed: {\n filteredFiles() {\n if (!this.filter?.length)\n return this.files\n\n return this.files.filter((file) => (file?.name || '').toLowerCase().indexOf(this.filter.toLowerCase()) >= 0)\n },\n },\n\n methods: {\n async refresh() {\n this.loading = true\n\n try {\n this.files = await this.request('file.list', {path: this.path})\n this.$emit('path-change', this.path)\n } finally {\n this.loading = false\n }\n },\n },\n\n mounted() {\n this.$watch(() => this.path, () => this.refresh())\n this.refresh()\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n\n.browser-container {\n .item {\n .actions {\n display: inline-flex;\n justify-content: right;\n }\n }\n}\n</style>\n","import { render } from \"./Browser.vue?vue&type=template&id=a2e5c946&scoped=true\"\nimport script from \"./Browser.vue?vue&type=script&lang=js\"\nexport * from \"./Browser.vue?vue&type=script&lang=js\"\n\nimport \"./Browser.vue?vue&type=style&index=0&id=a2e5c946&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-a2e5c946\"]])\n\nexport default __exports__","import { render } from \"./Index.vue?vue&type=template&id=040b2676&scoped=true\"\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=040b2676&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-040b2676\"]])\n\nexport default __exports__","<template>\n <Loading v-if=\"loading\" />\n\n <div class=\"torrent-transfers fade-in\" v-else>\n <div class=\"no-content\" v-if=\"!Object.keys(transfers).length\">No torrent transfers in progress</div>\n\n <div class=\"row item\" :class=\"{selected: selectedItem === i}\" v-for=\"(torrent, i) in transfers\" :key=\"i\"\n @click=\"selectedItem = i\">\n <div class=\"col-8 left side\">\n <i class=\"icon fa\" :class=\"{\n 'fa-check': torrent.finish_date != null,\n 'fa-play': !torrent.finish_date && torrent.state === 'downloading',\n 'fa-pause': !torrent.finish_date && torrent.state === 'paused',\n 'fa-stop': !torrent.finish_date && torrent.state === 'stopped',\n }\" />\n <div class=\"title\" v-text=\"torrent.name || torrent.hash || torrent.url\" />\n </div>\n\n <div class=\"col-2 right side\">\n <span v-text=\"`${torrent.progress}%`\" />\n </div>\n\n <div class=\"col-2 right side\">\n <Dropdown title=\"Actions\" icon-class=\"fa fa-ellipsis-h\" @click=\"selectedItem = i\">\n <DropdownItem icon-class=\"fa fa-pause\" text=\"Pause transfer\" @click=\"pause(torrentId(torrent))\"\n v-if=\"torrent.state === 'downloading'\" />\n <DropdownItem icon-class=\"fa fa-play\" text=\"Resume transfer\" @click=\"resume(torrentId(torrent))\"\n v-if=\"torrent.state === 'paused'\" />\n <DropdownItem icon-class=\"fa fa-trash\" text=\"Remove transfer\" @click=\"remove(torrentId(torrent))\" />\n <DropdownItem icon-class=\"fa fa-folder\" text=\"View files\" @click=\"$refs.torrentFiles.isVisible = true\" />\n <DropdownItem icon-class=\"fa fa-info\" text=\"Torrent info\" @click=\"$refs.torrentInfo.isVisible = true\" />\n </Dropdown>\n </div>\n </div>\n\n <Modal ref=\"torrentInfo\" title=\"Torrent info\" width=\"80%\">\n <div class=\"modal-body torrent-info\" v-if=\"selectedItem != null && transfers[selectedItem]\">\n <div class=\"row\" v-if=\"transfers[selectedItem].name\">\n <div class=\"attr\">Name</div>\n <div class=\"value\" v-text=\"transfers[selectedItem].name\" />\n </div>\n\n <div class=\"row\" v-if=\"transfers[selectedItem].state\">\n <div class=\"attr\">State</div>\n <div class=\"value\" v-text=\"transfers[selectedItem].state\" />\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">Progress</div>\n <div class=\"value\" v-text=\"`${transfers[selectedItem].progress || 0}%`\" />\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">DL rate</div>\n <div class=\"value\" v-text=\"`${convertSize(transfers[selectedItem].download_rate || 0)}/s`\" />\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">UL rate</div>\n <div class=\"value\" v-text=\"`${convertSize(transfers[selectedItem].upload_rate || 0)}/s`\" />\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">Size</div>\n <div class=\"value\" v-text=\"convertSize(transfers[selectedItem].size || 0)\" />\n </div>\n\n <div class=\"row\" v-if=\"transfers[selectedItem].remaining_bytes\">\n <div class=\"attr\">Remaining</div>\n <div class=\"value\" v-text=\"convertSize(transfers[selectedItem].remaining_bytes)\" />\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">URL</div>\n <div class=\"value nowrap\">\n <a :href=\"transfers[selectedItem].url\" target=\"_blank\" v-text=\"transfers[selectedItem].url\" />\n </div>\n </div>\n\n <div class=\"row\">\n <div class=\"attr\">Peers</div>\n <div class=\"value\" v-text=\"transfers[selectedItem].peers || 0\" />\n </div>\n\n <div class=\"row\" v-if=\"transfers[selectedItem].start_date\">\n <div class=\"attr\">Started</div>\n <div class=\"value\" v-text=\"formatDateTime(transfers[selectedItem].start_date)\" />\n </div>\n\n <div class=\"row\" v-if=\"transfers[selectedItem].finish_date\">\n <div class=\"attr\">Finished</div>\n <div class=\"value\" v-text=\"formatDateTime(transfers[selectedItem].finish_date)\" />\n </div>\n\n <div class=\"row\" v-if=\"transfers[selectedItem].save_path\">\n <div class=\"attr\">Save path</div>\n <div class=\"value\" v-text=\"transfers[selectedItem].save_path\" />\n </div>\n </div>\n </Modal>\n\n <Modal ref=\"torrentFiles\" title=\"Torrent files\" width=\"80%\">\n <div class=\"modal-body torrent-files\" v-if=\"selectedItem != null && transfers[selectedItem]\">\n <div class=\"row\" v-for=\"(file, i) in relativeFiles\" :key=\"file\">\n <div class=\"col-1 icon\">\n <Dropdown v-if=\"isMedia && mediaExtensions.has(file.split('.').pop())\">\n <DropdownItem icon-class=\"fa fa-play\" text=\"Play\"\n @click=\"$emit('play', {url: `file://${transfers[selectedItem].files[i]}`, type: 'file'})\" />\n </Dropdown>\n\n <i class=\"fa fa-file\" v-else />\n </div>\n <div class=\"col-11 name\" v-text=\"file\" />\n </div>\n </div>\n </Modal>\n </div>\n</template>\n\n<script>\nimport Loading from \"@/components/Loading\";\nimport Utils from \"@/Utils\";\nimport MediaUtils from \"@/components/Media/Utils.vue\"\nimport Modal from \"@/components/Modal\";\nimport Dropdown from \"@/components/elements/Dropdown\";\nimport DropdownItem from \"@/components/elements/DropdownItem\";\n\nexport default {\n name: \"View\",\n emits: ['play', 'play-with-captions'],\n components: {Dropdown, DropdownItem, Loading, Modal},\n mixins: [Utils, MediaUtils],\n props: {\n pluginName: {\n type: String,\n required: true,\n },\n\n isMedia: {\n type: Boolean,\n default: false,\n },\n },\n\n data() {\n return {\n loading: false,\n transfers: {},\n selectedItem: null,\n }\n },\n\n computed: {\n relativeFiles() {\n if (this.selectedItem == null || !this.transfers[this.selectedItem]?.files?.length)\n return []\n\n return this.transfers[this.selectedItem].files.map((file) => file.split('/').pop())\n },\n },\n\n methods: {\n torrentId(torrent) {\n if (torrent?.hash && torrent.hash.length)\n return torrent.hash\n\n return torrent.url\n },\n\n async refresh() {\n this.loading = true\n\n try {\n this.transfers = Object.values(await this.request(`${this.pluginName}.status`) || {})\n .reduce((obj, torrent) => {\n obj[this.torrentId(torrent)] = torrent\n return obj\n }, {})\n } finally {\n this.loading = false\n }\n },\n\n async pause(torrent) {\n await this.request(`${this.pluginName}.pause`, {torrent: torrent})\n await this.refresh()\n },\n\n async resume(torrent) {\n await this.request(`${this.pluginName}.resume`, {torrent: torrent})\n await this.refresh()\n },\n\n async remove(torrent) {\n await this.request(`${this.pluginName}.remove`, {torrent: torrent})\n await this.refresh()\n },\n\n onTorrentUpdate(torrent) {\n this.transfers[this.torrentId(torrent)] = torrent\n },\n\n onTorrentRemove(torrent) {\n const torrentId = this.torrentId(torrent)\n if (torrentId in this.transfers)\n delete this.transfers[torrentId]\n },\n },\n\n mounted() {\n this.refresh()\n\n this.subscribe(\n this.onTorrentUpdate,'on-torrent-update',\n 'platypush.message.event.torrent.TorrentQueuedEvent',\n 'platypush.message.event.torrent.TorrentDownloadedMetadataEvent',\n 'platypush.message.event.torrent.TorrentDownloadStartEvent',\n 'platypush.message.event.torrent.TorrentDownloadProgressEvent',\n 'platypush.message.event.torrent.TorrentResumedEvent',\n 'platypush.message.event.torrent.TorrentPausedEvent',\n 'platypush.message.event.torrent.TorrentSeedingStartEvent',\n 'platypush.message.event.torrent.TorrentStateChangeEvent',\n 'platypush.message.event.torrent.TorrentDownloadStopEvent',\n 'platypush.message.event.torrent.TorrentDownloadCompletedEvent')\n\n this.subscribe(this.onTorrentRemove,'on-torrent-remove',\n 'platypush.message.event.torrent.TorrentRemovedEvent')\n },\n\n destroy() {\n this.unsubscribe('on-torrent-update')\n this.unsubscribe('on-torrent-remove')\n },\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import \"src/style/items\";\n\n.torrent-transfers {\n height: 100%;\n background: $background-color;\n\n .no-content {\n height: 100%;\n }\n}\n\n::v-deep(.modal-body) {\n .row {\n display: flex;\n border-bottom: $default-border;\n padding: .5em .25em;\n border-radius: .5em;\n\n &:hover {\n background-color: $hover-bg;\n }\n\n .attr {\n @extend .col-3;\n display: inline-flex;\n }\n\n .value {\n @extend .col-9;\n display: inline-flex;\n justify-content: right;\n\n &.nowrap {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: clip;\n }\n }\n }\n}\n\n::v-deep(.modal-body) {\n .dropdown-container {\n .row {\n box-shadow: none;\n border: none;\n }\n\n button {\n border: none;\n background: none;\n\n &:hover {\n color: $default-hover-fg;\n }\n }\n }\n}\n</style>\n","import { render } from \"./View.vue?vue&type=template&id=7eb04934&scoped=true\"\nimport script from \"./View.vue?vue&type=script&lang=js\"\nexport * from \"./View.vue?vue&type=script&lang=js\"\n\nimport \"./View.vue?vue&type=style&index=0&id=7eb04934&lang=scss&scoped=true\"\n\nimport exportComponent from \"/home/blacklight/git_tree/platypush/platypush/backend/http/webapp/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-7eb04934\"]])\n\nexport default __exports__"],"names":["class","loading","pluginName","status","selectedPlayer","track","buttons","mediaButtons","pause","stop","setVolume","seek","search","selectedView","$event","hasSubtitlesPlugin","ref","sources","selectedSubtitles","browserFilter","onStatusUpdate","downloadTorrent","showSubtitlesModal","$refs","playUrlModal","show","header","filterVisible","results","selectedResult","onResultSelect","play","mediaInfo","isVisible","view","download","torrentPlugin","filter","title","item","visible","selectSubtitles","playUrlInput","focus","playUrl","urlPlay","type","autofocus","disabled","length","placeholder","query","$emit","torrentURL","value","target","selectedItem","Object","keys","source","key","checked","player","name","iconClass","text","refresh","players","i","select","mixins","Utils","emits","props","data","methods","async","this","component","request","resource","subs","url","subtitles","volume","position","event","isMine","onMediaEvent","notify","device","image","plugin","filename","supports","startsWith","mounted","subscribe","onNewMedia","destroy","unsubscribe","__exports__","Mixin","devices","Promise","all","map","chromecast","getPlayerName","$root","config","host","components","Loading","DropdownItem","Dropdown","Chromecast","Kodi","Mplayer","Mpv","Omxplayer","Vlc","String","required","plugins","loadPlugins","entries","p","endsWith","getPlayers","push","Players","Boolean","default","types","$watch","imdb_id","href","series","season","episode","num_seasons","synopsis","description","summary","overview","duration","country","network","rating","percentage","votes","genres","join","channelId","channelTitle","year","publishedAt","file","trailer","size","quality","seeds","peers","language","views","displayName","collapsed","browser","torrents","result","typeIcons","Array","Number","items","sub","IsLocal","ISO639","SubFileName","path","filteredFiles","isMedia","mediaExtensions","has","split","pop","initialPath","files","computed","toLowerCase","indexOf","Browser","MediaView","Header","Results","Modal","Info","Nav","TorrentView","Subtitles","previous","next","awaitingPlayTorrent","torrentPlugins","startStreaming","ret","window","open","onTorrentQueued","onTorrentMetadata","onTorrentDownloadStart","onTorrentDownloadCompleted","getTorrentPlugin","pluginConf","torrent_plugin","torrent","error","subtitlesSelector","close","link","SubDownloadLink","Set","state","addSubtitles","removeSubtitles","plex","jellyfin","render","transfers","hash","progress","torrentId","resume","remove","torrentFiles","torrentInfo","width","convertSize","download_rate","upload_rate","remaining_bytes","start_date","finish_date","save_path","relativeFiles","values","reduce","obj","onTorrentUpdate","onTorrentRemove"],"sourceRoot":""}