diff --git a/.ameba.yml b/.ameba.yml index 7f6e4cae..5af91f9f 100644 --- a/.ameba.yml +++ b/.ameba.yml @@ -5,20 +5,26 @@ # Exclude assigns for ECR files Lint/UselessAssign: Excluded: - - src/invidious.cr - - src/invidious/helpers/errors.cr - - src/invidious/routes/*.cr + - src/invidious.cr + - src/invidious/helpers/errors.cr + - src/invidious/routes/*.cr + - src/invidious/views/**/** + +# Exclude unused arguments for ECR files +Lint/UnusedArgument: + Excluded: + - src/invidious/views/**/** # Ignore false negative (if !db.query_one?...) Lint/UnreachableCode: Excluded: - - src/invidious/database/base.cr + - src/invidious/database/base.cr # Ignore shadowed variable `key` (it works for now, and that's # a sensitive part of the code) Lint/ShadowingOuterLocalVar: Excluded: - - src/invidious/helpers/tokens.cr + - src/invidious/helpers/tokens.cr Lint/NotNil: Enabled: false @@ -27,7 +33,6 @@ Lint/SpecFilename: Excluded: - spec/parsers_helper.cr - # # Style # @@ -44,6 +49,15 @@ Style/RedundantNext: Style/ParenthesesAroundCondition: Enabled: false +# Disable this as it's really useful for functions and variables +# that belong to a same module, struct or class, and it can be confused +# by a global function. +# This is subject to change with https://github.com/iv-org/invidious/pull/6046 +# where there will not be more global variables or functions, well, that's +# the goal. +Style/RedundantSelf: + Enabled: false + # This requires a rewrite of most data structs (and their usage) in Invidious. Naming/QueryBoolMethods: Enabled: false @@ -56,12 +70,11 @@ Naming/BlockParameterName: # Hides TODO comment warnings. # -# Call `bin/ameba --only Documentation/DocumentationAdmonition` to +# Call `bin/ameba --only Documentation/Admonition` to # list them -Documentation/DocumentationAdmonition: +Documentation/Admonition: Enabled: false - # # Metrics # diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 514462d9..6d9f5a58 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -146,7 +146,6 @@ jobs: with: path: | ./lib - ./bin key: shards-${{ hashFiles('shard.lock') }}-${{ steps.lint_step_install_crystal.outputs.crystal }} - name: Install Shards @@ -164,4 +163,4 @@ jobs: fi - name: Run Ameba linter - run: bin/ameba + uses: crystal-ameba/github-action@v1 diff --git a/shard.lock b/shard.lock index 6b3ebc6e..7aaa7470 100644 --- a/shard.lock +++ b/shard.lock @@ -2,7 +2,7 @@ version: 2.0 shards: ameba: git: https://github.com/crystal-ameba/ameba.git - version: 1.6.4 + version: 1.7.0 athena-negotiation: git: https://github.com/athena-framework/negotiation.git diff --git a/shard.yml b/shard.yml index e6536780..beb35f91 100644 --- a/shard.yml +++ b/shard.yml @@ -8,6 +8,8 @@ authors: targets: invidious: main: src/invidious.cr + ameba: + main: lib/ameba/bin/ameba.cr description: | Invidious is an alternative front-end to YouTube @@ -38,7 +40,7 @@ development_dependencies: version: ~> 0.12.4 ameba: github: crystal-ameba/ameba - version: ~> 1.6.4 + version: ~> 1.7.0 crystal: ">= 1.14.1, < 2.0.0" diff --git a/spec/http_server/handlers/static_assets_handler_spec.cr b/spec/http_server/handlers/static_assets_handler_spec.cr index 76dc7be7..268c4b2f 100644 --- a/spec/http_server/handlers/static_assets_handler_spec.cr +++ b/spec/http_server/handlers/static_assets_handler_spec.cr @@ -59,7 +59,7 @@ end # Get relative file path to a file within the static_assets_handler folder macro get_file_path(basename) - "spec/http_server/handlers/static_assets_handler/#{ {{basename}} }" + "spec/http_server/handlers/static_assets_handler/#{ {{ basename }} }" end Spectator.describe StaticAssetsHandler do diff --git a/spec/invidious/user/imports_spec.cr b/spec/invidious/user/imports_spec.cr index 762ce0d8..58b5d4aa 100644 --- a/spec/invidious/user/imports_spec.cr +++ b/spec/invidious/user/imports_spec.cr @@ -8,21 +8,21 @@ end def csv_sample return <<-CSV - Kanal-ID,Kanal-URL,Kanaltitel - UC0hHW5Y08ggq-9kbrGgWj0A,http://www.youtube.com/channel/UC0hHW5Y08ggq-9kbrGgWj0A,Matias Marolla - UC0vBXGSyV14uvJ4hECDOl0Q,http://www.youtube.com/channel/UC0vBXGSyV14uvJ4hECDOl0Q,Techquickie - UC1sELGmy5jp5fQUugmuYlXQ,http://www.youtube.com/channel/UC1sELGmy5jp5fQUugmuYlXQ,Minecraft - UC9kFnwdCRrX7oTjqKd6-tiQ,http://www.youtube.com/channel/UC9kFnwdCRrX7oTjqKd6-tiQ,LUMOX - Topic - UCBa659QWEk1AI4Tg--mrJ2A,http://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A,Tom Scott - UCGu6_XQ64rXPR6nuitMQE_A,http://www.youtube.com/channel/UCGu6_XQ64rXPR6nuitMQE_A,Callcenter Fun - UCGwu0nbY2wSkW8N-cghnLpA,http://www.youtube.com/channel/UCGwu0nbY2wSkW8N-cghnLpA,Jaiden Animations - UCQ0OvZ54pCFZwsKxbltg_tg,http://www.youtube.com/channel/UCQ0OvZ54pCFZwsKxbltg_tg,Methos - UCRE6itj4Jte4manQEu3Y7OA,http://www.youtube.com/channel/UCRE6itj4Jte4manQEu3Y7OA,Chipflake - UCRLc6zsv_d0OEBO8OOkz-DA,http://www.youtube.com/channel/UCRLc6zsv_d0OEBO8OOkz-DA,Kegy - UCSl5Uxu2LyaoAoMMGp6oTJA,http://www.youtube.com/channel/UCSl5Uxu2LyaoAoMMGp6oTJA,Atomic Shrimp - UCXuqSBlHAE6Xw-yeJA0Tunw,http://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw,Linus Tech Tips - UCZ5XnGb-3t7jCkXdawN2tkA,http://www.youtube.com/channel/UCZ5XnGb-3t7jCkXdawN2tkA,Discord - CSV + Kanal-ID,Kanal-URL,Kanaltitel + UC0hHW5Y08ggq-9kbrGgWj0A,http://www.youtube.com/channel/UC0hHW5Y08ggq-9kbrGgWj0A,Matias Marolla + UC0vBXGSyV14uvJ4hECDOl0Q,http://www.youtube.com/channel/UC0vBXGSyV14uvJ4hECDOl0Q,Techquickie + UC1sELGmy5jp5fQUugmuYlXQ,http://www.youtube.com/channel/UC1sELGmy5jp5fQUugmuYlXQ,Minecraft + UC9kFnwdCRrX7oTjqKd6-tiQ,http://www.youtube.com/channel/UC9kFnwdCRrX7oTjqKd6-tiQ,LUMOX - Topic + UCBa659QWEk1AI4Tg--mrJ2A,http://www.youtube.com/channel/UCBa659QWEk1AI4Tg--mrJ2A,Tom Scott + UCGu6_XQ64rXPR6nuitMQE_A,http://www.youtube.com/channel/UCGu6_XQ64rXPR6nuitMQE_A,Callcenter Fun + UCGwu0nbY2wSkW8N-cghnLpA,http://www.youtube.com/channel/UCGwu0nbY2wSkW8N-cghnLpA,Jaiden Animations + UCQ0OvZ54pCFZwsKxbltg_tg,http://www.youtube.com/channel/UCQ0OvZ54pCFZwsKxbltg_tg,Methos + UCRE6itj4Jte4manQEu3Y7OA,http://www.youtube.com/channel/UCRE6itj4Jte4manQEu3Y7OA,Chipflake + UCRLc6zsv_d0OEBO8OOkz-DA,http://www.youtube.com/channel/UCRLc6zsv_d0OEBO8OOkz-DA,Kegy + UCSl5Uxu2LyaoAoMMGp6oTJA,http://www.youtube.com/channel/UCSl5Uxu2LyaoAoMMGp6oTJA,Atomic Shrimp + UCXuqSBlHAE6Xw-yeJA0Tunw,http://www.youtube.com/channel/UCXuqSBlHAE6Xw-yeJA0Tunw,Linus Tech Tips + UCZ5XnGb-3t7jCkXdawN2tkA,http://www.youtube.com/channel/UCZ5XnGb-3t7jCkXdawN2tkA,Discord + CSV end Spectator.describe Invidious::User::Import do diff --git a/src/invidious.cr b/src/invidious.cr index cc65dde0..c436ad3c 100644 --- a/src/invidious.cr +++ b/src/invidious.cr @@ -123,7 +123,7 @@ Kemal.config.extra_options do |parser| parser.on("-c THREADS", "--channel-threads=THREADS", "Number of threads for refreshing channels (default: #{CONFIG.channel_threads})") do |number| begin CONFIG.channel_threads = number.to_i - rescue ex + rescue puts "THREADS must be integer" exit end @@ -131,7 +131,7 @@ Kemal.config.extra_options do |parser| parser.on("-f THREADS", "--feed-threads=THREADS", "Number of threads for refreshing feeds (default: #{CONFIG.feed_threads})") do |number| begin CONFIG.feed_threads = number.to_i - rescue ex + rescue puts "THREADS must be integer" exit end diff --git a/src/invidious/channels/channels.cr b/src/invidious/channels/channels.cr index 64f0484d..de177911 100644 --- a/src/invidious/channels/channels.cr +++ b/src/invidious/channels/channels.cr @@ -93,7 +93,7 @@ struct ChannelVideo def to_tuple {% begin %} { - {{@type.instance_vars.map(&.name).splat}} + {{ @type.instance_vars.map(&.name).splat }} } {% end %} end @@ -107,7 +107,7 @@ class ChannelRedirect < Exception end def get_batch_channels(channels) - finished_channel = Channel(String | Nil).new + finished_channel = Channel(String?).new max_threads = 10 spawn do @@ -125,7 +125,7 @@ def get_batch_channels(channels) begin get_channel(ucid) finished_channel.send(ucid) - rescue ex + rescue finished_channel.send(nil) ensure active_channel.send(nil) diff --git a/src/invidious/comments/links_util.cr b/src/invidious/comments/links_util.cr index f89b86d3..6832aeea 100644 --- a/src/invidious/comments/links_util.cr +++ b/src/invidious/comments/links_util.cr @@ -15,7 +15,7 @@ module Invidious::Comments if url.host.nil? || url.host.not_nil!.ends_with?("youtube.com") || url.host.not_nil!.ends_with?("youtu.be") if url.host.try &.ends_with? "youtu.be" - url = "/watch?v=#{url.path.lstrip('/')}#{url.query_params}" + anchor["href"] = "/watch?v=#{url.path.lstrip('/')}#{url.query_params}" else if url.path == "/redirect" params = HTTP::Params.parse(url.query.not_nil!) @@ -27,7 +27,7 @@ module Invidious::Comments elsif url.to_s == "#" begin length_seconds = decode_length_seconds(anchor.content) - rescue ex + rescue length_seconds = decode_time(anchor.content) end diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 58b77cba..94a3946c 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -59,7 +59,7 @@ struct ConfigPreferences def to_tuple {% begin %} { - {{(@type.instance_vars.map { |var| "#{var.name}: #{var.name}".id }).splat}} + {{ (@type.instance_vars.map { |var| "#{var.name}: #{var.name}".id }).splat }} } {% end %} end @@ -237,14 +237,14 @@ class Config {% for ivar in Config.instance_vars %} {% env_id = "INVIDIOUS_#{ivar.id.upcase}" %} - if ENV.has_key?({{env_id}}) - env_value = ENV.fetch({{env_id}}) + if ENV.has_key?({{ env_id }}) + env_value = ENV.fetch({{ env_id }}) success = false # Use YAML converter if specified {% ann = ivar.annotation(::YAML::Field) %} {% if ann && ann[:converter] %} - config.{{ivar.id}} = {{ann[:converter]}}.from_yaml(YAML::ParseContext.new, YAML::Nodes.parse(ENV.fetch({{env_id}})).nodes[0]) + config.{{ ivar.id }} = {{ ann[:converter] }}.from_yaml(YAML::ParseContext.new, YAML::Nodes.parse(ENV.fetch({{ env_id }})).nodes[0]) success = true # Use regular YAML parser otherwise @@ -252,10 +252,10 @@ class Config {% ivar_types = ivar.type.union? ? ivar.type.union_types : [ivar.type] %} # Sort types to avoid parsing nulls and numbers as strings {% ivar_types = ivar_types.sort_by { |ivar_type| ivar_type == Nil ? 0 : ivar_type == Int32 ? 1 : 2 } %} - {{ivar_types}}.each do |ivar_type| + {{ ivar_types }}.each do |ivar_type| if !success begin - config.{{ivar.id}} = ivar_type.from_yaml(env_value) + config.{{ ivar.id }} = ivar_type.from_yaml(env_value) success = true rescue # nop @@ -266,14 +266,14 @@ class Config # Exit on fail if !success - puts %(Config.{{ivar.id}} failed to parse #{env_value} as {{ivar.type}}) + puts %(Config.{{ ivar.id }} failed to parse #{env_value} as {{ ivar.type }}) exit(1) end end # Warn when any config attribute is set to "CHANGE_ME!!" - if config.{{ivar.id}} == "CHANGE_ME!!" - puts "Config: The value of '#{ {{ivar.stringify}} }' needs to be changed!!" + if config.{{ ivar.id }} == "CHANGE_ME!!" + puts "Config: The value of '#{ {{ ivar.stringify }} }' needs to be changed!!" exit(1) end {% end %} diff --git a/src/invidious/database/annotations.cr b/src/invidious/database/annotations.cr index 03749473..f1659509 100644 --- a/src/invidious/database/annotations.cr +++ b/src/invidious/database/annotations.cr @@ -8,7 +8,7 @@ module Invidious::Database::Annotations INSERT INTO annotations VALUES ($1, $2) ON CONFLICT DO NOTHING - SQL + SQL PG_DB.exec(request, id, annotations) end @@ -17,7 +17,7 @@ module Invidious::Database::Annotations request = <<-SQL SELECT * FROM annotations WHERE id = $1 - SQL + SQL return PG_DB.query_one?(request, id, as: Annotation) end diff --git a/src/invidious/database/base.cr b/src/invidious/database/base.cr index 0fb1b6af..a9757e9a 100644 --- a/src/invidious/database/base.cr +++ b/src/invidious/database/base.cr @@ -45,7 +45,7 @@ module Invidious::Database # Create table if it doesn't exist begin PG_DB.exec("SELECT * FROM #{table_name} LIMIT 0") - rescue ex + rescue LOGGER.info("check_table: check_table: CREATE TABLE #{table_name}") PG_DB.using_connection do |conn| diff --git a/src/invidious/database/channels.cr b/src/invidious/database/channels.cr index df44e485..3e7f480c 100644 --- a/src/invidious/database/channels.cr +++ b/src/invidious/database/channels.cr @@ -16,13 +16,13 @@ module Invidious::Database::Channels request = <<-SQL INSERT INTO channels VALUES (#{arg_array(channel_array)}) - SQL + SQL if update_on_conflict request += <<-SQL ON CONFLICT (id) DO UPDATE SET author = $2, updated = $3 - SQL + SQL end PG_DB.exec(request, args: channel_array) @@ -37,7 +37,7 @@ module Invidious::Database::Channels UPDATE channels SET updated = now(), author = $1, deleted = false WHERE id = $2 - SQL + SQL PG_DB.exec(request, author, id) end @@ -47,7 +47,7 @@ module Invidious::Database::Channels UPDATE channels SET subscribed = now() WHERE id = $1 - SQL + SQL PG_DB.exec(request, id) end @@ -57,7 +57,7 @@ module Invidious::Database::Channels UPDATE channels SET updated = now(), deleted = true WHERE id = $1 - SQL + SQL PG_DB.exec(request, id) end @@ -70,7 +70,7 @@ module Invidious::Database::Channels request = <<-SQL SELECT * FROM channels WHERE id = $1 - SQL + SQL return PG_DB.query_one?(request, id, as: InvidiousChannel) end @@ -81,7 +81,7 @@ module Invidious::Database::Channels request = <<-SQL SELECT * FROM channels WHERE id = ANY($1) - SQL + SQL return PG_DB.query_all(request, ids, as: InvidiousChannel) end @@ -112,7 +112,7 @@ module Invidious::Database::ChannelVideos SET title = $2, published = $3, updated = $4, ucid = $5, author = $6, length_seconds = $7, live_now = $8, #{last_items} RETURNING (xmax=0) AS was_insert - SQL + SQL return PG_DB.query_one(request, *video.to_tuple, as: Bool) end @@ -128,7 +128,7 @@ module Invidious::Database::ChannelVideos SELECT * FROM channel_videos WHERE id = ANY($1) ORDER BY published DESC - SQL + SQL return PG_DB.query_all(request, ids, as: ChannelVideo) end @@ -139,7 +139,7 @@ module Invidious::Database::ChannelVideos WHERE ucid = $1 AND published > $2 ORDER BY published DESC LIMIT 15 - SQL + SQL return PG_DB.query_all(request, ucid, since, as: ChannelVideo) end @@ -151,7 +151,7 @@ module Invidious::Database::ChannelVideos WHERE ucid IN (SELECT channel FROM (SELECT UNNEST(subscriptions) AS channel FROM users) AS d GROUP BY channel ORDER BY COUNT(channel) DESC LIMIT 40) ORDER BY ucid, published DESC - SQL + SQL PG_DB.query_all(request, as: ChannelVideo) end diff --git a/src/invidious/database/migrations/0001_create_channels_table.cr b/src/invidious/database/migrations/0001_create_channels_table.cr index a1362bcf..df7e31a1 100644 --- a/src/invidious/database/migrations/0001_create_channels_table.cr +++ b/src/invidious/database/migrations/0001_create_channels_table.cr @@ -4,27 +4,27 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.channels - ( - id text NOT NULL, - author text, - updated timestamp with time zone, - deleted boolean, - subscribed timestamp with time zone, - CONSTRAINT channels_id_key UNIQUE (id) - ); - SQL + CREATE TABLE IF NOT EXISTS public.channels + ( + id text NOT NULL, + author text, + updated timestamp with time zone, + deleted boolean, + subscribed timestamp with time zone, + CONSTRAINT channels_id_key UNIQUE (id) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.channels TO current_user; - SQL + GRANT ALL ON TABLE public.channels TO current_user; + SQL conn.exec <<-SQL - CREATE INDEX IF NOT EXISTS channels_id_idx - ON public.channels - USING btree - (id COLLATE pg_catalog."default"); - SQL + CREATE INDEX IF NOT EXISTS channels_id_idx + ON public.channels + USING btree + (id COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0002_create_videos_table.cr b/src/invidious/database/migrations/0002_create_videos_table.cr index c2ac84f8..1d0f5afb 100644 --- a/src/invidious/database/migrations/0002_create_videos_table.cr +++ b/src/invidious/database/migrations/0002_create_videos_table.cr @@ -4,25 +4,25 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE UNLOGGED TABLE IF NOT EXISTS public.videos - ( - id text NOT NULL, - info text, - updated timestamp with time zone, - CONSTRAINT videos_pkey PRIMARY KEY (id) - ); - SQL + CREATE UNLOGGED TABLE IF NOT EXISTS public.videos + ( + id text NOT NULL, + info text, + updated timestamp with time zone, + CONSTRAINT videos_pkey PRIMARY KEY (id) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.videos TO current_user; - SQL + GRANT ALL ON TABLE public.videos TO current_user; + SQL conn.exec <<-SQL - CREATE UNIQUE INDEX IF NOT EXISTS id_idx - ON public.videos - USING btree - (id COLLATE pg_catalog."default"); - SQL + CREATE UNIQUE INDEX IF NOT EXISTS id_idx + ON public.videos + USING btree + (id COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0003_create_channel_videos_table.cr b/src/invidious/database/migrations/0003_create_channel_videos_table.cr index c9b62e4c..e4023fef 100644 --- a/src/invidious/database/migrations/0003_create_channel_videos_table.cr +++ b/src/invidious/database/migrations/0003_create_channel_videos_table.cr @@ -4,32 +4,32 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.channel_videos - ( - id text NOT NULL, - title text, - published timestamp with time zone, - updated timestamp with time zone, - ucid text, - author text, - length_seconds integer, - live_now boolean, - premiere_timestamp timestamp with time zone, - views bigint, - CONSTRAINT channel_videos_id_key UNIQUE (id) - ); - SQL + CREATE TABLE IF NOT EXISTS public.channel_videos + ( + id text NOT NULL, + title text, + published timestamp with time zone, + updated timestamp with time zone, + ucid text, + author text, + length_seconds integer, + live_now boolean, + premiere_timestamp timestamp with time zone, + views bigint, + CONSTRAINT channel_videos_id_key UNIQUE (id) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.channel_videos TO current_user; - SQL + GRANT ALL ON TABLE public.channel_videos TO current_user; + SQL conn.exec <<-SQL - CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx - ON public.channel_videos - USING btree - (ucid COLLATE pg_catalog."default"); - SQL + CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx + ON public.channel_videos + USING btree + (ucid COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0004_create_users_table.cr b/src/invidious/database/migrations/0004_create_users_table.cr index a13ba15f..3e561bc0 100644 --- a/src/invidious/database/migrations/0004_create_users_table.cr +++ b/src/invidious/database/migrations/0004_create_users_table.cr @@ -4,31 +4,31 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.users - ( - updated timestamp with time zone, - notifications text[], - subscriptions text[], - email text NOT NULL, - preferences text, - password text, - token text, - watched text[], - feed_needs_update boolean, - CONSTRAINT users_email_key UNIQUE (email) - ); - SQL + CREATE TABLE IF NOT EXISTS public.users + ( + updated timestamp with time zone, + notifications text[], + subscriptions text[], + email text NOT NULL, + preferences text, + password text, + token text, + watched text[], + feed_needs_update boolean, + CONSTRAINT users_email_key UNIQUE (email) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.users TO current_user; - SQL + GRANT ALL ON TABLE public.users TO current_user; + SQL conn.exec <<-SQL - CREATE UNIQUE INDEX IF NOT EXISTS email_unique_idx - ON public.users - USING btree - (lower(email) COLLATE pg_catalog."default"); - SQL + CREATE UNIQUE INDEX IF NOT EXISTS email_unique_idx + ON public.users + USING btree + (lower(email) COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0005_create_session_ids_table.cr b/src/invidious/database/migrations/0005_create_session_ids_table.cr index 13c2228d..e760ad16 100644 --- a/src/invidious/database/migrations/0005_create_session_ids_table.cr +++ b/src/invidious/database/migrations/0005_create_session_ids_table.cr @@ -4,25 +4,25 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.session_ids - ( - id text NOT NULL, - email text, - issued timestamp with time zone, - CONSTRAINT session_ids_pkey PRIMARY KEY (id) - ); - SQL + CREATE TABLE IF NOT EXISTS public.session_ids + ( + id text NOT NULL, + email text, + issued timestamp with time zone, + CONSTRAINT session_ids_pkey PRIMARY KEY (id) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.session_ids TO current_user; - SQL + GRANT ALL ON TABLE public.session_ids TO current_user; + SQL conn.exec <<-SQL - CREATE INDEX IF NOT EXISTS session_ids_id_idx - ON public.session_ids - USING btree - (id COLLATE pg_catalog."default"); - SQL + CREATE INDEX IF NOT EXISTS session_ids_id_idx + ON public.session_ids + USING btree + (id COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0006_create_nonces_table.cr b/src/invidious/database/migrations/0006_create_nonces_table.cr index cf1229e1..c2ae7a87 100644 --- a/src/invidious/database/migrations/0006_create_nonces_table.cr +++ b/src/invidious/database/migrations/0006_create_nonces_table.cr @@ -4,24 +4,24 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.nonces - ( - nonce text, - expire timestamp with time zone, - CONSTRAINT nonces_id_key UNIQUE (nonce) - ); - SQL + CREATE TABLE IF NOT EXISTS public.nonces + ( + nonce text, + expire timestamp with time zone, + CONSTRAINT nonces_id_key UNIQUE (nonce) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.nonces TO current_user; - SQL + GRANT ALL ON TABLE public.nonces TO current_user; + SQL conn.exec <<-SQL - CREATE INDEX IF NOT EXISTS nonces_nonce_idx - ON public.nonces - USING btree - (nonce COLLATE pg_catalog."default"); - SQL + CREATE INDEX IF NOT EXISTS nonces_nonce_idx + ON public.nonces + USING btree + (nonce COLLATE pg_catalog."default"); + SQL end end end diff --git a/src/invidious/database/migrations/0007_create_annotations_table.cr b/src/invidious/database/migrations/0007_create_annotations_table.cr index dcecbc3b..518e2886 100644 --- a/src/invidious/database/migrations/0007_create_annotations_table.cr +++ b/src/invidious/database/migrations/0007_create_annotations_table.cr @@ -4,17 +4,17 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.annotations - ( - id text NOT NULL, - annotations xml, - CONSTRAINT annotations_id_key UNIQUE (id) - ); - SQL + CREATE TABLE IF NOT EXISTS public.annotations + ( + id text NOT NULL, + annotations xml, + CONSTRAINT annotations_id_key UNIQUE (id) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.annotations TO current_user; - SQL + GRANT ALL ON TABLE public.annotations TO current_user; + SQL end end end diff --git a/src/invidious/database/migrations/0008_create_playlists_table.cr b/src/invidious/database/migrations/0008_create_playlists_table.cr index 6aa16e1a..63901f61 100644 --- a/src/invidious/database/migrations/0008_create_playlists_table.cr +++ b/src/invidious/database/migrations/0008_create_playlists_table.cr @@ -5,33 +5,33 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) if !privacy_type_exists?(conn) conn.exec <<-SQL - CREATE TYPE public.privacy AS ENUM - ( - 'Public', - 'Unlisted', - 'Private' - ); - SQL + CREATE TYPE public.privacy AS ENUM + ( + 'Public', + 'Unlisted', + 'Private' + ); + SQL end conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.playlists - ( - title text, - id text primary key, - author text, - description text, - video_count integer, - created timestamptz, - updated timestamptz, - privacy privacy, - index int8[] - ); - SQL + CREATE TABLE IF NOT EXISTS public.playlists + ( + title text, + id text primary key, + author text, + description text, + video_count integer, + created timestamptz, + updated timestamptz, + privacy privacy, + index int8[] + ); + SQL conn.exec <<-SQL - GRANT ALL ON public.playlists TO current_user; - SQL + GRANT ALL ON public.playlists TO current_user; + SQL end private def privacy_type_exists?(conn : DB::Connection) : Bool @@ -42,7 +42,7 @@ module Invidious::Database::Migrations WHERE pg_namespace.nspname = 'public' AND pg_type.typname = 'privacy' LIMIT 1; - SQL + SQL !conn.query_one?(request, as: Int32).nil? end diff --git a/src/invidious/database/migrations/0009_create_playlist_videos_table.cr b/src/invidious/database/migrations/0009_create_playlist_videos_table.cr index 84938b9b..82699b34 100644 --- a/src/invidious/database/migrations/0009_create_playlist_videos_table.cr +++ b/src/invidious/database/migrations/0009_create_playlist_videos_table.cr @@ -4,24 +4,24 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - CREATE TABLE IF NOT EXISTS public.playlist_videos - ( - title text, - id text, - author text, - ucid text, - length_seconds integer, - published timestamptz, - plid text references playlists(id), - index int8, - live_now boolean, - PRIMARY KEY (index,plid) - ); - SQL + CREATE TABLE IF NOT EXISTS public.playlist_videos + ( + title text, + id text, + author text, + ucid text, + length_seconds integer, + published timestamptz, + plid text references playlists(id), + index int8, + live_now boolean, + PRIMARY KEY (index,plid) + ); + SQL conn.exec <<-SQL - GRANT ALL ON TABLE public.playlist_videos TO current_user; - SQL + GRANT ALL ON TABLE public.playlist_videos TO current_user; + SQL end end end diff --git a/src/invidious/database/migrations/0010_make_videos_unlogged.cr b/src/invidious/database/migrations/0010_make_videos_unlogged.cr index f5d19683..37f1da23 100644 --- a/src/invidious/database/migrations/0010_make_videos_unlogged.cr +++ b/src/invidious/database/migrations/0010_make_videos_unlogged.cr @@ -4,8 +4,8 @@ module Invidious::Database::Migrations def up(conn : DB::Connection) conn.exec <<-SQL - ALTER TABLE public.videos SET UNLOGGED; - SQL + ALTER TABLE public.videos SET UNLOGGED; + SQL end end end diff --git a/src/invidious/database/migrator.cr b/src/invidious/database/migrator.cr index 660c3203..200cf421 100644 --- a/src/invidious/database/migrator.cr +++ b/src/invidious/database/migrator.cr @@ -44,6 +44,6 @@ class Invidious::Database::Migrator id bigserial PRIMARY KEY, version bigint NOT NULL ) - SQL + SQL end end diff --git a/src/invidious/database/nonces.cr b/src/invidious/database/nonces.cr index b87c81ec..55c8d856 100644 --- a/src/invidious/database/nonces.cr +++ b/src/invidious/database/nonces.cr @@ -12,7 +12,7 @@ module Invidious::Database::Nonces INSERT INTO nonces VALUES ($1, $2) ON CONFLICT DO NOTHING - SQL + SQL PG_DB.exec(request, nonce, expire) end @@ -21,7 +21,7 @@ module Invidious::Database::Nonces request = <<-SQL DELETE FROM nonces * WHERE expire < now() - SQL + SQL PG_DB.exec(request) end @@ -35,7 +35,7 @@ module Invidious::Database::Nonces UPDATE nonces SET expire = $1 WHERE nonce = $2 - SQL + SQL PG_DB.exec(request, Time.utc(1990, 1, 1), nonce) end @@ -48,7 +48,7 @@ module Invidious::Database::Nonces request = <<-SQL SELECT * FROM nonces WHERE nonce = $1 - SQL + SQL return PG_DB.query_one?(request, nonce, as: {String, Time}) end diff --git a/src/invidious/database/playlists.cr b/src/invidious/database/playlists.cr index 4db6b11d..ee8ab88c 100644 --- a/src/invidious/database/playlists.cr +++ b/src/invidious/database/playlists.cr @@ -16,7 +16,7 @@ module Invidious::Database::Playlists request = <<-SQL INSERT INTO playlists VALUES (#{arg_array(playlist_array)}) - SQL + SQL PG_DB.exec(request, args: playlist_array) end @@ -27,7 +27,7 @@ module Invidious::Database::Playlists request = <<-SQL DELETE FROM playlists * WHERE id = $1 - SQL + SQL PG_DB.exec(request, id) end @@ -41,7 +41,7 @@ module Invidious::Database::Playlists UPDATE playlists SET title = $1, privacy = $2, description = $3, updated = $4 WHERE id = $5 - SQL + SQL PG_DB.exec(request, title, privacy, description, updated, id) end @@ -51,7 +51,7 @@ module Invidious::Database::Playlists UPDATE playlists SET description = $1 WHERE id = $2 - SQL + SQL PG_DB.exec(request, description, id) end @@ -61,7 +61,7 @@ module Invidious::Database::Playlists UPDATE playlists SET subscribed = now() WHERE id = $1 - SQL + SQL PG_DB.exec(request, id) end @@ -73,7 +73,7 @@ module Invidious::Database::Playlists video_count = cardinality(index) + 1, updated = now() WHERE id = $2 - SQL + SQL PG_DB.exec(request, index, id) end @@ -85,7 +85,7 @@ module Invidious::Database::Playlists video_count = cardinality(index) - 1, updated = now() WHERE id = $2 - SQL + SQL PG_DB.exec(request, index, id) end @@ -98,7 +98,7 @@ module Invidious::Database::Playlists request = <<-SQL SELECT * FROM playlists WHERE id = $1 - SQL + SQL return PG_DB.query_one?(request, id, as: InvidiousPlaylist) end @@ -107,7 +107,7 @@ module Invidious::Database::Playlists request = <<-SQL SELECT * FROM playlists WHERE author = $1 - SQL + SQL return PG_DB.query_all(request, author, as: InvidiousPlaylist) end @@ -121,7 +121,7 @@ module Invidious::Database::Playlists SELECT * FROM playlists WHERE author = $1 AND id LIKE 'IV%' ORDER BY created - SQL + SQL PG_DB.query_all(request, email, as: InvidiousPlaylist) end @@ -131,7 +131,7 @@ module Invidious::Database::Playlists SELECT * FROM playlists WHERE author = $1 AND id NOT LIKE 'IV%' ORDER BY created - SQL + SQL PG_DB.query_all(request, email, as: InvidiousPlaylist) end @@ -141,7 +141,7 @@ module Invidious::Database::Playlists SELECT id,title FROM playlists WHERE author = $1 AND id LIKE 'IV%' ORDER BY title - SQL + SQL PG_DB.query_all(request, email, as: {String, String}) end @@ -155,7 +155,7 @@ module Invidious::Database::Playlists request = <<-SQL SELECT id FROM playlists WHERE id = $1 - SQL + SQL return PG_DB.query_one?(request, id, as: String).nil? end @@ -165,7 +165,7 @@ module Invidious::Database::Playlists request = <<-SQL SELECT count(*) FROM playlists WHERE author = $1 - SQL + SQL return PG_DB.query_one?(request, author, as: Int64) || 0_i64 end @@ -189,7 +189,7 @@ module Invidious::Database::PlaylistVideos request = <<-SQL INSERT INTO playlist_videos VALUES (#{arg_array(video_array)}) - SQL + SQL PG_DB.exec(request, args: video_array) end @@ -198,7 +198,7 @@ module Invidious::Database::PlaylistVideos request = <<-SQL DELETE FROM playlist_videos * WHERE index = $1 AND plid = $2 - SQL + SQL PG_DB.exec(request, index, plid) end @@ -207,7 +207,7 @@ module Invidious::Database::PlaylistVideos request = <<-SQL DELETE FROM playlist_videos * WHERE plid = $1 - SQL + SQL PG_DB.exec(request, plid) end @@ -223,7 +223,7 @@ module Invidious::Database::PlaylistVideos ORDER BY array_position($2, index) LIMIT $3 OFFSET $4 - SQL + SQL return PG_DB.query_all(request, plid, index, limit, offset, as: PlaylistVideo) end @@ -233,7 +233,7 @@ module Invidious::Database::PlaylistVideos SELECT index FROM playlist_videos WHERE plid = $1 AND id = $2 LIMIT 1 - SQL + SQL return PG_DB.query_one?(request, plid, vid, as: Int64) end @@ -244,7 +244,7 @@ module Invidious::Database::PlaylistVideos WHERE plid = $1 ORDER BY array_position($2, index) LIMIT 1 - SQL + SQL return PG_DB.query_one?(request, plid, index, as: String) end @@ -255,7 +255,7 @@ module Invidious::Database::PlaylistVideos WHERE plid = $1 ORDER BY array_position($2, index) LIMIT $3 - SQL + SQL return PG_DB.query_all(request, plid, index, limit, as: String) end diff --git a/src/invidious/database/sessions.cr b/src/invidious/database/sessions.cr index 96587082..5537f087 100644 --- a/src/invidious/database/sessions.cr +++ b/src/invidious/database/sessions.cr @@ -11,7 +11,7 @@ module Invidious::Database::SessionIDs request = <<-SQL INSERT INTO session_ids VALUES ($1, $2, now()) - SQL + SQL request += " ON CONFLICT (id) DO NOTHING" if handle_conflicts @@ -26,7 +26,7 @@ module Invidious::Database::SessionIDs request = <<-SQL DELETE FROM session_ids * WHERE id = $1 - SQL + SQL PG_DB.exec(request, sid) end @@ -35,7 +35,7 @@ module Invidious::Database::SessionIDs request = <<-SQL DELETE FROM session_ids * WHERE email = $1 - SQL + SQL PG_DB.exec(request, email) end @@ -44,7 +44,7 @@ module Invidious::Database::SessionIDs request = <<-SQL DELETE FROM session_ids * WHERE id = $1 AND email = $2 - SQL + SQL PG_DB.exec(request, sid, email) end @@ -57,7 +57,7 @@ module Invidious::Database::SessionIDs request = <<-SQL SELECT email FROM session_ids WHERE id = $1 - SQL + SQL PG_DB.query_one?(request, sid, as: String) end @@ -67,7 +67,7 @@ module Invidious::Database::SessionIDs SELECT id, issued FROM session_ids WHERE email = $1 ORDER BY issued DESC - SQL + SQL PG_DB.query_all(request, email, as: {session: String, issued: Time}) end diff --git a/src/invidious/database/statistics.cr b/src/invidious/database/statistics.cr index 9e4963fd..cf2a138e 100644 --- a/src/invidious/database/statistics.cr +++ b/src/invidious/database/statistics.cr @@ -10,7 +10,7 @@ module Invidious::Database::Statistics def count_users_total : Int64 request = <<-SQL SELECT count(*) FROM users - SQL + SQL PG_DB.query_one(request, as: Int64) end @@ -19,7 +19,7 @@ module Invidious::Database::Statistics request = <<-SQL SELECT count(*) FROM users WHERE CURRENT_TIMESTAMP - updated < '6 months' - SQL + SQL PG_DB.query_one(request, as: Int64) end @@ -28,7 +28,7 @@ module Invidious::Database::Statistics request = <<-SQL SELECT count(*) FROM users WHERE CURRENT_TIMESTAMP - updated < '1 month' - SQL + SQL PG_DB.query_one(request, as: Int64) end @@ -42,7 +42,7 @@ module Invidious::Database::Statistics SELECT updated FROM channels ORDER BY updated DESC LIMIT 1 - SQL + SQL PG_DB.query_one?(request, as: Time) end diff --git a/src/invidious/database/users.cr b/src/invidious/database/users.cr index 4a3056ea..9b297930 100644 --- a/src/invidious/database/users.cr +++ b/src/invidious/database/users.cr @@ -14,13 +14,13 @@ module Invidious::Database::Users request = <<-SQL INSERT INTO users VALUES (#{arg_array(user_array)}) - SQL + SQL if update_on_conflict request += <<-SQL ON CONFLICT (email) DO UPDATE SET updated = $1, subscriptions = $3 - SQL + SQL end PG_DB.exec(request, args: user_array) @@ -30,7 +30,7 @@ module Invidious::Database::Users request = <<-SQL DELETE FROM users * WHERE email = $1 - SQL + SQL PG_DB.exec(request, user.email) end @@ -44,7 +44,7 @@ module Invidious::Database::Users UPDATE users SET watched = $1 WHERE email = $2 - SQL + SQL PG_DB.exec(request, user.watched, user.email) end @@ -54,7 +54,7 @@ module Invidious::Database::Users UPDATE users SET watched = array_append(array_remove(watched, $1), $1) WHERE email = $2 - SQL + SQL PG_DB.exec(request, vid, user.email) end @@ -64,7 +64,7 @@ module Invidious::Database::Users UPDATE users SET watched = array_remove(watched, $1) WHERE email = $2 - SQL + SQL PG_DB.exec(request, vid, user.email) end @@ -74,7 +74,7 @@ module Invidious::Database::Users UPDATE users SET watched = '{}' WHERE email = $1 - SQL + SQL PG_DB.exec(request, user.email) end @@ -88,7 +88,7 @@ module Invidious::Database::Users UPDATE users SET feed_needs_update = true, subscriptions = $1 WHERE email = $2 - SQL + SQL PG_DB.exec(request, user.subscriptions, user.email) end @@ -99,7 +99,7 @@ module Invidious::Database::Users SET feed_needs_update = true, subscriptions = array_append(subscriptions,$1) WHERE email = $2 - SQL + SQL PG_DB.exec(request, ucid, user.email) end @@ -110,7 +110,7 @@ module Invidious::Database::Users SET feed_needs_update = true, subscriptions = array_remove(subscriptions, $1) WHERE email = $2 - SQL + SQL PG_DB.exec(request, ucid, user.email) end @@ -125,7 +125,7 @@ module Invidious::Database::Users SET notifications = array_cat(notifications, $1), feed_needs_update = true WHERE $2 = ANY(subscriptions) - SQL + SQL PG_DB.exec(request, video_ids, channel_id) end @@ -135,7 +135,7 @@ module Invidious::Database::Users UPDATE users SET notifications = array_remove(notifications, $1) WHERE email = $2 - SQL + SQL PG_DB.exec(request, vid, user.email) end @@ -145,7 +145,7 @@ module Invidious::Database::Users UPDATE users SET notifications = '{}', updated = now() WHERE email = $1 - SQL + SQL PG_DB.exec(request, user.email) end @@ -159,7 +159,7 @@ module Invidious::Database::Users UPDATE users SET feed_needs_update = true WHERE $1 = ANY(subscriptions) - SQL + SQL PG_DB.exec(request, channel_id) end @@ -169,7 +169,7 @@ module Invidious::Database::Users UPDATE users SET preferences = $1 WHERE email = $2 - SQL + SQL PG_DB.exec(request, user.preferences.to_json, user.email) end @@ -179,7 +179,7 @@ module Invidious::Database::Users UPDATE users SET password = $1 WHERE email = $2 - SQL + SQL PG_DB.exec(request, pass, user.email) end @@ -192,7 +192,7 @@ module Invidious::Database::Users request = <<-SQL SELECT * FROM users WHERE email = $1 - SQL + SQL return PG_DB.query_one?(request, email, as: User) end @@ -202,7 +202,7 @@ module Invidious::Database::Users request = <<-SQL SELECT * FROM users WHERE email = $1 - SQL + SQL return PG_DB.query_one(request, email, as: User) end @@ -211,7 +211,7 @@ module Invidious::Database::Users request = <<-SQL SELECT * FROM users WHERE token = $1 - SQL + SQL return PG_DB.query_one?(request, token, as: User) end @@ -221,7 +221,7 @@ module Invidious::Database::Users SELECT notifications FROM users WHERE email = $1 - SQL + SQL return PG_DB.query_one(request, user.email, as: Array(String)) end diff --git a/src/invidious/database/videos.cr b/src/invidious/database/videos.cr index 695f5b33..40bafaf1 100644 --- a/src/invidious/database/videos.cr +++ b/src/invidious/database/videos.cr @@ -8,7 +8,7 @@ module Invidious::Database::Videos INSERT INTO videos VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING - SQL + SQL PG_DB.exec(request, video.id, video.info.to_json, video.updated) end @@ -17,7 +17,7 @@ module Invidious::Database::Videos request = <<-SQL DELETE FROM videos * WHERE id = $1 - SQL + SQL PG_DB.exec(request, id) end @@ -26,7 +26,7 @@ module Invidious::Database::Videos request = <<-SQL DELETE FROM videos * WHERE updated < (now() - interval '6 hours') - SQL + SQL PG_DB.exec(request) end @@ -36,7 +36,7 @@ module Invidious::Database::Videos UPDATE videos SET (id, info, updated) = ($1, $2, $3) WHERE id = $1 - SQL + SQL PG_DB.exec(request, video.id, video.info.to_json, video.updated) end @@ -45,7 +45,7 @@ module Invidious::Database::Videos request = <<-SQL SELECT * FROM videos WHERE id = $1 - SQL + SQL return PG_DB.query_one?(request, id, as: Video) end diff --git a/src/invidious/frontend/comments_reddit.cr b/src/invidious/frontend/comments_reddit.cr index 74d9d8d8..6ecca531 100644 --- a/src/invidious/frontend/comments_reddit.cr +++ b/src/invidious/frontend/comments_reddit.cr @@ -16,33 +16,33 @@ module Invidious::Frontend::Comments if child.depth > 0 html << <<-END_HTML -
-
-
-
- END_HTML +
+
+
+
+ END_HTML else html << <<-END_HTML -
-
- END_HTML +
+
+ END_HTML end html << <<-END_HTML -

