import
- htmlparser,
httpClient,
json,
os,
sequtils,
std/[terminal],
strformat,
- strtabs,
strutils,
- sugar,
- tables,
- uri,
- xmltree
+ tables
-import config
-
-
-type
- Options* = Table[string, bool]
- SearchResult* = tuple[title: string, url: string]
- SearchResults* = seq[tuple[title: string, url: string]]
- CommandLineOptions* = tuple[searchQuery: string, options: Options]
- SelectionRange* = tuple[begin: int, until: int]
+import
+ config,
+ types
let
return availablePlayers[0]
-proc getYoutubePage*(searchQuery: string): string =
- let queryParam = encodeUrl(searchQuery)
- let client = newHttpClient()
- let response = get(client, &"https://invidious.snopyta.org/search?q={queryParam}")
- $response.body
-
-
proc getPeerTubeMagnetLink(url: string): string =
## Gets the magnet link of the best possible resolution from PeerTube
let uuid = url.substr(find(url, PEERTUBE_REGEX) + "videos/watch/".len)
jsonNode["files"][0]["magnetUri"].getStr()
-func extractTitlesAndUrls*(html: string): SearchResults =
- {.noSideEffect.}:
- # TODO Pick an invidious instance from config. Using YouTube directly for now.
- parseHtml(html).findAll("a").
- filter(a => "watch" in a.attrs["href"] and len(a) == 1).
- map(a => (innerText(a), "https://www.youtube.com" & a.attrs["href"]))
-
-
proc presentVideoOptions*(searchResults: SearchResults) =
eraseScreen()
for index, (title, url) in searchResults:
styledEcho $index, ". ", styleBright, fgMagenta, title, "\n", resetStyle, fgCyan, " ", url, "\n"
-func isPlaylist(url: string): bool =
- ##[ Identifies if video is part of a playlist.
- Only YouTube playlists are supported for now. ]##
- "www.youtube.com" in url and "&list=" in url
-
-
func buildPlayerArgs(url: string, options: Table[string, bool], player: string): seq[string] =
- let url =
- # Playlists are only supported by MPV player. VLC needs a plugin.
- if isPlaylist(url) and player == "mpv":
- "https://www.youtube.com/playlist?" & url.split('&')[1]
- else: url
let musicOnly = if options["musicOnly"]: "--no-video" else: ""
let fullScreen = if options["fullScreen"]: "--fullscreen" else: ""
filterIt([url, musicOnly, fullScreen], it != "")