diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/invidious.cr | 18 | ||||
| -rw-r--r-- | src/invidious/comments.cr | 8 | ||||
| -rw-r--r-- | src/invidious/helpers/utils.cr | 4 | ||||
| -rw-r--r-- | src/invidious/trending.cr | 38 | ||||
| -rw-r--r-- | src/invidious/views/channel.ecr | 6 | ||||
| -rw-r--r-- | src/invidious/views/components/item.ecr | 14 | ||||
| -rw-r--r-- | src/invidious/views/components/subscribe_widget.ecr | 2 | ||||
| -rw-r--r-- | src/invidious/views/history.ecr | 6 | ||||
| -rw-r--r-- | src/invidious/views/login.ecr | 28 | ||||
| -rw-r--r-- | src/invidious/views/playlist.ecr | 6 | ||||
| -rw-r--r-- | src/invidious/views/playlists.ecr | 2 | ||||
| -rw-r--r-- | src/invidious/views/search.ecr | 6 | ||||
| -rw-r--r-- | src/invidious/views/subscriptions.ecr | 6 | ||||
| -rw-r--r-- | src/invidious/views/trending.ecr | 7 | ||||
| -rw-r--r-- | src/invidious/views/watch.ecr | 8 |
15 files changed, 108 insertions, 51 deletions
diff --git a/src/invidious.cr b/src/invidious.cr index 2d566ac0..f0d7fbf1 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -731,6 +731,8 @@ get "/search" do |env| sort = value when "subscriptions" subscriptions = value == "true" + else + operators.delete(operator) end end @@ -1617,7 +1619,7 @@ get "/subscription_ajax" do |env| } post_url = "/subscription_ajax?#{action}=1&c=#{channel_id}" - # Sync subscription with YouTube + # Sync subscriptions with YouTube client.post(post_url, headers, form: post_req) email = user.email else @@ -1953,7 +1955,7 @@ get "/feed/trending" do |env| region ||= "US" begin - trending = fetch_trending(trending_type, proxies, region, locale) + trending, plid = fetch_trending(trending_type, proxies, region, locale) rescue ex error_message = "#{ex.message}" next templated "error" @@ -2778,12 +2780,12 @@ get "/api/v1/comments/:id" do |env| format = env.params.query["format"]? format ||= "json" - sort_by = env.params.query["sort_by"]?.try &.downcase - sort_by ||= "top" - continuation = env.params.query["continuation"]? + sort_by = env.params.query["sort_by"]?.try &.downcase if source == "youtube" + sort_by ||= "top" + begin comments = fetch_youtube_comments(id, PG_DB, continuation, proxies, format, locale, thin_mode, region, sort_by: sort_by) rescue ex @@ -2794,8 +2796,10 @@ get "/api/v1/comments/:id" do |env| next comments elsif source == "reddit" + sort_by ||= "confidence" + begin - comments, reddit_thread = fetch_reddit_comments(id) + comments, reddit_thread = fetch_reddit_comments(id, sort_by: sort_by) content_html = template_reddit_comments(comments, locale) content_html = fill_links(content_html, "https", "www.reddit.com") @@ -3201,7 +3205,7 @@ get "/api/v1/trending" do |env| trending_type = env.params.query["type"]? begin - trending = fetch_trending(trending_type, proxies, region, locale) + trending, plid = fetch_trending(trending_type, proxies, region, locale) rescue ex error_message = {"error" => ex.message}.to_json env.response.status_code = 500 diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr index cd96565b..645ca2a8 100644 --- a/src/invidious/comments.cr +++ b/src/invidious/comments.cr @@ -249,7 +249,7 @@ def fetch_youtube_comments(id, db, continuation, proxies, format, locale, thin_m return comments end -def fetch_reddit_comments(id) +def fetch_reddit_comments(id, sort_by = "confidence") client = make_client(REDDIT_URL) headers = HTTP::Headers{"User-Agent" => "web:invidious:v#{CURRENT_VERSION} (by /u/omarroth)"} @@ -259,12 +259,16 @@ def fetch_reddit_comments(id) if search_results.status_code == 200 search_results = RedditThing.from_json(search_results.body) + # For videos that have more than one thread, choose the one with the highest score thread = search_results.data.as(RedditListing).children.sort_by { |child| child.data.as(RedditLink).score }[-1] thread = thread.data.as(RedditLink) - result = client.get("/r/#{thread.subreddit}/comments/#{thread.id}.json?limit=100&sort=top", headers).body + result = client.get("/r/#{thread.subreddit}/comments/#{thread.id}.json?limit=100&sort=#{sort_by}", headers).body result = Array(RedditThing).from_json(result) elsif search_results.status_code == 302 + # Previously, if there was only one result then the API would redirect to that result. + # Now, it appears it will still return a listing so this section is likely unnecessary. + result = client.get(search_results.headers["Location"], headers).body result = Array(RedditThing).from_json(result) diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index eb8fa80a..eb304d8d 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -189,7 +189,9 @@ def number_to_short_text(number) text = text.rchop(".0") - if number / 1000000 != 0 + if number / 1_000_000_000 != 0 + text += "B" + elsif number / 1_000_000 != 0 text += "M" elsif number / 1000 != 0 text += "K" diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr index 15630721..8e55f207 100644 --- a/src/invidious/trending.cr +++ b/src/invidious/trending.cr @@ -7,6 +7,8 @@ def fetch_trending(trending_type, proxies, region, locale) region = region.upcase trending = "" + plid = nil + if trending_type && trending_type != "Default" trending_type = trending_type.downcase.capitalize @@ -23,9 +25,11 @@ def fetch_trending(trending_type, proxies, region, locale) url = tabs.select { |tab| tab["channelListSubMenuAvatarRenderer"]["title"]["simpleText"] == trending_type }[0]? if url + url["channelListSubMenuAvatarRenderer"]["navigationEndpoint"]["commandMetadata"]["webCommandMetadata"]["url"] url = url["channelListSubMenuAvatarRenderer"]["navigationEndpoint"]["commandMetadata"]["webCommandMetadata"]["url"].as_s url += "&disable_polymer=1&gl=#{region}&hl=en" trending = client.get(url).body + plid = extract_plid(url) else trending = client.get("/feed/trending?gl=#{region}&hl=en&disable_polymer=1").body end @@ -37,5 +41,37 @@ def fetch_trending(trending_type, proxies, region, locale) nodeset = trending.xpath_nodes(%q(//ul/li[@class="expanded-shelf-content-item-wrapper"])) trending = extract_videos(nodeset) - return trending + return {trending, plid} +end + +def extract_plid(url) + wrapper = HTTP::Params.parse(URI.parse(url).query.not_nil!)["bp"] + + wrapper = URI.unescape(wrapper) + wrapper = Base64.decode(wrapper) + + # 0xe2 0x02 0x2e + wrapper += 3 + + # 0x0a + wrapper += 1 + + # Looks like "/m/[a-z0-9]{5}", not sure what it does here + + item_size = wrapper[0] + wrapper += 1 + item = wrapper[0, item_size] + wrapper += item.size + + # 0x12 + wrapper += 1 + + plid_size = wrapper[0] + wrapper += 1 + plid = wrapper[0, plid_size] + wrapper += plid.size + + plid = String.new(plid) + + return plid end diff --git a/src/invidious/views/channel.ecr b/src/invidious/views/channel.ecr index 746ffcde..d52c01ca 100644 --- a/src/invidious/views/channel.ecr +++ b/src/invidious/views/channel.ecr @@ -67,15 +67,15 @@ </div> <div class="pure-g h-box"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if page >= 2 %> <a href="/channel/<%= ucid %>?page=<%= page - 1 %><% if sort_by != "newest" %>&sort_by=<%= sort_by %><% end %>"> <%= translate(locale, "Previous page") %> </a> <% end %> </div> - <div class="pure-u-1 pure-u-md-3-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-3-5"></div> + <div style="text-align:right" class="pure-u-1 pure-u-lg-1-5"> <% if count == 60 %> <a href="/channel/<%= ucid %>?page=<%= page + 1 %><% if sort_by != "newest" %>&sort_by=<%= sort_by %><% end %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/components/item.ecr b/src/invidious/views/components/item.ecr index e2a5195c..2dc0bea4 100644 --- a/src/invidious/views/components/item.ecr +++ b/src/invidious/views/components/item.ecr @@ -71,7 +71,12 @@ <% if item.responds_to?(:premiere_timestamp) && item.premiere_timestamp && item.premiere_timestamp.not_nil! > Time.now %> <h5><%= translate(locale, "Premieres in `x`", recode_date((item.premiere_timestamp.as(Time) - Time.now).ago, locale)) %></h5> <% elsif Time.now - item.published > 1.minute %> - <h5><%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %></h5> + <h5 class="pure-g"> + <div class="pure-u-2-3"><%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %></div> + <div class="pure-u-1-3" style="text-align: right"> + <%= item.responds_to?(:views) ? translate(locale, "`x` views", number_to_short_text(item.views)) : "" %> + </div> + </h5> <% end %> <% else %> <% if env.get("preferences").as(Preferences).thin_mode %> @@ -108,7 +113,12 @@ <% if item.responds_to?(:premiere_timestamp) && item.premiere_timestamp && item.premiere_timestamp.not_nil! > Time.now %> <h5><%= translate(locale, "Premieres in `x`", recode_date((item.premiere_timestamp.as(Time) - Time.now).ago, locale)) %></h5> <% elsif Time.now - item.published > 1.minute %> - <h5><%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %></h5> + <h5 class="pure-g"> + <div class="pure-u-2-3"><%= translate(locale, "Shared `x` ago", recode_date(item.published, locale)) %></div> + <div class="pure-u-1-3" style="text-align: right"> + <%= item.responds_to?(:views) ? translate(locale, "`x` views", number_to_short_text(item.views)) : "" %> + </div> + </h5> <% end %> <% end %> </div> diff --git a/src/invidious/views/components/subscribe_widget.ecr b/src/invidious/views/components/subscribe_widget.ecr index 5cdb6525..df16658d 100644 --- a/src/invidious/views/components/subscribe_widget.ecr +++ b/src/invidious/views/components/subscribe_widget.ecr @@ -18,7 +18,7 @@ <p> <a id="subscribe" class="pure-button pure-button-primary" href="/login?referer=<%= env.get("current_page") %>"> - <b><%= translate(locale, "Login to subscribe to `x`", author) %></b> + <b><%= translate(locale, "Subscribe") %> | <%= sub_count_text %></b> </a> </p> <% end %> diff --git a/src/invidious/views/history.ecr b/src/invidious/views/history.ecr index 017f5eae..9be40a0d 100644 --- a/src/invidious/views/history.ecr +++ b/src/invidious/views/history.ecr @@ -72,15 +72,15 @@ function mark_unwatched(target) { </script> <div class="pure-g h-box"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if page >= 2 %> <a href="/feed/history?page=<%= page - 1 %>"> <%= translate(locale, "Previous page") %> </a> <% end %> </div> - <div class="pure-u-1 pure-u-md-3-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-3-5"></div> + <div style="text-align:right;" class="pure-u-1 pure-u-lg-1-5"> <% if watched.size >= limit %> <a href="/feed/history?page=<%= page + 1 %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/login.ecr b/src/invidious/views/login.ecr index 82e9396c..ec5dc147 100644 --- a/src/invidious/views/login.ecr +++ b/src/invidious/views/login.ecr @@ -3,8 +3,8 @@ <% end %> <div class="pure-g"> - <div class="pure-u-1 pure-u-md-1-5"></div> - <div class="pure-u-1 pure-u-md-3-5"> + <div class="pure-u-1 pure-u-lg-1-5"></div> + <div class="pure-u-1 pure-u-lg-3-5"> <div class="h-box"> <div class="pure-g"> <div class="pure-u-1-2"> @@ -25,15 +25,15 @@ <% if email %> <input name="email" type="hidden" value="<%= email %>"> <% else %> - <label for="email"><%= translate(locale, "User ID:") %></label> - <input required class="pure-input-1" name="email" type="text" placeholder="User ID"> + <label for="email"><%= translate(locale, "User ID") %> :</label> + <input required class="pure-input-1" name="email" type="text" placeholder="<%= translate(locale, "User ID") %>"> <% end %> <% if password %> <input name="password" type="hidden" value="<%= password %>"> <% else %> - <label for="password"><%= translate(locale, "Password:") %></label> - <input required class="pure-input-1" name="password" type="password" placeholder="Password"> + <label for="password"><%= translate(locale, "Password") %> :</label> + <input required class="pure-input-1" name="password" type="password" placeholder="<%= translate(locale, "Password") %>"> <% end %> <% if captcha %> @@ -56,7 +56,7 @@ <% end %> <input type="hidden" name="captcha_type" value="text"> <label for="answer"><%= captcha[:question] %></label> - <input type="text" name="answer" type="text" placeholder="Answer"> + <input type="text" name="answer" type="text" placeholder="<%= translate(locale, "Answer") %>"> <% end %> <button type="submit" name="action" value="signin" class="pure-button pure-button-primary"> @@ -90,20 +90,20 @@ <% if email %> <input name="email" type="hidden" value="<%= email %>"> <% else %> - <label for="email"><%= translate(locale, "Email:") %></label> - <input required class="pure-input-1" name="email" type="email" placeholder="Email"> + <label for="email"><%= translate(locale, "Email") %> :</label> + <input required class="pure-input-1" name="email" type="email" placeholder="<%= translate(locale, "Email") %>"> <% end %> <% if password %> <input name="password" type="hidden" value="<%= password %>"> <% else %> - <label for="password"><%= translate(locale, "Password:") %></label> - <input required class="pure-input-1" name="password" type="password" placeholder="Password"> + <label for="password"><%= translate(locale, "Password") %> :</label> + <input required class="pure-input-1" name="password" type="password" placeholder="<%= translate(locale, "Password") %>"> <% end %> <% if tfa %> - <label for="tfa"><%= translate(locale, "Google verification code:") %></label> - <input required class="pure-input-1" name="tfa" type="text" placeholder="Google verification code"> + <label for="tfa"><%= translate(locale, "Google verification code") %> :</label> + <input required class="pure-input-1" name="tfa" type="text" placeholder="<%= translate(locale, "Google verification code") %>"> <% end %> <button type="submit" class="pure-button pure-button-primary"><%= translate(locale, "Sign In") %></button> @@ -112,5 +112,5 @@ <% end %> </div> </div> - <div class="pure-u-1 pure-u-md-1-5"></div> + <div class="pure-u-1 pure-u-lg-1-5"></div> </div> diff --git a/src/invidious/views/playlist.ecr b/src/invidious/views/playlist.ecr index 98da42dc..6bd0dc9e 100644 --- a/src/invidious/views/playlist.ecr +++ b/src/invidious/views/playlist.ecr @@ -34,15 +34,15 @@ </div> <div class="pure-g h-box"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if page >= 2 %> <a href="/playlist?list=<%= playlist.id %>&page=<%= page - 1 %>"> <%= translate(locale, "Previous page") %> </a> <% end %> </div> - <div class="pure-u-1 pure-u-md-3-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-3-5"></div> + <div style="text-align:right;" class="pure-u-1 pure-u-lg-1-5"> <% if videos.size == 100 %> <a href="/playlist?list=<%= playlist.id %>&page=<%= page + 1 %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/playlists.ecr b/src/invidious/views/playlists.ecr index 3f661494..ee7918e7 100644 --- a/src/invidious/views/playlists.ecr +++ b/src/invidious/views/playlists.ecr @@ -65,7 +65,7 @@ <div class="pure-g h-box"> <div class="pure-u-1 pure-u-md-4-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div style="text-align:right;" class="pure-u-1 pure-u-lg-1-5"> <% if items.size >= 28 %> <a href="/channel/<%= ucid %>/playlists?continuation=<%= continuation %><% if sort_by != "last" %>&sort_by=<%= sort_by %><% end %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/search.ecr b/src/invidious/views/search.ecr index a0d3bb7b..4d943127 100644 --- a/src/invidious/views/search.ecr +++ b/src/invidious/views/search.ecr @@ -11,15 +11,15 @@ </div> <div class="pure-g h-box"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if page >= 2 %> <a href="/search?q=<%= HTML.escape(query.not_nil!) %>&page=<%= page - 1 %>"> <%= translate(locale, "Previous page") %> </a> <% end %> </div> - <div class="pure-u-1 pure-u-md-3-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-3-5"></div> + <div style="text-align:right;" class="pure-u-1 pure-u-lg-1-5"> <% if count >= 20 %> <a href="/search?q=<%= HTML.escape(query.not_nil!) %>&page=<%= page + 1 %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/subscriptions.ecr b/src/invidious/views/subscriptions.ecr index 744f77a0..88f0f6c4 100644 --- a/src/invidious/views/subscriptions.ecr +++ b/src/invidious/views/subscriptions.ecr @@ -74,15 +74,15 @@ function mark_watched(target) { </script> <div class="pure-g h-box"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if page >= 2 %> <a href="/feed/subscriptions?max_results=<%= max_results %>&page=<%= page - 1 %>"> <%= translate(locale, "Previous page") %> </a> <% end %> </div> - <div class="pure-u-1 pure-u-md-3-5"></div> - <div style="text-align:right;" class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-3-5"></div> + <div style="text-align:right;" class="pure-u-1 pure-u-lg-1-5"> <% if (videos.size + notifications.size) == max_results %> <a href="/feed/subscriptions?max_results=<%= max_results %>&page=<%= page + 1 %>"> <%= translate(locale, "Next page") %> diff --git a/src/invidious/views/trending.ecr b/src/invidious/views/trending.ecr index efd9999a..d6c25266 100644 --- a/src/invidious/views/trending.ecr +++ b/src/invidious/views/trending.ecr @@ -6,9 +6,10 @@ <%= rendered "components/feed_menu" %> <div class="pure-g h-box"> - <div class="pure-u-2-3"> - <form class="pure-form pure-form-aligned" action="/feed/trending" method="get"> - </form> + <div style="align-self:flex-end" class="pure-u-2-3"> + <% if plid %> + <a href="/playlist?list=<%= plid %>"><%= translate(locale, "View as playlist") %></a> + <% end %> </div> <div class="pure-u-1-3"> <div class="pure-g" style="text-align:right;"> diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr index 954b724f..8c1c66b6 100644 --- a/src/invidious/views/watch.ecr +++ b/src/invidious/views/watch.ecr @@ -40,7 +40,7 @@ </a> <% else %> <a title="<%=translate(locale, "Audio mode")%>" href="/watch?<%= env.params.query %>&listen=1"> - <i class="icon ion-ios-volume-high"></i> + <i class="icon ion-md-headset"></i> </a> <% end %> </h1> @@ -53,7 +53,7 @@ </div> <div class="pure-g"> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <div class="h-box"> <p><a href="https://www.youtube.com/watch?v=<%= video.id %>"><%= translate(locale, "Watch video on Youtube") %></a></p> @@ -122,7 +122,7 @@ </div> </div> - <div class="pure-u-1 <% if params[:related_videos] || plid %>pure-u-md-3-5<% else %>pure-u-md-4-5<% end %>"> + <div class="pure-u-1 <% if params[:related_videos] || plid %>pure-u-lg-3-5<% else %>pure-u-md-4-5<% end %>"> <div class="h-box"> <p> <a href="/channel/<%= video.ucid %>"> @@ -154,7 +154,7 @@ </div> </div> <% if params[:related_videos] || plid %> - <div class="pure-u-1 pure-u-md-1-5"> + <div class="pure-u-1 pure-u-lg-1-5"> <% if plid %> <div id="playlist" class="h-box"> </div> |