- [ − ] - #{child.author} - #{I18n.translate_count(locale, "comments_points_count", child.score, I18n::NumberFormatting::Separator)} - #{I18n.translate(locale, "`x` ago", recode_date(child.created_utc, locale))} - #{I18n.translate(locale, "permalink")} -

-
- #{body_html} - #{replies_html} -
-
-
- END_HTML +

+ [ − ] + #{child.author} + #{I18n.translate_count(locale, "comments_points_count", child.score, I18n::NumberFormatting::Separator)} + #{I18n.translate(locale, "`x` ago", recode_date(child.created_utc, locale))} + #{I18n.translate(locale, "permalink")} +

+
+ #{body_html} + #{replies_html} +
+
+
+ END_HTML end end end diff --git a/src/invidious/frontend/comments_youtube.cr b/src/invidious/frontend/comments_youtube.cr index 809f0789..63fafa2d 100644 --- a/src/invidious/frontend/comments_youtube.cr +++ b/src/invidious/frontend/comments_youtube.cr @@ -13,16 +13,16 @@ module Invidious::Frontend::Comments ) replies_html = <<-END_HTML -
-
- - END_HTML + END_HTML elsif comments["authorId"]? && !comments["singlePost"]? # for posts we should display a link to the post replies_count_text = I18n.translate_count(locale, @@ -32,15 +32,15 @@ module Invidious::Frontend::Comments ) replies_html = <<-END_HTML -
-
- - END_HTML + END_HTML end if !thin_mode @@ -70,18 +70,18 @@ module Invidious::Frontend::Comments end end html << <<-END_HTML -
-
- -
-
-

