From: Joseph Nuthalapati Date: Mon, 1 Jun 2020 16:52:22 +0000 (+0530) Subject: Detect and play playlists (MPV only) X-Git-Tag: 0.3.0~1 X-Git-Url: https://njoseph.me/gitweb/nimcoon.git/commitdiff_plain/d36e22010231d8bd139b906fc66e060575decb2d Detect and play playlists (MPV only) --- diff --git a/README.md b/README.md index 82dad57..7af3591 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,9 @@ only the standard library. - [x] Stream video and music from magnet links - [x] Download music - [x] Download video +- [x] Play playlists (MPV only) +- [ ] Download playlists +- [ ] Autoplay next video/audio - [ ] Configuration options ## Installation diff --git a/src/lib.nim b/src/lib.nim index d77cbe1..67095ac 100644 --- a/src/lib.nim +++ b/src/lib.nim @@ -51,8 +51,24 @@ proc presentVideoOptions*(searchResults: SearchResults) = for index, (title, url) in searchResults: styledEcho $index, ". ", styleBright, fgMagenta, title, "\n", resetStyle, fgCyan, url, "\n" -proc play*(player: string, args: openArray[string], title: string) = - styledEcho "\n", fgGreen, "Playing ", styleBright, fgMagenta, title +func isPlaylist(url: string): bool = + # Only YouTube playlists are supported for now + "www.youtube.com" in url and "&list=" in url + +# This is a pure function with no side effects +func buildPlayerArgs(url: string, options: Table[string, bool], player: string): seq[string] = + var args = @[url] + if options["musicOnly"]: args.add("--no-video") + if options["fullScreen"]: args.add("--fullscreen") + # Playlists are only supported for MPV player + if isPlaylist(url) and player == "mpv": + args.add("--ytdl-raw-options=\"yes-playlist=\"") + return args + +proc play*(player: string, options: Table[string, bool], url: string, title: string = "") = + let args = buildPlayerArgs(url, options, player) + if title != "": + styledEcho "\n", fgGreen, "Playing ", styleBright, fgMagenta, title if "--no-video" in args: discard execShellCmd(&"{player} {args.join(\" \")}") else: @@ -87,17 +103,14 @@ func stripZshEscaping(url: string): string = func sanitizeURL*(url: string): string = urlLongen(stripZshEscaping(url)) -proc directPlay*(url: string, player: string, musicOnly: bool) = +proc directPlay*(url: string, player: string, options: Table[string, bool]) = if url.startswith("magnet:"): - if musicOnly: + if options["musicOnly"]: discard execShellCmd(&"peerflix '{url}' -a --{player} -- --no-video") else: discard execProcess("peerflix", args=[url, &"--{player}"], options=processOptions) else: - if musicOnly: - discard execShellCmd(&"{player} --no-video {url}") - else: - discard execProcess(player, args=[url], options=processOptions) + play(player, options, url) proc directDownload*(url: string, musicOnly: bool) = let args = @@ -112,13 +125,6 @@ proc offerSelection(searchResults: SearchResults, options: Table[string, bool], stdout.styledWrite(fgYellow, "Choose video number: ") readLine(stdin) -# This is a pure function with no side effects -func buildPlayerArgs(searchResult: SearchResult, options: Table[string, bool]): seq[string] = - var args = @[searchResult.url] - if options["musicOnly"]: args.add("--no-video") - if options["fullScreen"]: args.add("--fullscreen") - return args - proc handleUserInput(searchResult: SearchResult, options: Table[string, bool], player: string) = if options["download"]: if options["musicOnly"]: @@ -126,7 +132,7 @@ proc handleUserInput(searchResult: SearchResult, options: Table[string, bool], p else: download(buildVideoDownloadArgs(searchResult.url), searchResult.title) else: - play(player, buildPlayerArgs(searchResult, options), searchResult.title) + play(player, options, searchResult.url, searchResult.title) proc present*(searchResults: SearchResults, options: Table[string, bool], selectionRange: SelectionRange, player: string) = #[ Continuously present options till the user quits the application diff --git a/src/nimcoon.nim b/src/nimcoon.nim index cc0bd7e..1bb0b74 100644 --- a/src/nimcoon.nim +++ b/src/nimcoon.nim @@ -49,7 +49,7 @@ proc main() = if options["download"]: directDownload(sanitizeURL(searchQuery), options["musicOnly"]) else: - directPlay(sanitizeURL(searchQuery), player, options["musicOnly"]) + directPlay(sanitizeURL(searchQuery), player, options) quit(0) let searchResults = extractTitlesAndUrls(getYoutubePage(searchQuery))