diff options
Diffstat (limited to 'src/invidious.cr')
| -rw-r--r-- | src/invidious.cr | 110 |
1 files changed, 88 insertions, 22 deletions
diff --git a/src/invidious.cr b/src/invidious.cr index 1f33c2db..f91e4c72 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -368,6 +368,31 @@ get "/embed/:id" do |env| rendered "embed" end +# Playlists +get "/playlist" do |env| + plid = env.params.query["list"]? + if !plid + next env.redirect "/" + end + + page = env.params.query["page"]?.try &.to_i? + page ||= 1 + + if plid + begin + videos = extract_playlist(plid, page) + rescue ex + error_message = ex.message + next templated "error" + end + playlist = fetch_playlist(plid) + else + next env.redirect "/" + end + + templated "playlist" +end + # Search get "/results" do |env| @@ -1534,31 +1559,13 @@ get "/channel/:ucid" do |env| rss = XML.parse_html(rss.body) author = rss.xpath_node("//feed/author/name").not_nil!.content - url = produce_playlist_url(ucid, (page - 1) * 100) - response = client.get(url) - response = JSON.parse(response.body) - - if !response["content_html"]? - error_message = "This channel does not exist." + begin + videos = extract_playlist(ucid, page) + rescue ex + error_message = ex.message next templated "error" end - document = XML.parse_html(response["content_html"].as_s) - anchor = document.xpath_node(%q(//div[@class="pl-video-owner"]/a)) - if !anchor - videos = [] of ChannelVideo - next templated "channel" - end - - videos = [] of ChannelVideo - document.xpath_nodes(%q(//a[contains(@class,"pl-video-title-link")])).each do |node| - href = URI.parse(node["href"]) - id = HTTP::Params.parse(href.query.not_nil!)["v"] - title = node.content - - videos << ChannelVideo.new(id, title, Time.now, Time.now, "", "") - end - templated "channel" end @@ -2363,6 +2370,65 @@ get "/api/v1/search" do |env| response end +get "/api/v1/playlists/:plid" do |env| + plid = env.params.url["plid"] + + page = env.params.query["page"]?.try &.to_i? + page ||= 1 + + begin + videos = extract_playlist(plid, page) + rescue ex + env.response.content_type = "application/json" + response = {"error" => "Playlist is empty"}.to_json + halt env, status_code: 404, response: response + end + + playlist = fetch_playlist(plid) + + response = JSON.build do |json| + json.object do + json.field "title", playlist.title + json.field "id", playlist.id + + json.field "author", playlist.author + json.field "authorId", playlist.ucid + json.field "authorUrl", "/channel/#{playlist.ucid}" + + json.field "description", playlist.description + json.field "videoCount", playlist.video_count + + json.field "viewCount", playlist.views + json.field "updated", playlist.updated.epoch + + json.field "videos" do + json.array do + videos.each do |video| + json.object do + json.field "title", video.title + json.field "id", video.id + + json.field "author", video.author + json.field "authorId", video.ucid + json.field "authorUrl", "/channel/#{video.ucid}" + + json.field "videoThumbnails" do + generate_thumbnails(json, video.id) + end + + json.field "index", video.index + json.field "lengthSeconds", video.length_seconds + end + end + end + end + end + end + + env.response.content_type = "application/json" + response +end + get "/api/manifest/dash/id/videoplayback" do |env| env.response.headers["Access-Control-Allow-Origin"] = "*" env.redirect "/videoplayback?#{env.params.query}" |
