diff options
-rw-r--r-- | general-util.js | 17 | ||||
-rw-r--r-- | ui.js | 13 |
2 files changed, 25 insertions, 5 deletions
diff --git a/general-util.js b/general-util.js index a7bfb11..3aa4180 100644 --- a/general-util.js +++ b/general-util.js @@ -3,6 +3,7 @@ const { promisify } = require('util') const fetch = require('node-fetch') const fs = require('fs') const npmCommandExists = require('command-exists') +const url = require('url') const readFile = promisify(fs.readFile) @@ -61,9 +62,19 @@ function downloadPlaylistFromLocalPath(path) { } module.exports.downloadPlaylistFromOptionValue = function(arg) { - // TODO: Verify things! - if (arg.startsWith('http://') || arg.startsWith('https://')) { - return downloadPlaylistFromURL(arg) + let argURL + try { + argURL = new url.URL(arg) + } catch (err) { + // Definitely not a URL. + } + + if (argURL) { + if (argURL.protocol === 'http:' || argURL.protocol === 'https:') { + return downloadPlaylistFromURL(arg) + } else if (argURL.protocol === 'file:') { + return downloadPlaylistFromLocalPath(url.fileURLToPath(argURL)) + } } else { return downloadPlaylistFromLocalPath(arg) } diff --git a/ui.js b/ui.js index f334a70..368c8ea 100644 --- a/ui.js +++ b/ui.js @@ -223,7 +223,7 @@ class AppElement extends FocusElement { this.queueTimeLabel = new Label('') this.paneRight.addChild(this.queueTimeLabel) - this.queueListingElement.on('open', item => this.openThroughSystem(item)) + this.queueListingElement.on('open', item => this.openSpecialOrThroughSystem(item)) this.queueListingElement.on('queue', item => this.play(item)) this.queueListingElement.on('remove', item => this.unqueue(item)) this.queueListingElement.on('shuffle', () => this.shuffleQueue()) @@ -581,7 +581,7 @@ class AppElement extends FocusElement { grouplikeListing.on('browse', item => grouplikeListing.loadGrouplike(item)) grouplikeListing.on('download', item => this.SQP.download(item)) - grouplikeListing.on('open', item => this.openThroughSystem(item)) + grouplikeListing.on('open', item => this.openSpecialOrThroughSystem(item)) grouplikeListing.on('queue', (item, opts) => this.handleQueueOptions(item, opts)) const updateListingsFor = item => { @@ -797,6 +797,14 @@ class AppElement extends FocusElement { } } + openSpecialOrThroughSystem(item) { + if (item.url.endsWith('.json')) { + return this.handlePlaylistSource(item.url, true) + } else { + return this.openThroughSystem(item) + } + } + openThroughSystem(item) { if (!isOpenable(item)) { return @@ -916,6 +924,7 @@ class AppElement extends FocusElement { canControlQueue && isPlayable(item) && {label: 'Remove from queue', action: () => this.unqueue(item)}, {divider: true}, + isOpenable(item) && item.url.endsWith('.json') && {label: 'Open (JSON Playlist)', action: () => this.openSpecialOrThroughSystem(item)}, isOpenable(item) && {label: 'Open (System)', action: () => this.openThroughSystem(item)}, {divider: true}, |