- - #{author_name} - - #{sponsor_icon} -

#{child["contentHtml"]}

- END_HTML +
+
+ +
+
+

+ + #{author_name} + + #{sponsor_icon} +

#{child["contentHtml"]}

+ END_HTML if child["attachment"]? attachment = child["attachment"] @@ -91,25 +91,25 @@ module Invidious::Frontend::Comments attachment = attachment["imageThumbnails"][1] html << <<-END_HTML -
-
- +
+
+ +
-
- END_HTML + END_HTML when "video" if attachment["error"]? html << <<-END_HTML -
-

#{attachment["error"]}

-
- END_HTML +
+

#{attachment["error"]}

+
+ END_HTML else html << <<-END_HTML -
- -
- END_HTML +
+ +
+ END_HTML end when "multiImage" html << <<-END_HTML @@ -137,35 +137,34 @@ module Invidious::Frontend::Comments END_HTML end html << <<-END_HTML -
-
- - END_HTML - else nil # Ignore +
+
+ + END_HTML end end html << <<-END_HTML -

- #{I18n.translate(locale, "`x` ago", recode_date(Time.unix(child["published"].as_i64), locale))} #{child["isEdited"] == true ? I18n.translate(locale, "(edited)") : ""} - | - END_HTML +

+ #{I18n.translate(locale, "`x` ago", recode_date(Time.unix(child["published"].as_i64), locale))} #{child["isEdited"] == true ? I18n.translate(locale, "(edited)") : ""} + | + END_HTML if comments["videoId"]? html << <<-END_HTML [YT] | - END_HTML + END_HTML elsif comments["authorId"]? html << <<-END_HTML [YT] | - END_HTML + END_HTML end html << <<-END_HTML #{number_with_separator(child["likeCount"])} - END_HTML + END_HTML if child["creatorHeart"]? if !thin_mode @@ -184,28 +183,28 @@ module Invidious::Frontend::Comments - END_HTML + END_HTML end html << <<-END_HTML -

