summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/invidious.cr18
-rw-r--r--src/invidious/comments.cr8
-rw-r--r--src/invidious/helpers/utils.cr4
-rw-r--r--src/invidious/trending.cr38
-rw-r--r--src/invidious/views/channel.ecr6
-rw-r--r--src/invidious/views/components/item.ecr14
-rw-r--r--src/invidious/views/components/subscribe_widget.ecr2
-rw-r--r--src/invidious/views/history.ecr6
-rw-r--r--src/invidious/views/login.ecr28
-rw-r--r--src/invidious/views/playlist.ecr6
-rw-r--r--src/invidious/views/playlists.ecr2
-rw-r--r--src/invidious/views/search.ecr6
-rw-r--r--src/invidious/views/subscriptions.ecr6
-rw-r--r--src/invidious/views/trending.ecr7
-rw-r--r--src/invidious/views/watch.ecr8
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>