X-Git-Url: https://njoseph.me/gitweb/nimcoon.git/blobdiff_plain/d1e4d2de5ba2f22339ee543da977e8941e84bc9e..3c20e75c565cd0d0eb73ca8060c22bf557aeab89:/clitube.nim diff --git a/clitube.nim b/clitube.nim deleted file mode 100644 index f69813d..0000000 --- a/clitube.nim +++ /dev/null @@ -1,114 +0,0 @@ -import - htmlparser, - httpClient, - logging, - parseopt, - osproc, - sequtils, - sugar, - strformat, - std/[terminal], - strtabs, - strutils, - uri, - xmltree - -import preferences - -type - SearchResult = tuple[title: string, url: string] - CommandLineOptions = tuple[searchQuery: string, musicOnly: bool, feelingLucky: bool, fullScreen: bool] - -let logger = newConsoleLogger() -setLogFilter(lvlInfo) - -proc selectMediaPlayer(): string = - let availablePlayers = filterIt(supportedPlayers, execProcess("which " & it).len != 0) - if len(availablePlayers) == 0: - stderr.writeLine &"Please install one of the supported media players: {supportedPlayers}" - raise newException(OSError, "No supported media player found") - else: - return availablePlayers[0] - -proc parseOptions(): CommandLineOptions = - var - searchQuery = "" - musicOnly = false - feelingLucky = false - fullScreen = false - - for kind, key, value in getopt(): - case kind - of cmdArgument: - searchQuery = key - of cmdShortOption, cmdLongOption: - case key - of "m", "music": musicOnly = true - of "l", "lucky": feelingLucky = true - of "f", "full-screen": fullScreen = true - of cmdEnd: - discard - - return (searchQuery, musicOnly, feelingLucky, fullScreen) - -proc getYoutubePage(searchQuery: string): string = - let queryParam = encodeUrl(searchQuery) - let client = newHttpClient() - let response = get(client, &"https://www.youtube.com/results?hl=en&search_query={queryParam}") - return $response.body - -proc extractTitlesAndUrls(htmlFile: string): seq[SearchResult] = - parseHtml(htmlFile).findAll("a"). - filter(a => "watch" in a.attrs["href"] and a.attrs.hasKey "title"). - map(a => (a.attrs["title"], "https://www.youtube.com" & a.attrs["href"]))[..(limit-1)] - -proc presentVideoOptions(searchResults: seq[SearchResult]) = - echo "" - for index, (title, url) in searchResults: - styledEcho $index, ". ", styleBright, fgMagenta, title, "\n", resetStyle, fgCyan, url, "\n" - -proc play(command: string) = - logger.log(lvlDebug, &"Executing: ${command}") - discard execProcess(command) - quit(0) - -proc directPlay(searchQuery: string, player: string) = - if "watch?" in searchQuery or "videos/watch" in searchQuery : - play(&"{player} {searchQuery}") - elif searchQuery.startswith("magnet:"): - play(&"peerflix \"{searchQuery}\" --{player}") - -proc main() = - let - player = selectMediaPlayer() - (searchQuery, musicOnly, feelingLucky, fullScreen) = parseOptions() - - if searchQuery.startswith("https:") or searchQuery.startswith("magnet:"): - directPlay(searchQuery, player) - - let searchResults = extractTitlesAndUrls(getYoutubePage(searchQuery)) - - let number = - if feelingLucky: 0 - else: - presentVideoOptions(searchResults) - stdout.styledWrite(fgYellow, "Choose video number: ") - parseInt(readLine(stdin)) - - styledEcho "\n", fgGreen, "Playing ", styleBright, fgMagenta, searchResults[number].title - - var command = @[player, searchResults[number].url] - - if musicOnly: - command.add("--no-video") - - if fullScreen: - if player == "cvlc": - command.add("--fullscreen") - if player == "mpv": - command.add("--fs") - - # Play the video using the preferred/available media player - play(command.join(" ")) - -main()