- #{replies_html} +

+ #{replies_html} +
-
- END_HTML + END_HTML end if comments["continuation"]? html << <<-END_HTML -
- - END_HTML + END_HTML end end end diff --git a/src/invidious/frontend/search_filters.cr b/src/invidious/frontend/search_filters.cr index f470470f..b50d7fcc 100644 --- a/src/invidious/frontend/search_filters.cr +++ b/src/invidious/frontend/search_filters.cr @@ -41,11 +41,11 @@ module Invidious::Frontend::SearchFilters str << "\t\t\t\t
\n" str << "\t\t\t\t\t
" - str << I18n.translate(locale, "search_filters_{{name}}_label") + str << I18n.translate(locale, "search_filters_{{ name }}_label") str << "
\n" str << "\t\t\t\t\t
\n" - make_{{name}}_filter_options(str, filters.{{name}}, locale) + make_{{ name }}_filter_options(str, filters.{{ name }}, locale) str << "\t\t\t\t\t
" str << "\t\t\t\t
\n" @@ -57,12 +57,12 @@ module Invidious::Frontend::SearchFilters {% date = value.underscore %} str << "\t\t\t\t\t\t
" - str << "' - str << "
\n" {% end %} end @@ -73,12 +73,12 @@ module Invidious::Frontend::SearchFilters {% type = value.underscore %} str << "\t\t\t\t\t\t
" - str << "' - str << "
\n" {% end %} end @@ -89,12 +89,12 @@ module Invidious::Frontend::SearchFilters {% duration = value.underscore %} str << "\t\t\t\t\t\t
" - str << "' - str << "
\n" {% end %} end @@ -106,12 +106,12 @@ module Invidious::Frontend::SearchFilters {% feature = value.underscore %} str << "\t\t\t\t\t\t
" - str << "' - str << "
\n" {% end %} {% end %} @@ -123,12 +123,12 @@ module Invidious::Frontend::SearchFilters {% sort = value.underscore %} str << "\t\t\t\t\t\t
" - str << "' - str << "
\n" {% end %} end diff --git a/src/invidious/helpers/crystal_class_overrides.cr b/src/invidious/helpers/crystal_class_overrides.cr index 6fa89395..5e6d9cec 100644 --- a/src/invidious/helpers/crystal_class_overrides.cr +++ b/src/invidious/helpers/crystal_class_overrides.cr @@ -68,7 +68,7 @@ class HTTP::Server::Response class Output private def unbuffered_flush @io.flush - rescue ex : IO::Error + rescue IO::Error unbuffered_close end end diff --git a/src/invidious/helpers/errors.cr b/src/invidious/helpers/errors.cr index cee6eb2c..c24cb504 100644 --- a/src/invidious/helpers/errors.cr +++ b/src/invidious/helpers/errors.cr @@ -3,7 +3,7 @@ # ------------------- macro error_template(*args) - error_template_helper(env, {{args.splat}}) + error_template_helper(env, {{ args.splat }}) end def github_details(summary : String, content : String) @@ -22,12 +22,12 @@ def get_issue_template(env : HTTP::Server::Context, exception : Exception) : Tup issue_title = "#{exception.message} (#{exception.class})" issue_template = <<-TEXT - Title: `#{HTML.escape(issue_title)}` - Date: `#{Time::Format::ISO_8601_DATE_TIME.format(Time.utc)}` - Route: `#{HTML.escape(env.request.resource)}` - Version: `#{SOFTWARE["version"]} @ #{SOFTWARE["branch"]}` + Title: `#{HTML.escape(issue_title)}` + Date: `#{Time::Format::ISO_8601_DATE_TIME.format(Time.utc)}` + Route: `#{HTML.escape(env.request.resource)}` + Version: `#{SOFTWARE["version"]} @ #{SOFTWARE["branch"]}` - TEXT + TEXT issue_template += github_details("Backtrace", exception.inspect_with_backtrace) @@ -80,7 +80,7 @@ def error_template_helper(env : HTTP::Server::Context, status_code : Int32, exce
#{issue_template}
- END_HTML + END_HTML # Don't show the usual "next steps" widget. The same options are # proposed above the error message, just worded differently. @@ -106,7 +106,7 @@ end # ------------------- macro error_atom(*args) - error_atom_helper(env, {{args.splat}}) + error_atom_helper(env, {{ args.splat }}) end def error_atom_helper(env : HTTP::Server::Context, status_code : Int32, exception : Exception) @@ -132,14 +132,14 @@ end # ------------------- macro error_json(*args) - error_json_helper(env, {{args.splat}}) + error_json_helper(env, {{ args.splat }}) end def error_json_helper( env : HTTP::Server::Context, status_code : Int32, exception : Exception, - additional_fields : Hash(String, Object) | Nil = nil, + additional_fields : Hash(String, Object)? = nil, ) if exception.is_a?(InfoException) return error_json_helper(env, status_code, exception.message || "", additional_fields) @@ -161,7 +161,7 @@ def error_json_helper( env : HTTP::Server::Context, status_code : Int32, message : String, - additional_fields : Hash(String, Object) | Nil = nil, + additional_fields : Hash(String, Object)? = nil, ) env.response.content_type = "application/json" env.response.status_code = status_code @@ -204,7 +204,7 @@ def error_redirect_helper(env : HTTP::Server::Context) #{go_to_youtube} - END_HTML + END_HTML else return "" end diff --git a/src/invidious/helpers/handlers.cr b/src/invidious/helpers/handlers.cr index 8395c7a4..5e016046 100644 --- a/src/invidious/helpers/handlers.cr +++ b/src/invidious/helpers/handlers.cr @@ -2,10 +2,10 @@ module HTTP::Handler @@exclude_routes_tree = Radix::Tree(String).new macro exclude(paths, method = "GET") - class_name = {{@type.name}} - method_downcase = {{method.downcase}} + class_name = {{ @type.name }} + method_downcase = {{ method.downcase }} class_name_method = "#{class_name}/#{method_downcase}" - ({{paths}}).each do |path| + ({{ paths }}).each do |path| @@exclude_routes_tree.add class_name_method + path, '/' + method_downcase + path end end @@ -20,8 +20,8 @@ module HTTP::Handler end class Kemal::RouteHandler - {% for method in %w(GET POST PUT HEAD DELETE PATCH OPTIONS) %} - exclude ["/api/v1/*"], {{method}} + {% for method in %w[GET POST PUT HEAD DELETE PATCH OPTIONS] %} + exclude ["/api/v1/*"], {{ method }} {% end %} # Processes the route if it's a match. Otherwise renders 404. @@ -44,8 +44,8 @@ class Kemal::RouteHandler end class Kemal::ExceptionHandler - {% for method in %w(GET POST PUT HEAD DELETE PATCH OPTIONS) %} - exclude ["/api/v1/*"], {{method}} + {% for method in %w[GET POST PUT HEAD DELETE PATCH OPTIONS] %} + exclude ["/api/v1/*"], {{ method }} {% end %} private def call_exception_with_status_code(context : HTTP::Server::Context, exception : Exception, status_code : Int32) @@ -72,8 +72,8 @@ class FilteredCompressHandler < HTTP::CompressHandler end class AuthHandler < Kemal::Handler - {% for method in %w(GET POST PUT HEAD DELETE PATCH OPTIONS) %} - only ["/api/v1/auth/*"], {{method}} + {% for method in %w[GET POST PUT HEAD DELETE PATCH OPTIONS] %} + only ["/api/v1/auth/*"], {{ method }} {% end %} def call(env) @@ -121,8 +121,8 @@ class AuthHandler < Kemal::Handler end class APIHandler < Kemal::Handler - {% for method in %w(GET POST PUT HEAD DELETE PATCH OPTIONS) %} - only ["/api/v1/*"], {{method}} + {% for method in %w[GET POST PUT HEAD DELETE PATCH OPTIONS] %} + only ["/api/v1/*"], {{ method }} {% end %} exclude ["/api/v1/auth/notifications"], "GET" exclude ["/api/v1/auth/notifications"], "POST" @@ -134,9 +134,9 @@ class APIHandler < Kemal::Handler end class DisableAbusableAPIHandler < Kemal::Handler - {% for method in %w(GET HEAD) %} + {% for method in %w[GET HEAD] %} # This endpoints make a video request to Invidious companion. - {% for endpoint in %w(videos clips transcripts) %} + {% for endpoint in %w[videos clips transcripts] %} only ["/api/v1/{{ endpoint.id }}/:id"], {{ method }} {% end %} {% end %} diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr index a08135ea..15fec92b 100644 --- a/src/invidious/helpers/helpers.cr +++ b/src/invidious/helpers/helpers.cr @@ -93,7 +93,7 @@ module Helpers sleep 1.minute Fiber.yield end - rescue ex + rescue end end end @@ -149,7 +149,7 @@ module Helpers id += 1 end - rescue ex + rescue ensure connection_channel.send({false, connection}) end @@ -163,7 +163,7 @@ module Helpers env.response.flush sleep (20 + rand(11)).seconds end - rescue ex + rescue ensure connection_channel.send({false, connection}) end diff --git a/src/invidious/helpers/i18n.cr b/src/invidious/helpers/i18n.cr index 0388d1f6..ffbed92b 100644 --- a/src/invidious/helpers/i18n.cr +++ b/src/invidious/helpers/i18n.cr @@ -103,7 +103,7 @@ module I18n return locales end - def translate(locale : String?, key : String, text : String | Hash(String, String) | Nil = nil) : String + def translate(locale : String?, key : String, text : String? | Hash(String, String)? = nil) : String # Log a warning if "key" doesn't exist in en-US locale and return # that key as the text, so this is more or less transparent to the user. if !LOCALES["en-US"].has_key?(key) diff --git a/src/invidious/helpers/logger.cr b/src/invidious/helpers/logger.cr index 03349595..5b06612e 100644 --- a/src/invidious/helpers/logger.cr +++ b/src/invidious/helpers/logger.cr @@ -55,10 +55,10 @@ class Invidious::LogHandler < Kemal::BaseLogHandler end end - {% for level in %w(trace debug info warn error fatal) %} - def {{level.id}}(message : String) - if LogLevel::{{level.id.capitalize}} >= @level - puts("#{Time.utc} [{{level.id}}] #{message}".colorize(color(LogLevel::{{level.id.capitalize}}))) + {% for level in %w[trace debug info warn error fatal] %} + def {{ level.id }}(message : String) + if LogLevel::{{ level.id.capitalize }} >= @level + puts("#{Time.utc} [{{ level.id }}] #{message}".colorize(color(LogLevel::{{ level.id.capitalize }}))) end end {% end %} diff --git a/src/invidious/helpers/macros.cr b/src/invidious/helpers/macros.cr index 84847321..4e2f4bb2 100644 --- a/src/invidious/helpers/macros.cr +++ b/src/invidious/helpers/macros.cr @@ -49,24 +49,24 @@ module JSON::Serializable end macro templated(_filename, template = "template", navbar_search = true) - navbar_search = {{navbar_search}} + navbar_search = {{ navbar_search }} {{ filename = "src/invidious/views/" + _filename + ".ecr" }} {{ layout = "src/invidious/views/" + template + ".ecr" }} - __content_filename__ = {{filename}} - render {{filename}}, {{layout}} + __content_filename__ = {{ filename }} + render {{ filename }}, {{ layout }} end macro rendered(filename) - render("src/invidious/views/#{{{filename}}}.ecr") + render("src/invidious/views/#{{{ filename }}}.ecr") end # Similar to Kemals halt method but works in a # method. macro haltf(env, status_code = 200, response = "") - {{env}}.response.status_code = {{status_code}} - {{env}}.response.print {{response}} - {{env}}.response.close + {{ env }}.response.status_code = {{ status_code }} + {{ env }}.response.print {{ response }} + {{ env }}.response.close return end diff --git a/src/invidious/helpers/tokens.cr b/src/invidious/helpers/tokens.cr index a44988cd..92686332 100644 --- a/src/invidious/helpers/tokens.cr +++ b/src/invidious/helpers/tokens.cr @@ -116,7 +116,7 @@ def scope_includes_scope(scope, subset) subset_endpoint = subset_endpoint.downcase if methods.empty? - methods = %w(GET POST PUT HEAD DELETE PATCH OPTIONS) + methods = %w[GET POST PUT HEAD DELETE PATCH OPTIONS] end if methods & subset_methods != subset_methods diff --git a/src/invidious/helpers/utils.cr b/src/invidious/helpers/utils.cr index 6973a93f..d715500a 100644 --- a/src/invidious/helpers/utils.cr +++ b/src/invidious/helpers/utils.cr @@ -102,7 +102,7 @@ def decode_date(string : String) # Try to parse as format Jul 10, 2000 begin return Time.parse(string, "%b %-d, %Y", Time::Location.local) - rescue ex + rescue end case string @@ -110,7 +110,6 @@ def decode_date(string : String) return Time.utc when "yesterday" return Time.utc - 1.day - else nil # Continue end # String matches format "20 hours ago", "4 months ago", "20s ago", "15min ago"... @@ -177,7 +176,7 @@ def short_text_to_number(short_text : String) : Int64 end return number.to_i64 -rescue ex +rescue return 0_i64 end diff --git a/src/invidious/http_server/static_assets_handler.cr b/src/invidious/http_server/static_assets_handler.cr index 7902c95b..024b693d 100644 --- a/src/invidious/http_server/static_assets_handler.cr +++ b/src/invidious/http_server/static_assets_handler.cr @@ -106,7 +106,7 @@ module Invidious::HttpServer # Can be removed once https://github.com/crystal-lang/crystal/issues/15817 is fixed. private def serve_file_range(context : HTTP::Server::Context, file : IO, range_header : String, file_info) # Paste in the body of inherited serve_file_range - {{@type.superclass.methods.select(&.name.==("serve_file_range"))[0].body}} + {{ @type.superclass.methods.select(&.name.==("serve_file_range"))[0].body }} end # Clear cached files. diff --git a/src/invidious/jobs/instance_refresh_job.cr b/src/invidious/jobs/instance_refresh_job.cr index cb4280b9..44eb1d74 100644 --- a/src/invidious/jobs/instance_refresh_job.cr +++ b/src/invidious/jobs/instance_refresh_job.cr @@ -69,7 +69,7 @@ class Invidious::Jobs::InstanceListRefreshJob < Invidious::Jobs::BaseJob raw_instance_list = JSON.parse(instance_api_client.get("/instances.json").body).as_a instance_api_client.close - rescue ex : Socket::ConnectError | IO::TimeoutError | JSON::ParseException + rescue Socket::ConnectError | IO::TimeoutError | JSON::ParseException raw_instance_list = [] of JSON::Any end diff --git a/src/invidious/jsonify/api_v1/video_json.cr b/src/invidious/jsonify/api_v1/video_json.cr index e02e0617..c005b5fb 100644 --- a/src/invidious/jsonify/api_v1/video_json.cr +++ b/src/invidious/jsonify/api_v1/video_json.cr @@ -138,7 +138,7 @@ module Invidious::JSONify::APIv1 if fmt_info = Invidious::Videos::Formats.itag_to_metadata?(fmt["itag"]) json.field "container", fmt_info["ext"] - json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"] + json.field("encoding", fmt_info["vcodec"]? || fmt_info["acodec"]) end # Livestream chunk infos @@ -198,8 +198,8 @@ module Invidious::JSONify::APIv1 end if fmt_info = Invidious::Videos::Formats.itag_to_metadata?(fmt["itag"]) - json.field "container", fmt_info["ext"] - json.field "encoding", fmt_info["vcodec"]? || fmt_info["acodec"] + json.field("container", fmt_info["ext"]) + json.field("encoding", fmt_info["vcodec"]? || fmt_info["acodec"]) end end end diff --git a/src/invidious/mixes.cr b/src/invidious/mixes.cr index 7dd8a830..c9bbd615 100644 --- a/src/invidious/mixes.cr +++ b/src/invidious/mixes.cr @@ -83,14 +83,14 @@ end def template_mix(mix, listen) html = <<-END_HTML -

