httpClient,
json,
strformat,
+ strutils,
uri
import
discard """
-Using Invidious API to retrieve the search results but playing the results directly from YouTube.
-API reference:
-https://github.com/iv-org/documentation/blob/master/API.md#get-apiv1search
+Invidious API reference:
+https://github.com/iv-org/documentation/blob/master/API.md
"""
+func makeUrl(videoId: string): string =
+ "https://www.youtube.com/watch?v=" & videoId
+
+
proc getSearchResults*(searchQuery: string): SearchResults =
+ # Using Invidious API to retrieve the search results but playing the results directly from YouTube.
let queryParam = encodeUrl(searchQuery)
let client = newHttpClient()
let response = get(client, &"{invidiousInstance}/api/v1/search?q={queryParam}")
var searchResults: SearchResults = @[]
for item in jsonData:
if item["type"].getStr() == "video":
- searchResults.add((item["title"].getStr(), "https://www.youtube.com/watch?v=" & item["videoId"].getStr()))
+ searchResults.add((item["title"].getStr(), makeUrl(item["videoId"].getStr())))
elif item["type"].getStr() == "playlist":
- searchResults.add((item["title"].getStr(), "https://www.youtube.com/watch?v=" & item["playlistId"].getStr()))
+ searchResults.add((item["title"].getStr(), makeUrl(item["playlistId"].getStr())))
# Not handling type = channel for now
searchResults
+
+proc getAutoPlayVideo*(searchResult: SearchResult): SearchResult =
+ # Take a search result and fetch its first recommendation
+ let videoId = searchResult.url.split("=")[1]
+ let client = newHttpClient()
+ let response = get(client, &"{invidiousInstance}/api/v1/videos/{videoId}")
+ let jsonData = parseJson($response.body)
+ let firstRecommendation = jsonData["recommendedVideos"][0]
+ (firstRecommendation["title"].getStr(), makeUrl(firstRecommendation["videoId"].getStr()))