- - #{mix["title"]} - -

-
-
    - END_HTML +

    + + #{mix["title"]} + +

    +
    +
      + END_HTML mix["videos"].as_a.each do |video| html += <<-END_HTML @@ -106,14 +106,14 @@ def template_mix(mix, listen)

      - END_HTML + END_HTML end html += <<-END_HTML -
    -
    -
    - END_HTML +
+
+
+ END_HTML html end diff --git a/src/invidious/playlists.cr b/src/invidious/playlists.cr index e6a06633..2ff1e77c 100644 --- a/src/invidious/playlists.cr +++ b/src/invidious/playlists.cr @@ -500,10 +500,10 @@ def extract_playlist_videos(playlist_id : String, initial_data : Hash(String, JS # Find the metadataParts with commandRuns inside, which contains author # information. - metadata_parts = metadata_rows.try &.find { |row| + metadata_parts = metadata_rows.try &.find do |row| parts = row["metadataParts"]?.try &.as_a parts && parts.any? { |item2| item2.dig?("text", "commandRuns").try &.as_a } - }.try &.["metadataParts"].as_a + end.try &.["metadataParts"].as_a if author_info = metadata_parts.try &.find(&.dig?("text", "commandRuns")) .try &.["text"] @@ -543,14 +543,14 @@ end def template_playlist(playlist, listen) html = <<-END_HTML -

- - #{playlist["title"]} - -

-
-
    - END_HTML +

    + + #{playlist["title"]} + +

    +
    +
      + END_HTML playlist["videos"].as_a.each do |video| html += <<-END_HTML @@ -566,14 +566,14 @@ def template_playlist(playlist, listen)

      - END_HTML + END_HTML end html += <<-END_HTML -
    -
    -
    - END_HTML +
+
+
+ END_HTML html end diff --git a/src/invidious/routes/api/manifest.cr b/src/invidious/routes/api/manifest.cr index 88430029..e5a1348b 100644 --- a/src/invidious/routes/api/manifest.cr +++ b/src/invidious/routes/api/manifest.cr @@ -19,9 +19,9 @@ module Invidious::Routes::API::Manifest begin video = get_video(id, region: region) - rescue ex : NotFoundException + rescue NotFoundException haltf env, status_code: 404 - rescue ex + rescue haltf env, status_code: 403 end diff --git a/src/invidious/routes/api/v1/authenticated.cr b/src/invidious/routes/api/v1/authenticated.cr index da706a9e..11626a80 100644 --- a/src/invidious/routes/api/v1/authenticated.cr +++ b/src/invidious/routes/api/v1/authenticated.cr @@ -42,11 +42,11 @@ module Invidious::Routes::API::V1::Authenticated user = env.get("user").as(User) begin - if body = env.request.body - body = env.request.body.not_nil!.gets_to_end - else - body = "{}" - end + body = if raw_body = env.request.body + raw_body.gets_to_end + else + "{}" + end Invidious::User::Import.from_invidious(user, body) rescue end diff --git a/src/invidious/routes/api/v1/channels.cr b/src/invidious/routes/api/v1/channels.cr index 8c21fe19..9647db78 100644 --- a/src/invidious/routes/api/v1/channels.cr +++ b/src/invidious/routes/api/v1/channels.cr @@ -31,7 +31,7 @@ module Invidious::Routes::API::V1::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UULF")) videos = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. videos = [] of PlaylistVideo end @@ -118,7 +118,7 @@ module Invidious::Routes::API::V1::Channels # Fetch related channels begin related_channels, _ = fetch_related_channels(channel) - rescue ex + rescue related_channels = [] of SearchChannel end @@ -157,7 +157,7 @@ module Invidious::Routes::API::V1::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UULF")) videos = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. videos = [] of PlaylistVideo end @@ -203,7 +203,7 @@ module Invidious::Routes::API::V1::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UUSH")) videos = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. videos = [] of PlaylistVideo end @@ -249,7 +249,7 @@ module Invidious::Routes::API::V1::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UULV")) videos = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. videos = [] of PlaylistVideo end diff --git a/src/invidious/routes/api/v1/misc.cr b/src/invidious/routes/api/v1/misc.cr index 4ae877a8..0da9dcf9 100644 --- a/src/invidious/routes/api/v1/misc.cr +++ b/src/invidious/routes/api/v1/misc.cr @@ -53,7 +53,7 @@ module Invidious::Routes::API::V1::Misc playlist = get_playlist(plid) rescue ex : InfoException return error_json(404, ex) - rescue ex + rescue return error_json(404, "Playlist does not exist.") end diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr index 14221ed0..cdf292fb 100644 --- a/src/invidious/routes/api/v1/videos.cr +++ b/src/invidious/routes/api/v1/videos.cr @@ -47,9 +47,9 @@ module Invidious::Routes::API::V1::Videos begin video = get_video(id, region: region) - rescue ex : NotFoundException + rescue NotFoundException haltf env, 404 - rescue ex + rescue haltf env, 500 end @@ -187,9 +187,9 @@ module Invidious::Routes::API::V1::Videos begin video = get_video(id, region: region) - rescue ex : NotFoundException + rescue NotFoundException haltf env, 404 - rescue ex + rescue haltf env, 500 end @@ -265,8 +265,6 @@ module Invidious::Routes::API::V1::Videos haltf env, 400 end - annotations = "" - case source when "archive" if CONFIG.cache_annotations && (cached_annotation = Invidious::Database::Annotations.select(video_id)) @@ -365,7 +363,7 @@ module Invidious::Routes::API::V1::Videos begin comments, reddit_thread = Comments.fetch_reddit(id, sort_by: sort_by) - rescue ex + rescue comments = nil reddit_thread = nil end diff --git a/src/invidious/routes/channels.cr b/src/invidious/routes/channels.cr index ff8b0f27..3c5131ed 100644 --- a/src/invidious/routes/channels.cr +++ b/src/invidious/routes/channels.cr @@ -44,7 +44,7 @@ module Invidious::Routes::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UULF")) items = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. items = [] of PlaylistVideo end @@ -79,7 +79,7 @@ module Invidious::Routes::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UUSH")) items = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. items = [] of PlaylistVideo end @@ -114,7 +114,7 @@ module Invidious::Routes::Channels begin playlist = get_playlist(channel.ucid.sub("UC", "UULV")) items = get_playlist_videos(playlist, offset: 0) - rescue ex : InfoException + rescue InfoException # playlist doesnt exist. items = [] of PlaylistVideo end @@ -353,7 +353,7 @@ module Invidious::Routes::Channels begin resolved_url = YoutubeAPI.resolve_url("https://www.youtube.com#{env.request.path}#{yt_url_params.size > 0 ? "?#{yt_url_params}" : ""}") ucid = resolved_url["endpoint"]["browseEndpoint"]["browseId"] - rescue ex : InfoException | KeyError + rescue InfoException | KeyError return error_template(404, I18n.translate(locale, "This channel does not exist.")) end diff --git a/src/invidious/routes/companion.cr b/src/invidious/routes/companion.cr index 811393ab..9236e8ab 100644 --- a/src/invidious/routes/companion.cr +++ b/src/invidious/routes/companion.cr @@ -12,7 +12,7 @@ module Invidious::Routes::Companion return self.proxy_companion(env, resp) end end - rescue ex + rescue end end @@ -29,7 +29,7 @@ module Invidious::Routes::Companion return self.proxy_companion(env, resp) end end - rescue ex + rescue end end @@ -45,7 +45,7 @@ module Invidious::Routes::Companion return self.proxy_companion(env, resp) end end - rescue ex + rescue end end diff --git a/src/invidious/routes/embed.cr b/src/invidious/routes/embed.cr index 41dc517c..fd50609e 100644 --- a/src/invidious/routes/embed.cr +++ b/src/invidious/routes/embed.cr @@ -119,7 +119,6 @@ module Invidious::Routes::Embed end return env.redirect url - else nil # Continue end params = Invidious::Videos.process_video_params(env.params.query, preferences) @@ -182,14 +181,14 @@ module Invidious::Routes::Embed captions = video.captions - preferred_captions = captions.select { |caption| + preferred_captions = captions.select do |caption| params.preferred_captions.includes?(caption.name) || params.preferred_captions.includes?(caption.language_code.split("-")[0]) - } - preferred_captions.sort_by! { |caption| + end + preferred_captions.sort_by! do |caption| (params.preferred_captions.index(caption.name) || params.preferred_captions.index(caption.language_code.split("-")[0])).not_nil! - } + end captions = captions - preferred_captions aspect_ratio = nil diff --git a/src/invidious/routes/feeds.cr b/src/invidious/routes/feeds.cr index ebb5f04b..58972733 100644 --- a/src/invidious/routes/feeds.cr +++ b/src/invidious/routes/feeds.cr @@ -327,7 +327,6 @@ module Invidious::Routes::Feeds request_target = URI.parse(node[attribute.name]).request_target query_string_opt = request_target.starts_with?("/watch?v=") ? ("&#{params}" if !params.empty?) : "" node[attribute.name] = "#{HOST_URL}#{request_target}#{query_string_opt}" - else nil # Skip end end end diff --git a/src/invidious/routes/images.cr b/src/invidious/routes/images.cr index d76bcc58..5d8bdb82 100644 --- a/src/invidious/routes/images.cr +++ b/src/invidious/routes/images.cr @@ -15,7 +15,7 @@ module Invidious::Routes::Images GGPHT_POOL.client &.get(url, headers) do |resp| return self.proxy_image(env, resp) end - rescue ex + rescue end end @@ -46,7 +46,7 @@ module Invidious::Routes::Images env.response.headers["Connection"] = "close" return self.proxy_image(env, resp) end - rescue ex + rescue end end @@ -68,7 +68,7 @@ module Invidious::Routes::Images get_ytimg_pool(authority).client &.get(url, headers) do |resp| return self.proxy_image(env, resp) end - rescue ex + rescue end end @@ -108,7 +108,7 @@ module Invidious::Routes::Images Helpers.proxy_file(response, env) end - rescue ex + rescue end end @@ -140,7 +140,7 @@ module Invidious::Routes::Images get_ytimg_pool("i").client &.get(url, headers) do |resp| return self.proxy_image(env, resp) end - rescue ex + rescue end end diff --git a/src/invidious/routes/login.cr b/src/invidious/routes/login.cr index 7d7da487..21b43be8 100644 --- a/src/invidious/routes/login.cr +++ b/src/invidious/routes/login.cr @@ -103,7 +103,7 @@ module Invidious::Routes::Login begin validate_request(tokens[0], answer, env.request, HMAC_KEY, locale) - rescue ex : InfoException + rescue InfoException return error_template(400, InfoException.new("Erroneous CAPTCHA")) rescue ex return error_template(400, ex) diff --git a/src/invidious/routes/playlists.cr b/src/invidious/routes/playlists.cr index 3a633d50..c858f9f7 100644 --- a/src/invidious/routes/playlists.cr +++ b/src/invidious/routes/playlists.cr @@ -164,7 +164,7 @@ module Invidious::Routes::Playlists begin items = get_playlist_videos(playlist, offset: (page - 1) * 100) - rescue ex + rescue items = [] of PlaylistVideo end @@ -255,7 +255,7 @@ module Invidious::Routes::Playlists begin query = Invidious::Search::Query.new(env.params.query, :playlist, region) items = query.process.select(SearchVideo).map(&.as(SearchVideo)) - rescue ex + rescue items = [] of SearchVideo end diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index 77ea02e9..c5de293d 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -362,7 +362,6 @@ module Invidious::Routes::PreferencesRoute response: error_template(415, "Uploaded file is too large") ) end - else nil # Ignore end end end diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr index f7909c8e..d0d8042d 100644 --- a/src/invidious/routes/video_playback.cr +++ b/src/invidious/routes/video_playback.cr @@ -115,7 +115,7 @@ module Invidious::Routes::VideoPlayback IO.copy(resp.body_io, env.response) end - rescue ex + rescue end else if query_params["title"]? && CONFIG.disabled?("downloads") || diff --git a/src/invidious/routes/watch.cr b/src/invidious/routes/watch.cr index 4bca3753..c551ab21 100644 --- a/src/invidious/routes/watch.cr +++ b/src/invidious/routes/watch.cr @@ -82,7 +82,7 @@ module Invidious::Routes::Watch if source == "youtube" begin comment_html = JSON.parse(Comments.fetch_youtube(id, nil, "html", locale, preferences.thin_mode, region))["contentHtml"] - rescue ex + rescue if preferences.comments[1] == "reddit" comments, reddit_thread = Comments.fetch_reddit(id) comment_html = Frontend::Comments.template_reddit(comments, locale) @@ -98,7 +98,7 @@ module Invidious::Routes::Watch comment_html = Comments.fill_links(comment_html, "https", "www.reddit.com") comment_html = Comments.replace_links(comment_html) - rescue ex + rescue if preferences.comments[1] == "youtube" comment_html = JSON.parse(Comments.fetch_youtube(id, nil, "html", locale, preferences.thin_mode, region))["contentHtml"] end @@ -143,14 +143,14 @@ module Invidious::Routes::Watch captions = video.captions - preferred_captions = captions.select { |caption| + preferred_captions = captions.select do |caption| params.preferred_captions.includes?(caption.name) || params.preferred_captions.includes?(caption.language_code.split("-")[0]) - } - preferred_captions.sort_by! { |caption| + end + preferred_captions.sort_by! do |caption| (params.preferred_captions.index(caption.name) || params.preferred_captions.index(caption.language_code.split("-")[0])).not_nil! - } + end captions = captions - preferred_captions aspect_ratio = "16:9" diff --git a/src/invidious/routing.cr b/src/invidious/routing.cr index 12bf5459..a44e5f38 100644 --- a/src/invidious/routing.cr +++ b/src/invidious/routing.cr @@ -3,12 +3,12 @@ module Invidious::Routing {% for http_method in {"get", "post", "delete", "options", "patch", "put"} %} - macro {{http_method.id}}(path, controller, method = :handle) + macro {{ http_method.id }}(path, controller, method = :handle) unless Kemal::Utils.path_starts_with_slash?(\{{path}}) - raise Kemal::Exceptions::InvalidPathStartException.new({{http_method}}, \{{path}}) + raise Kemal::Exceptions::InvalidPathStartException.new({{ http_method }}, \{{path}}) end - Kemal::RouteHandler::INSTANCE.add_route({{http_method.upcase}}, \{{path}}) do |env| + Kemal::RouteHandler::INSTANCE.add_route({{ http_method.upcase }}, \{{path}}) do |env| \{{ controller }}.\{{ method.id }}(env) end end @@ -241,91 +241,91 @@ module Invidious::Routing def register_api_v1_routes {% begin %} - {{namespace = Routes::API::V1}} + {{ namespace = Routes::API::V1 }} # Videos - get "/api/v1/videos/:id", {{namespace}}::Videos, :videos - get "/api/v1/storyboards/:id", {{namespace}}::Videos, :storyboards - get "/api/v1/captions/:id", {{namespace}}::Videos, :captions - get "/api/v1/annotations/:id", {{namespace}}::Videos, :annotations - get "/api/v1/comments/:id", {{namespace}}::Videos, :comments - get "/api/v1/clips/:id", {{namespace}}::Videos, :clips - get "/api/v1/transcripts/:id", {{namespace}}::Videos, :transcripts + get "/api/v1/videos/:id", {{ namespace }}::Videos, :videos + get "/api/v1/storyboards/:id", {{ namespace }}::Videos, :storyboards + get "/api/v1/captions/:id", {{ namespace }}::Videos, :captions + get "/api/v1/annotations/:id", {{ namespace }}::Videos, :annotations + get "/api/v1/comments/:id", {{ namespace }}::Videos, :comments + get "/api/v1/clips/:id", {{ namespace }}::Videos, :clips + get "/api/v1/transcripts/:id", {{ namespace }}::Videos, :transcripts # Feeds - get "/api/v1/trending", {{namespace}}::Feeds, :trending - get "/api/v1/popular", {{namespace}}::Feeds, :popular + get "/api/v1/trending", {{ namespace }}::Feeds, :trending + get "/api/v1/popular", {{ namespace }}::Feeds, :popular # Channels - get "/api/v1/channels/:ucid", {{namespace}}::Channels, :home - get "/api/v1/channels/:ucid/latest", {{namespace}}::Channels, :latest - get "/api/v1/channels/:ucid/videos", {{namespace}}::Channels, :videos - get "/api/v1/channels/:ucid/shorts", {{namespace}}::Channels, :shorts - get "/api/v1/channels/:ucid/streams", {{namespace}}::Channels, :streams - get "/api/v1/channels/:ucid/podcasts", {{namespace}}::Channels, :podcasts - get "/api/v1/channels/:ucid/releases", {{namespace}}::Channels, :releases - get "/api/v1/channels/:ucid/courses", {{namespace}}::Channels, :courses - get "/api/v1/channels/:ucid/playlists", {{namespace}}::Channels, :playlists - get "/api/v1/channels/:ucid/community", {{namespace}}::Channels, :community - get "/api/v1/channels/:ucid/posts", {{namespace}}::Channels, :community - get "/api/v1/channels/:ucid/channels", {{namespace}}::Channels, :channels - get "/api/v1/channels/:ucid/search", {{namespace}}::Channels, :search + get "/api/v1/channels/:ucid", {{ namespace }}::Channels, :home + get "/api/v1/channels/:ucid/latest", {{ namespace }}::Channels, :latest + get "/api/v1/channels/:ucid/videos", {{ namespace }}::Channels, :videos + get "/api/v1/channels/:ucid/shorts", {{ namespace }}::Channels, :shorts + get "/api/v1/channels/:ucid/streams", {{ namespace }}::Channels, :streams + get "/api/v1/channels/:ucid/podcasts", {{ namespace }}::Channels, :podcasts + get "/api/v1/channels/:ucid/releases", {{ namespace }}::Channels, :releases + get "/api/v1/channels/:ucid/courses", {{ namespace }}::Channels, :courses + get "/api/v1/channels/:ucid/playlists", {{ namespace }}::Channels, :playlists + get "/api/v1/channels/:ucid/community", {{ namespace }}::Channels, :community + get "/api/v1/channels/:ucid/posts", {{ namespace }}::Channels, :community + get "/api/v1/channels/:ucid/channels", {{ namespace }}::Channels, :channels + get "/api/v1/channels/:ucid/search", {{ namespace }}::Channels, :search # Posts - get "/api/v1/post/:id", {{namespace}}::Channels, :post - get "/api/v1/post/:id/comments", {{namespace}}::Channels, :post_comments + get "/api/v1/post/:id", {{ namespace }}::Channels, :post + get "/api/v1/post/:id/comments", {{ namespace }}::Channels, :post_comments # 301 redirects to new /api/v1/channels/community/:ucid and /:ucid/community - get "/api/v1/channels/comments/:ucid", {{namespace}}::Channels, :channel_comments_redirect - get "/api/v1/channels/:ucid/comments", {{namespace}}::Channels, :channel_comments_redirect + get "/api/v1/channels/comments/:ucid", {{ namespace }}::Channels, :channel_comments_redirect + get "/api/v1/channels/:ucid/comments", {{ namespace }}::Channels, :channel_comments_redirect # Search - get "/api/v1/search", {{namespace}}::Search, :search - get "/api/v1/search/suggestions", {{namespace}}::Search, :search_suggestions - get "/api/v1/hashtag/:hashtag", {{namespace}}::Search, :hashtag + get "/api/v1/search", {{ namespace }}::Search, :search + get "/api/v1/search/suggestions", {{ namespace }}::Search, :search_suggestions + get "/api/v1/hashtag/:hashtag", {{ namespace }}::Search, :hashtag # Authenticated - get "/api/v1/auth/preferences", {{namespace}}::Authenticated, :get_preferences - post "/api/v1/auth/preferences", {{namespace}}::Authenticated, :set_preferences + get "/api/v1/auth/preferences", {{ namespace }}::Authenticated, :get_preferences + post "/api/v1/auth/preferences", {{ namespace }}::Authenticated, :set_preferences - get "/api/v1/auth/export/invidious", {{namespace}}::Authenticated, :export_invidious - post "/api/v1/auth/import/invidious", {{namespace}}::Authenticated, :import_invidious + get "/api/v1/auth/export/invidious", {{ namespace }}::Authenticated, :export_invidious + post "/api/v1/auth/import/invidious", {{ namespace }}::Authenticated, :import_invidious - get "/api/v1/auth/history", {{namespace}}::Authenticated, :get_history - post "/api/v1/auth/history/:id", {{namespace}}::Authenticated, :mark_watched - delete "/api/v1/auth/history/:id", {{namespace}}::Authenticated, :mark_unwatched - delete "/api/v1/auth/history", {{namespace}}::Authenticated, :clear_history + get "/api/v1/auth/history", {{ namespace }}::Authenticated, :get_history + post "/api/v1/auth/history/:id", {{ namespace }}::Authenticated, :mark_watched + delete "/api/v1/auth/history/:id", {{ namespace }}::Authenticated, :mark_unwatched + delete "/api/v1/auth/history", {{ namespace }}::Authenticated, :clear_history - get "/api/v1/auth/feed", {{namespace}}::Authenticated, :feed + get "/api/v1/auth/feed", {{ namespace }}::Authenticated, :feed - get "/api/v1/auth/subscriptions", {{namespace}}::Authenticated, :get_subscriptions - post "/api/v1/auth/subscriptions/:ucid", {{namespace}}::Authenticated, :subscribe_channel - delete "/api/v1/auth/subscriptions/:ucid", {{namespace}}::Authenticated, :unsubscribe_channel + get "/api/v1/auth/subscriptions", {{ namespace }}::Authenticated, :get_subscriptions + post "/api/v1/auth/subscriptions/:ucid", {{ namespace }}::Authenticated, :subscribe_channel + delete "/api/v1/auth/subscriptions/:ucid", {{ namespace }}::Authenticated, :unsubscribe_channel - get "/api/v1/auth/playlists", {{namespace}}::Authenticated, :list_playlists - post "/api/v1/auth/playlists", {{namespace}}::Authenticated, :create_playlist - patch "/api/v1/auth/playlists/:plid",{{namespace}}:: Authenticated, :update_playlist_attribute - delete "/api/v1/auth/playlists/:plid", {{namespace}}::Authenticated, :delete_playlist - post "/api/v1/auth/playlists/:plid/videos", {{namespace}}::Authenticated, :insert_video_into_playlist - delete "/api/v1/auth/playlists/:plid/videos/:index", {{namespace}}::Authenticated, :delete_video_in_playlist + get "/api/v1/auth/playlists", {{ namespace }}::Authenticated, :list_playlists + post "/api/v1/auth/playlists", {{ namespace }}::Authenticated, :create_playlist + patch "/api/v1/auth/playlists/:plid",{{ namespace }}:: Authenticated, :update_playlist_attribute + delete "/api/v1/auth/playlists/:plid", {{ namespace }}::Authenticated, :delete_playlist + post "/api/v1/auth/playlists/:plid/videos", {{ namespace }}::Authenticated, :insert_video_into_playlist + delete "/api/v1/auth/playlists/:plid/videos/:index", {{ namespace }}::Authenticated, :delete_video_in_playlist - get "/api/v1/auth/tokens", {{namespace}}::Authenticated, :get_tokens - post "/api/v1/auth/tokens/register", {{namespace}}::Authenticated, :register_token - post "/api/v1/auth/tokens/unregister", {{namespace}}::Authenticated, :unregister_token + get "/api/v1/auth/tokens", {{ namespace }}::Authenticated, :get_tokens + post "/api/v1/auth/tokens/register", {{ namespace }}::Authenticated, :register_token + post "/api/v1/auth/tokens/unregister", {{ namespace }}::Authenticated, :unregister_token if CONFIG.enable_user_notifications - get "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications - post "/api/v1/auth/notifications", {{namespace}}::Authenticated, :notifications + get "/api/v1/auth/notifications", {{ namespace }}::Authenticated, :notifications + post "/api/v1/auth/notifications", {{ namespace }}::Authenticated, :notifications end # Misc - get "/api/v1/stats", {{namespace}}::Misc, :stats - get "/api/v1/playlists/:plid", {{namespace}}::Misc, :get_playlist - get "/api/v1/auth/playlists/:plid", {{namespace}}::Misc, :get_playlist - get "/api/v1/mixes/:rdid", {{namespace}}::Misc, :mixes - get "/api/v1/resolveurl", {{namespace}}::Misc, :resolve_url + get "/api/v1/stats", {{ namespace }}::Misc, :stats + get "/api/v1/playlists/:plid", {{ namespace }}::Misc, :get_playlist + get "/api/v1/auth/playlists/:plid", {{ namespace }}::Misc, :get_playlist + get "/api/v1/mixes/:rdid", {{ namespace }}::Misc, :mixes + get "/api/v1/resolveurl", {{ namespace }}::Misc, :resolve_url {% end %} end end diff --git a/src/invidious/search/processors.cr b/src/invidious/search/processors.cr index ecf9aeb3..0fc32363 100644 --- a/src/invidious/search/processors.cr +++ b/src/invidious/search/processors.cr @@ -39,7 +39,7 @@ module Invidious::Search def subscriptions(query : Query, user : Invidious::User) : Array(ChannelVideo) view_name = "subscriptions_#{sha256(user.email)}" - return PG_DB.query_all(" + return PG_DB.query_all(<<-SQL, SELECT id,title,published,updated,ucid,author,length_seconds FROM ( SELECT *, @@ -47,7 +47,8 @@ module Invidious::Search to_tsvector(#{view_name}.author) as document FROM #{view_name} - ) v_search WHERE v_search.document @@ plainto_tsquery($1) LIMIT 20 OFFSET $2;", + ) v_search WHERE v_search.document @@ plainto_tsquery($1) LIMIT 20 OFFSET $2; + SQL query.text, (query.page - 1) * 20, as: ChannelVideo ) diff --git a/src/invidious/trending.cr b/src/invidious/trending.cr index 622fe517..2f9d7335 100644 --- a/src/invidious/trending.cr +++ b/src/invidious/trending.cr @@ -2,10 +2,10 @@ def fetch_trending(trending_type, region, locale) region ||= "US" region = region.upcase + # 2026-10-12: plid is only used in line 47 + # so we can remove this later. plid = nil - browse_id = "" - case trending_type.try &.downcase when "gaming" browse_id = "UCOpNcN46UbXVtpKMrmU4Abg" diff --git a/src/invidious/user/captcha.cr b/src/invidious/user/captcha.cr index b175c3b9..e46105e0 100644 --- a/src/invidious/user/captcha.cr +++ b/src/invidious/user/captcha.cr @@ -20,28 +20,28 @@ struct Invidious::User end clock_svg = <<-END_SVG - - + + - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 - - - - - - END_SVG + + + + + + END_SVG image = "data:image/png;base64," image += Process.run(%(rsvg-convert -w 400 -h 400 -b none -f png), shell: true, diff --git a/src/invidious/user/imports.cr b/src/invidious/user/imports.cr index 7c4101cc..c06c4ae9 100644 --- a/src/invidious/user/imports.cr +++ b/src/invidious/user/imports.cr @@ -56,7 +56,7 @@ struct Invidious::User begin video = get_video(video_id) - rescue ex + rescue next end @@ -130,7 +130,7 @@ struct Invidious::User begin video = get_video(video_id, false) - rescue ex + rescue next end diff --git a/src/invidious/user/preferences.cr b/src/invidious/user/preferences.cr index ad4a9bc7..1ac1c6dd 100644 --- a/src/invidious/user/preferences.cr +++ b/src/invidious/user/preferences.cr @@ -73,7 +73,7 @@ struct Preferences else result end - rescue ex + rescue if value.read_bool "dark" else @@ -199,7 +199,7 @@ struct Preferences value.read_array do result << HTML.escape(value.read_string[0, 100]) end - rescue ex + rescue result = [HTML.escape(value.read_string[0, 100]), ""] end @@ -228,7 +228,7 @@ struct Preferences result << HTML.escape(item.value[0, 100]) end - rescue ex + rescue if node.is_a?(YAML::Nodes::Scalar) result = [HTML.escape(node.value[0, 100]), ""] else diff --git a/src/invidious/user/user.cr b/src/invidious/user/user.cr index a6d05fd1..a7aaf5df 100644 --- a/src/invidious/user/user.cr +++ b/src/invidious/user/user.cr @@ -19,7 +19,7 @@ struct Invidious::User def self.from_rs(rs) begin Preferences.from_json(rs.read(String)) - rescue ex + rescue Preferences.from_json("{}") end end diff --git a/src/invidious/users.cr b/src/invidious/users.cr index 65566d20..5158fc22 100644 --- a/src/invidious/users.cr +++ b/src/invidious/users.cr @@ -45,7 +45,6 @@ def get_subscription_feed(user, max_results = 40, page = 1) notifications.sort_by!(&.author) when "channel name - reverse" notifications.sort_by!(&.author).reverse! - else nil # Ignore end else if user.preferences.latest_only @@ -94,7 +93,6 @@ def get_subscription_feed(user, max_results = 40, page = 1) videos.sort_by!(&.author) when "channel name - reverse" videos.sort_by!(&.author).reverse! - else nil # Ignore end notifications = Invidious::Database::Users.select_notifications(user) diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index ba947b2b..dfaab3d3 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -48,7 +48,7 @@ struct Video end end - def to_json(json : JSON::Builder | Nil = nil) + def to_json(json : JSON::Builder? = nil) to_json(nil, json) end @@ -150,7 +150,7 @@ struct Video def dash_manifest_url : String? raw_dash_url = info.dig?("streamingData", "dashManifestUrl").try &.as_s - return nil if raw_dash_url.nil? + return if raw_dash_url.nil? # Use manifest v5 parameter to reduce file size # See https://github.com/iv-org/invidious/issues/4186 @@ -183,14 +183,14 @@ struct Video end def music : Array(VideoMusic) - info["music"].as_a.map { |music_json| + info["music"].as_a.map do |music_json| VideoMusic.new( music_json["song"].as_s, music_json["album"].as_s, music_json["artist"].as_s, music_json["license"].as_s ) - } + end end # Returns true if comments are enabled on the video @@ -201,37 +201,37 @@ struct Video # Macros defining getters/setters for various types of data private macro getset_string(name) - # Return {{name.stringify}} from `info` - def {{name.id.underscore}} : String - return info[{{name.stringify}}]?.try &.as_s || "" + # Return {{ name.stringify }} from `info` + def {{ name.id.underscore }} : String + return info[{{ name.stringify }}]?.try &.as_s || "" end - # Update {{name.stringify}} into `info` - def {{name.id.underscore}}=(value : String) - info[{{name.stringify}}] = JSON::Any.new(value) + # Update {{ name.stringify }} into `info` + def {{ name.id.underscore }}=(value : String) + info[{{ name.stringify }}] = JSON::Any.new(value) end - {% if flag?(:debug_macros) %} {{debug}} {% end %} + {% if flag?(:debug_macros) %} {{ debug }} {% end %} end private macro getset_string_array(name) - # Return {{name.stringify}} from `info` - def {{name.id.underscore}} : Array(String) - return info[{{name.stringify}}]?.try &.as_a.map &.as_s || [] of String + # Return {{ name.stringify }} from `info` + def {{ name.id.underscore }} : Array(String) + return info[{{ name.stringify }}]?.try &.as_a.map &.as_s || [] of String end - # Update {{name.stringify}} into `info` - def {{name.id.underscore}}=(value : Array(String)) - info[{{name.stringify}}] = JSON::Any.new(value) + # Update {{ name.stringify }} into `info` + def {{ name.id.underscore }}=(value : Array(String)) + info[{{ name.stringify }}] = JSON::Any.new(value) end - {% if flag?(:debug_macros) %} {{debug}} {% end %} + {% if flag?(:debug_macros) %} {{ debug }} {% end %} end {% for op, type in {i32: Int32, i64: Int64} %} - private macro getset_{{op}}(name) - def \{{name.id.underscore}} : {{type}} - return info[\{{name.stringify}}]?.try &.as_i64.to_{{op}} || 0_{{op}} + private macro getset_{{ op }}(name) + def \{{name.id.underscore}} : {{ type }} + return info[\{{name.stringify}}]?.try &.as_i64.to_{{ op }} || 0_{{ op }} end def \{{name.id.underscore}}=(value : Int) @@ -243,32 +243,32 @@ struct Video {% end %} private macro getset_bool(name) - # Return {{name.stringify}} from `info` - def {{name.id.underscore}} : Bool - return info[{{name.stringify}}]?.try &.as_bool || false + # Return {{ name.stringify }} from `info` + def {{ name.id.underscore }} : Bool + return info[{{ name.stringify }}]?.try &.as_bool || false end - # Update {{name.stringify}} into `info` - def {{name.id.underscore}}=(value : Bool) - info[{{name.stringify}}] = JSON::Any.new(value) + # Update {{ name.stringify }} into `info` + def {{ name.id.underscore }}=(value : Bool) + info[{{ name.stringify }}] = JSON::Any.new(value) end - {% if flag?(:debug_macros) %} {{debug}} {% end %} + {% if flag?(:debug_macros) %} {{ debug }} {% end %} end # Macro to generate ? and = accessor methods for attributes in `info` private macro predicate_bool(method_name, name) - # Return {{name.stringify}} from `info` - def {{method_name.id.underscore}}? : Bool - return info[{{name.stringify}}]?.try &.as_bool || false + # Return {{ name.stringify }} from `info` + def {{ method_name.id.underscore }}? : Bool + return info[{{ name.stringify }}]?.try &.as_bool || false end - # Update {{name.stringify}} into `info` - def {{method_name.id.underscore}}=(value : Bool) - info[{{name.stringify}}] = JSON::Any.new(value) + # Update {{ name.stringify }} into `info` + def {{ method_name.id.underscore }}=(value : Bool) + info[{{ name.stringify }}] = JSON::Any.new(value) end - {% if flag?(:debug_macros) %} {{debug}} {% end %} + {% if flag?(:debug_macros) %} {{ debug }} {% end %} end # Method definitions, using the macros above diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr index 8367fcd7..85c1acd8 100644 --- a/src/invidious/videos/parser.cr +++ b/src/invidious/videos/parser.cr @@ -10,7 +10,7 @@ module Invidious::Videos::Parser # TODO: "compactRadioRenderer" (Mix) and # TODO: Use a proper struct/class instead of a hacky JSON object def parse_related_video(related : JSON::Any) : Hash(String, JSON::Any)? - return nil if !related["videoId"]? + return if !related["videoId"]? # The compact renderer has video length in seconds, where the end # screen rendered has a full text version ("42:40") @@ -60,7 +60,7 @@ module Invidious::Videos::Parser player_response = YoutubeAPI.player(video_id: video_id) if player_response.nil? - return nil + return end playability_status = player_response.dig?("playabilityStatus", "status").try &.as_s @@ -150,7 +150,7 @@ module Invidious::Videos::Parser elsif playability_status == "OK" return response else - return nil + return end end diff --git a/src/invidious/views/user/login.ecr b/src/invidious/views/user/login.ecr index 4324133a..064035cd 100644 --- a/src/invidious/views/user/login.ecr +++ b/src/invidious/views/user/login.ecr @@ -25,8 +25,7 @@ <% end %> <% if captcha %> - <% captcha = captcha.not_nil! %> - + <% captcha[:tokens].each_with_index do |token, i| %> <% end %> diff --git a/src/invidious/yt_backend/connection_pool.cr b/src/invidious/yt_backend/connection_pool.cr index fb3da86c..2b22a1f2 100644 --- a/src/invidious/yt_backend/connection_pool.cr +++ b/src/invidious/yt_backend/connection_pool.cr @@ -20,7 +20,7 @@ struct YoutubeConnectionPool begin response = yield conn - rescue ex + rescue conn.close conn = make_client(url, force_resolve: true) @@ -88,7 +88,7 @@ struct CompanionConnectionPool begin response = yield wrapper - rescue ex + rescue wrapper.close companion = CONFIG.invidious_companion.sample diff --git a/src/invidious/yt_backend/extractors.cr b/src/invidious/yt_backend/extractors.cr index b2226e74..ac8757df 100644 --- a/src/invidious/yt_backend/extractors.cr +++ b/src/invidious/yt_backend/extractors.cr @@ -40,8 +40,8 @@ private module Parsers begin return parse_internal(*args) rescue ex - LOGGER.debug("#{{{@type.name}}}: Failed to render item.") - LOGGER.debug("#{{{@type.name}}}: Got exception: #{ex.message}") + LOGGER.debug("#{{{ @type.name }}}: Failed to render item.") + LOGGER.debug("#{{{ @type.name }}}: Got exception: #{ex.message}") ProblematicTimelineItem.new( parse_exception: ex ) @@ -152,7 +152,6 @@ private module Parsers when "Premium" # TODO: Potentially available as item_contents["topStandaloneBadge"]["metadataBadgeRenderer"] badges |= VideoBadges::Premium - else nil # Ignore end end @@ -173,7 +172,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -240,7 +239,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -289,7 +288,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -334,7 +333,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -395,7 +394,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -467,7 +466,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -496,7 +495,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -527,7 +526,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -626,7 +625,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -655,6 +654,10 @@ private module Parsers thumbnail_view_model = item_contents.dig( "contentImage", "thumbnailViewModel" ) + # TODO: This is an useless assignment, is not used anywhere + # so check if it can be used somewhere later. + # + # ameba:disable Lint/UselessAssign thumbnail = thumbnail_view_model.dig("image", "sources", 0, "url").as_s video_id = item_contents["contentId"].as_s @@ -739,9 +742,9 @@ private module Parsers video_count = thumbnail_view_model.dig("overlays").as_a .compact_map(&.dig?("thumbnailOverlayBadgeViewModel", "thumbnailBadges").try &.as_a) .flatten - .find(nil, &.dig?("thumbnailBadgeViewModel", "text").try { |node| + .find(nil, &.dig?("thumbnailBadgeViewModel", "text").try do |node| {"episodes", "videos", "lessons"}.any? { |str| node.as_s.ends_with?(str) } - }) + end) .try &.dig("thumbnailBadgeViewModel", "text").as_s.to_i(strict: false) metadata = item_contents.dig("metadata", "lockupMetadataViewModel") @@ -790,10 +793,10 @@ private module Parsers # ] # metadata_rows = metadata.dig?("metadata", "contentMetadataViewModel", "metadataRows").try &.as_a - metadata_parts = metadata_rows.try &.find { |row| + metadata_parts = metadata_rows.try &.find do |row| parts = row["metadataParts"]?.try &.as_a parts && !parts.any? { |item| item.dig?("text", "content").try &.as_s == "View full playlist" } - }.try &.["metadataParts"].as_a + end.try &.["metadataParts"].as_a if author_info = metadata_parts.try &.find(&.dig?("text", "commandRuns")) .try &.["text"] @@ -831,7 +834,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -889,7 +892,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end @@ -918,7 +921,7 @@ private module Parsers end def self.parser_name - return {{@type.name}} + return {{ @type.name }} end end end @@ -1005,7 +1008,7 @@ private module Extractors end def self.extractor_name - return {{@type.name}} + return {{ @type.name }} end end @@ -1046,7 +1049,7 @@ private module Extractors end def self.extractor_name - return {{@type.name}} + return {{ @type.name }} end end @@ -1080,7 +1083,7 @@ private module Extractors end def self.extractor_name - return {{@type.name}} + return {{ @type.name }} end end end diff --git a/src/invidious/yt_backend/extractors_utils.cr b/src/invidious/yt_backend/extractors_utils.cr index c83a2de5..3ee849d0 100644 --- a/src/invidious/yt_backend/extractors_utils.cr +++ b/src/invidious/yt_backend/extractors_utils.cr @@ -17,15 +17,13 @@ # another nil will be returned. def extract_text(item : JSON::Any?) : String? if item.nil? - return nil + return end if text_container = item["simpleText"]? return text_container.as_s elsif text_container = item["runs"]? return text_container.as_a.map(&.["text"].as_s).join("") - else - nil end end diff --git a/src/invidious/yt_backend/url_sanitizer.cr b/src/invidious/yt_backend/url_sanitizer.cr index d539dadb..856a18d6 100644 --- a/src/invidious/yt_backend/url_sanitizer.cr +++ b/src/invidious/yt_backend/url_sanitizer.cr @@ -46,7 +46,7 @@ module UrlSanitizer when "results", "search" return :search else # hashtag, post, trending, brand URLs, etc.. - return nil + return end end diff --git a/src/invidious/yt_backend/youtube_api.cr b/src/invidious/yt_backend/youtube_api.cr index 6a38ded6..da89b379 100644 --- a/src/invidious/yt_backend/youtube_api.cr +++ b/src/invidious/yt_backend/youtube_api.cr @@ -210,7 +210,7 @@ module YoutubeAPI # Region to provide to youtube, e.g to alter search results # (this is passed as the `gl` parameter). - property region : String | Nil + property region : String? # Initialization function def initialize( @@ -286,7 +286,7 @@ module YoutubeAPI # Return, as a Hash, the "context" data required to request the # youtube API endpoints. # - private def make_context(client_config : ClientConfig | Nil, video_id = "dQw4w9WgXcQ") : Hash + private def make_context(client_config : ClientConfig?, video_id = "dQw4w9WgXcQ") : Hash # Use the default client config if nil is passed client_config ||= DEFAULT_CLIENT_CONFIG @@ -356,7 +356,7 @@ module YoutubeAPI # # - A playlist ID (parameters MUST be an empty string) # - def browse(continuation : String, client_config : ClientConfig | Nil = nil) + def browse(continuation : String, client_config : ClientConfig? = nil) # JSON Request data, required by the API data = { "context" => self.make_context(client_config), @@ -371,7 +371,7 @@ module YoutubeAPI browse_id : String, *, # Force the following parameters to be passed by name params : String, - client_config : ClientConfig | Nil = nil, + client_config : ClientConfig? = nil, ) # JSON Request data, required by the API data = { @@ -424,7 +424,7 @@ module YoutubeAPI # }) # ``` # - def next(continuation : String, *, client_config : ClientConfig | Nil = nil) + def next(continuation : String, *, client_config : ClientConfig? = nil) # JSON Request data, required by the API data = { "context" => self.make_context(client_config), @@ -435,7 +435,7 @@ module YoutubeAPI end # :ditto: - def next(data : Hash, *, client_config : ClientConfig | Nil = nil) + def next(data : Hash, *, client_config : ClientConfig? = nil) # JSON Request data, required by the API data2 = data.merge({ "context" => self.make_context(client_config), @@ -445,7 +445,7 @@ module YoutubeAPI end # Allow a NamedTuple to be passed, too. - def next(data : NamedTuple, *, client_config : ClientConfig | Nil = nil) + def next(data : NamedTuple, *, client_config : ClientConfig? = nil) return self.next(data.to_h, client_config: client_config) end @@ -466,7 +466,7 @@ module YoutubeAPI if CONFIG.invidious_companion.present? return self._post_invidious_companion("/youtubei/v1/player", data) else - return nil + return end end @@ -498,7 +498,7 @@ module YoutubeAPI # channel_b = YoutubeAPI.resolve_url("https://www.youtube.com/c/invalid") # ``` # - def resolve_url(url : String, client_config : ClientConfig | Nil = nil) + def resolve_url(url : String, client_config : ClientConfig? = nil) data = { "context" => self.make_context(nil), "url" => url, @@ -524,7 +524,7 @@ module YoutubeAPI def search( search_query : String, params : String, - client_config : ClientConfig | Nil = nil, + client_config : ClientConfig? = nil, ) # JSON Request data, required by the API data = { @@ -550,7 +550,7 @@ module YoutubeAPI def get_transcript( params : String, - client_config : ClientConfig | Nil = nil, + client_config : ClientConfig? = nil, ) : Hash(String, JSON::Any) data = { "context" => self.make_context(client_config), @@ -572,7 +572,7 @@ module YoutubeAPI def _post_json( endpoint : String, data : Hash, - client_config : ClientConfig | Nil, + client_config : ClientConfig?, ) : Hash(String, JSON::Any) # Use the default client config if nil is passed client_config ||= DEFAULT_CLIENT_CONFIG