Commit Graph

3419 Commits

Author SHA1 Message Date
Fijxu
4a618775e4 feat: add minute badge to the watch page, right next to the title of the video (#6112)
* minute badge added to watch page

* replace time calculations with the stdlib's native functions

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

* reordered duration badge to be before audio mode toggle

* abbreviated length logic abstracted into a helper function

* space added between badge and texts

* run ameba linter

* move it between the title and listen button

* use border radius of 3px, since that is the buttons of purecss uses

* chore: move the css element to a more appropiate place + add missing support for dark mode css

* chore: hide time indicator if length_seconds is less than 0 or nil

* chore: add TODO statement for the locales

---------

Co-authored-by: discollizard <discollizard@github.com>
Co-authored-by: discollizard <49206310+discollizard@users.noreply.github.com>
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2026-11-02 00:58:01 -03:00
Aural Glow
cbaca26f24 feat: Add custom text at the bottom (footer) - contact a maintainer (#3826)
Closes https://github.com/iv-org/invidious/issues/3714

* Add footer banner message support

* Little me forgot to change the elements on both sides

* Found a way to make the footer accessible while also being cute

* Thank you @realcharmer for the suggested changes

Co-authored-by: Emil Miler <118818237+realcharmer@users.noreply.github.com>

---------

Co-authored-by: Emil Miler <118818237+realcharmer@users.noreply.github.com>
2026-11-02 00:09:53 -03:00
Fijxu
5cd55001fa chore: remove unused functions .ci_lower_bound() and .elapsed_text() (#6110)
Closes https://github.com/iv-org/invidious/issues/5898

Removes `.ci_lower_bound` and `.elapsed_text` as they are not used.

According to `crysta tool unreachable ./src/invidious.cr` you get this unused functions:

```
src/invidious/channels/channels.cr:87:3	ChannelVideo#to_xml	5 lines
src/invidious/database/migrator.cr:25:3	Invidious::Database::Migrator#pending_migrations?	6 lines
src/invidious/helpers/serialized_yt_data.cr:75:3	SearchVideo#to_xml	5 lines
src/invidious/helpers/serialized_yt_data.cr:140:3	SearchVideo#to_json	5 lines
src/invidious/helpers/serialized_yt_data.cr:146:3	SearchVideo#to_json	3 lines
src/invidious/helpers/serialized_yt_data.cr:208:3	SearchPlaylist#to_json	5 lines
src/invidious/helpers/serialized_yt_data.cr:214:3	SearchPlaylist#to_json	3 lines
src/invidious/helpers/serialized_yt_data.cr:264:3	SearchChannel#to_json	5 lines
src/invidious/helpers/serialized_yt_data.cr:270:3	SearchChannel#to_json	3 lines
src/invidious/helpers/serialized_yt_data.cr:367:3	Category#to_json	5 lines
src/invidious/helpers/serialized_yt_data.cr:373:3	Category#to_json	3 lines
src/invidious/helpers/utils.cr:4:1	::ci_lower_bound	11 lines
src/invidious/helpers/utils.cr:16:1	::elapsed_text	6 lines
src/invidious/http_server/static_assets_handler.cr:119:5	Invidious::HttpServer::StaticAssetsHandler.clear_cache	4 lines
src/invidious/playlists/playlists.cr:45:3	PlaylistVideo#to_xml	3 lines
src/invidious/playlists/playlists.cr:80:3	PlaylistVideo#to_json	3 lines
src/invidious/playlists/playlists.cr:238:3	InvidiousPlaylist#author_thumbnail	3 lines
src/invidious/user/preferences.cr:85:5	Preferences::BoolToString.to_yaml	3 lines
src/invidious/user/preferences.cr:89:5	Preferences::BoolToString.from_yaml	16 lines
src/invidious/user/preferences.cr:116:5	Preferences::ClampInt.to_yaml	3 lines
src/invidious/user/preferences.cr:120:5	Preferences::ClampInt.from_yaml	3 lines
src/invidious/user/preferences.cr:178:5	Preferences::ProcessString.to_yaml	3 lines
src/invidious/user/preferences.cr:182:5	Preferences::ProcessString.from_yaml	3 lines
src/invidious/user/preferences.cr:209:5	Preferences::StringToArray.to_yaml	7 lines
src/invidious/user/preferences.cr:217:5	Preferences::StringToArray.from_yaml	24 lines
src/invidious/videos/parser.cr:137:3	Invidious::Videos::Parser#try_fetch_streaming_data	19 lines
src/invidious/videos/videos.cr:51:3	Video#to_json	3 lines
src/invidious/yt_backend/extractors_utils.cr:71:1	::extract_category	3 lines
src/invidious/yt_backend/extractors_utils.cr:76:1	::extract_category	5 lines
src/invidious/yt_backend/youtube_api.cr:272:5	YoutubeAPI::ClientConfig#to_s	6 lines
```

But most of them are useful for future use, so no need to remove them. `.ci_lower_bound` and `.elapsed_text` are safe to remove.
2026-11-01 17:12:36 -03:00
Fijxu
64ee76c9f7 fix: fix the OPML export for FreeTube (#6109)
Fixes the OPML export for FreeTube as FreeTube uses `https://www.youtube.com/feeds/videos.xml?channel_id=` URL for the `xmlUrl` in their exports.
2026-10-31 19:17:03 -03:00
Fijxu
fcec088154 chore: move FreeTube OPML export to Invidious::User::Export module (#6107) 2026-10-31 18:37:47 -03:00
Fijxu
a1d7429f07 chore+fix: Fix wrong filename for exported subscriptions that are not NewPipe and set correct filenames and extensions for each export
Closes https://github.com/iv-org/invidious/issues/6105
2026-10-31 17:55:10 -03:00
Fijxu
ad96695869 chore: convert Invidious::User::Export#to_invidious to a struct
Closes https://github.com/iv-org/invidious/issues/6104

Part of code cleaning of issue https://github.com/iv-org/invidious/issues/5744
2026-10-31 17:39:35 -03:00
unrealtournament
1dc3335ce6 Add subscription JSON export for NewPipe (#5826)
The current option to export subscriptions for NewPipe (`Export subscriptions as OPML (for NewPipe & FreeTube)`) isn't accepted by NewPipe anymore. As far as I can tell, NewPipe only accepts importing from its own SQLite database, from Google Account CSV export and from its own JSON export format. This is mentioned in https://github.com/iv-org/invidious/issues/5438.

This PR adds support to export subscriptions in the NewPipe compatible format. I'm looking for input on a few points:
- I'm not a huge fan of hardcoding the NewPipe version in the export, but it is required by NewPipe to recognize it as a valid file. If someone has a better idea I'm all ears but I think it's the only way. In any case, NewPipe can import formats in a backwards compatible way in the future so it shouldn't be a huge deal.
- I haven't checked if the OPML export option actually works for FreeTube. If it doesn't, it should probably be removed altogether, for now I just removed the `(for NewPipe)` part.
- The translations would need to be updated, but I don't know how that is handled in this project so I need some help there.

The new format looks like this:
```
{
  "subscriptions": [
    {
      "service_id": 0,
      "url": "https://www.youtube.com/channel/UCHnyfMqiRRG1u-2MsSQLbXA",
      "name": "Veritasium"
    },
    {
      "service_id": 0,
      "url": "https://www.youtube.com/channel/UC6nSFpj9HTCZ5t-N3Rm3-HA",
      "name": "Vsauce"
    }
  ],
  "app_version": "0.29.0",
  "app_version_int": 1014
}
```


* add subscription json export for NewPipe

* remove old newpipe export format

* make newpipe export values constant

* remove duplicate export option, add i18n keys

* Convert to_newpipe to a serializable struct

* Use same naming format as NewPipe for the exported subscriptions

---------

Co-authored-by: Fijxu <fijxu@nadeko.net>
2026-10-31 17:34:46 -03:00
Fijxu
9f0b4c89f7 chore: Encapsulate more functions into their own modules and improve spec files (#6046)
* chore: Encapsulate more functions into their own modules and improve specs

* update path for required .cr file in search/hastag_spec.cr

* make the linter happy

* Align PR changes with the current source code
2026-10-31 15:44:45 -03:00
Fijxu
1c4b41f960 chore: remove hd720 quality (#6098)
Removes HD720 quality selection as Youtube removed their combined video+audio video that was 720p. Now the only available is `360p`, which is `medium` quality.

```bash
curl -v --request POST   --url 'http://127.0.0.1:8282/companion/youtubei/v1/player'   --header 'Authorization: Bearer aaaaaaaaaaaaaaaa'   --header 'Content-Type: application/json' --data '{ "videoId": "w8pldQdmJLU" }' | jq ".streamingData.formats"
```

```json
[
  {
    "itag": 18,
    "url": "https://rr5---sn-bg0s7ns7.googlevideo.com/videoplayback?expire=1792812370&ei=8tDbar3yB_KZ1sQP8uOj8Qs&ip=XXX.XXX.XXX.XXX&id=o-APoOBo3WyyLXjPSe0Xl2-xCsyWMXchaMPRmTj4UkJLIz&itag=18&source=youtube&requiressl=yes&xpc=EgVo2aDSNQ%3D%3D&cps=287&met=1792790770%2C&mh=Jl&mm=31%2C29&mn=sn-bg0s7ns7%2Csn-nja7sne6&ms=au%2Crdu&mv=m&mvi=5&pl=24&rms=au%2Cau&initcwndbps=1035875&bui=AWzQHwpX4VrhBTsG4T0oAvHR1r5mZV7dm9zuppZNtDgE-Rtl3uRA0ZdG0dB-9qxIXIvldmCzBxn5z56X&spc=mpRQ_2sfg4_5MN9L7ud3V7iopLB8etaGr4oP8_ybjBJXsh5x2m3s7S0vAvyCaReTumAvCPjh&vprv=1&svpuc=1&mime=video%2Fmp4&ns=-vYnufuN-GgbAW4adIGA9qkZ&rqh=1&cnr=14&ratebypass=yes&dur=922.528&lmt=1777285489878458&mt=1792790257&fvip=2&fexp=51565116%2C52184237&c=TVHTML5_SIMPLY&sefc=1&txp=5538534&n=OmKOje1BMpTH1A&sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cxpc%2Cbui%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cns%2Crqh%2Ccnr%2Cratebypass%2Cdur%2Clmt&sig=AE0s2JYwRgIhAJtYiKwBsjK4CvpjZOl5S_8xCj_AistOGOTnAzsNTQVKAiEA7C00y1m2vnleOHitHEYDeqCwWdr9tL0ziE-uUF6TS4Y%3D&lsparams=cps%2Cmet%2Cmh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Crms%2Cinitcwndbps&lsig=APaTxxMwRQIhAP5bBhB-vi5vVQwqNts5AinZONLEnjUGgLh95gwih1PUAiBkzkyrObM9E92u3_EyeoVXrl8yhSjMWUP0uZYliiNOlA%3D%3D&pot=Mo4ElVvWMMqFrkWVH96K2MVfm9IX1lFWMzlSGzKrGVtqZJmyrZpPrWxuRkzAlF0qfnhyZLx10LtIcXfkhjDr_n0cX2i8QSX5ua_bxwJAvzlBs5c6ONqI85Txc7xcm_fHKbWh_WO_MoUcdO5vwD4ON62PeBou5Kf9i-vdjQIvAV06WxjdAYuVjllHBrixE2bb20tcAFWxbeBMc4L3ZAjx2JL8JVpXhtUKUh34q2Zr33-u6FHtsItK1f-4T-OYTI8p0sk5w07LGYKWcgf0PlDJy_In2tIfYSyM1oQpd64uSxXKLk0igNIAg7ulbjmNGnmY2Q1lENO2wXWUhs8d-uPqJjzgfd6Fcb9LZE03qACgKxR_HqWJImaI0fcFfYmj22zaib-tIX6KHL0ntAu1lrjoURaIU4CO_cXI5S_S4LfS37d62tcK8GFeobMKfiA92tMCVxjQymVEVQJ7n8QqbUn7b6XYAXjUp8N-Aj_RBiEh8Yy18kTkEYpx7uR9gusxxjH68Q-zAAE2p1iGhOU_XwUB9J9rqjrs4vdBqONw4WLqhVTzd24s4lACPHXClw3x9lYZPJDy9a82XMZImcVDkVN0w0cJMD9ssbep9rBJnhcwRKBIzwFSH282Nod-hIJ5Edj4azcT0zmHwdXyXq6bmENuQymZ8U8bAcU6I0d4XD1GxmQoHwCkbsiXuBnC2pBcsjvu3w%3D%3D&cver=1.0&alr=no",
    "mimeType": "video/mp4; codecs=\"avc1.42001E, mp4a.40.2\"",
    "bitrate": 213181,
    "width": 640,
    "height": 360,
    "lastModified": "1777285489878458",
    "quality": "medium",
    "fps": 24,
    "qualityLabel": "360p",
    "projectionType": "RECTANGULAR",
    "audioQuality": "AUDIO_QUALITY_LOW",
    "approxDurationMs": "922528",
    "audioSampleRate": "44100",
    "audioChannels": 2,
    "qualityOrdinal": "QUALITY_ORDINAL_360P"
  }
]
```

(ip query parameter anonymized to `XXX.XXX.XXX.XXX`, not a real IP of course.)
2026-10-25 22:19:48 -03:00
Cameron Radmore
87cadfd813 feat(channel): add support for shows tab (#6033)
* feat(channel): add support for shows tab

* feat: add support for /show/ urls

* chore(docs): add comment for GridShowRenderer and fix format

* fix: check that shows tabs exists before trying to fetch/parse

* fix: Remove `thumbnaiext`

This property doesn't exist.

Not exactly sure how it happened but I'm guessing I combined thumbnailOverlays and text somehow when I was doing a find and replace (Ctrl + H) and then formatting json with prettier
2026-10-23 19:53:05 -03:00
Fijxu
bf3fbea466 fix: fix warnings from deprecations across Crystal versions (#6100) 2026-10-23 19:46:24 -03:00
Fijxu
66fed560e1 chore: Completely remove Reddit from Invidious (#6087)
* chore: Completely remove Reddit from Invidious

* chore: remove reddit from config.example.yml

* fix comment preferences for nojs

* Add fallback for people that used reddit in the comments API and their preferences

* add missing TODO

* chore: remove unused swap_comments JS function from watch.js

* remove blank line
2026-10-23 19:05:40 -03:00
Alex Epelde
3c9555de30 fix: remove fake Content-Length header for non-2xx image responses (#6062)
* fix: remove Content-Length header for non-2xx image responses

it's a lie

* fix: remove check

---------

Co-authored-by: Fijxu <fijxu@nadeko.net>
2026-10-22 00:42:03 -03:00
Fijxu
57cc097022 chore: Add Video ID validation to imported watched videos and improve SQL query 2026-10-13 08:06:23 -03:00
Fijxu
907fe54aab chore: update to ameba 1.7.0 and adapt most of the code to it (#6082)
* chore: update to ameba 1.7.0 and adapt most of the code to it

* forgot to add this to build ameba into the ./bin directory for use, as ameba does not longer offer a postinstall script

* forgot to update ameba in the shards files

* remove leftover : in rescue

* Use ameba linter action instead of installing it with shards
2026-10-13 06:14:16 -03:00
Fijxu
c88230067b fix: Also add User-Agent for ytimg.com requests (#6038)
* fix: Also add User-Agent for ytimg.com requests, excluding youtube cookies

* strictly match only youtube.com and ytimg.com subdomains
2026-09-16 00:28:31 -03:00
Fijxu
e4ad826f1f chore: lint and remove unused variables 2026-09-14 23:38:43 -03:00
Fijxu
b052ced0b4 feat: show message for unsupported Crystal versions at compile time (#5909)
Show a nice message for unsupported versions of the Crystal compiler, encouraging the user compiling Invidious, to update it's Crystal compiler version.
2026-09-14 23:07:10 -03:00
Fijxu
47756e0d1e chore: Update headers sent to innertube in JSON requests (#6040)
* chore: Update headers sent to innertube in JSON requests

* it should be a String, not a Bool
2026-09-14 23:05:07 -03:00
Fijxu
f3e6d6d84e feat: sanity check video IDs with regex (#6037)
* feat: sanity check video IDs with regex

* Return 400 instead

* fix wrong function

* add coderabbit suggestion about PCRE2 regex and length of the string with a new line

* Use validate_video_id on more places

* Add video id validation to /watch route.
2026-09-14 23:04:25 -03:00
Fijxu
821365cf71 chore: removed unused locale argument in #get_about_info function (#5902) 2026-08-17 01:49:17 -04:00
TheFrenchGhosty
4b014bdc82 Enable the Uzbek since it's been translated at more than 20% (#5891) 2026-08-03 23:03:45 +02:00
Émilien (perso)
1a3cb60282 feat: add support for SOCKS5 proxy (#5865) 2026-08-03 22:43:18 +02:00
Fijxu
cb88a805e5 feat: allow setting videojs max buffer length via config.yml (#5876) 2026-08-03 15:52:50 -04:00
Fijxu
b4b6e992fc fix: fix rendered links and timestamps in video descriptions (#5878)
* Revert "Fix disappearing end of the comments with emoji (#5587)"

This reverts commit 86c425b43f.

* fix: fix rendered links and timestamps in video descriptions
2026-08-03 15:43:50 -04:00
Fijxu
9c70265a9a fix: add missing HTML.escape call for commit 4501c9d 2026-08-03 15:24:47 -04:00
syeopite
4501c9df9c Show message when comments are turned off (#4051)
* Add error message when comments are disabled

* Add btn to try reddit comments when yt is disabled

* Escape warning messages for disabled comments

* Add missing semicolons

* Update comment detection to not use msg renderer

* Use short syntax for comment entry-point detection

Co-authored-by: Samantaz Fox <coding@samantaz.fr>

* Condense try-reddit-comments-link HTML in player.js

Co-authored-by: Samantaz Fox <coding@samantaz.fr>

* Improve locale keys for comments disabled messages

Co-authored-by: Samantaz Fox <coding@samantaz.fr>

* Remove extra whitespace

* Use button instead of anchor for try reddit link

* Request Reddit comm when yt disabled during nojs=1

* Change order of commentsEnabled in parse results

* Lint

* Rebase error

* update the naming of the comments section in Innertube

Downstreamed from 36ac67610d

---------

Co-authored-by: Samantaz Fox <coding@samantaz.fr>
Co-authored-by: Fijxu <fijxu@nadeko.net>
2026-08-03 15:18:13 -04:00
TheFrenchGhosty
986471320d Enable the new locales translated at more than 20% (#5882)
* Enable the new locales translated at more than 20%

* Align all the comments on column 43
2026-08-03 19:34:57 +02:00
Fijxu
47b5d79ec7 fix: also fix comments community posts. (#5874)
Community posts comments still preserve the old author thumbnails
format that has an Array of thumbnails. I forgot to check that as I had
no idea `comments_youtube.cr` was also used for community posts comments

```json
"authorThumbnail": {
    "thumbnails": [
        {
            "url": "//yt3.googleusercontent.com/ytc/AIdro_m9CJFVl3bEWvGnNnN4G9ErBO2lTpKePWCjx_FQtLWaDww=s32-c-k-c0x00ffffff-no-rj-mo",
            "width": 32,
            "height": 32
        },
        {
            "url": "//yt3.googleusercontent.com/ytc/AIdro_m9CJFVl3bEWvGnNnN4G9ErBO2lTpKePWCjx_FQtLWaDww=s48-c-k-c0x00ffffff-no-rj-mo",
            "width": 48,
            "height": 48
        },
        {
            "url": "//yt3.googleusercontent.com/ytc/AIdro_m9CJFVl3bEWvGnNnN4G9ErBO2lTpKePWCjx_FQtLWaDww=s76-c-k-c0x00ffffff-no-rj-mo",
            "width": 76,
            "height": 76
        }
    ],
    "accessibility": {
        "accessibilityData": {
            "label": "SomeOrdinaryGamers"
        }
    }
},
```
2026-08-02 21:09:15 -04:00
Fijxu
21a3434850 fix: skip non comment commentFilterContextViewModel key in comments (#5870)
Some YouTube videos like https://www.youtube.com/watch?v=Ajkr_Wg-k8g
had an non comment key that was inside the Array that contained some
comment information that Invidious parses (like comment_key and
toolbar_key), that being the `commentFilterContextViewModel` key, which
is just an indicator on how comments are sorted:

```
{
    "commentThreadRenderer": { ... } <- comment information that is
    handled by line 134 of youtube.cr
},
{
    "commentFilterContextViewModel": {
        "text": {
            "content": "Top is selected, so you'll see featured comments"
        },
        "accessibility": {
            "accessibilityData": {
                "label": "Top is selected, so you'll see featured comments"
            }
        }
    } <- Useless information, this is not a comment
}
```
2026-08-02 16:20:43 -04:00
Fijxu
51dd4fefd0 fix: fix comments html rendering (#5862)
Now the structure no longer has an array of author thumbnails, is a
single URL:

```json
"author": {
    "channelId": "UCiLGHgWdQvfl1G8BPgcO55w",
    "displayName": "@uber_nerd-l7r",
    "avatarThumbnailUrl": "https://yt3.ggpht.com/ee1_iFgiBvgKHUr3r0_qUVqUpGKhDZaePYq8Q4tIsyVS9L1oRHHJLcHtXrSxyS63AmvldKicbw=s88-c-k-c0x00ffffff-no-rj",
    "isVerified": false,
    "isCurrentUser": false,
    "isCreator": false,
```
2026-08-02 03:48:25 -04:00
Fijxu
40378a2dc0 Fix lint and formatting 2026-08-01 21:29:31 -04:00
gabe4278
adfec7646b Hotfix - Fix YouTube change(#5818)
Co-authored-by: TheFrenchGhosty <47571719+TheFrenchGhosty@users.noreply.github.com>
2026-07-23 06:04:24 +02:00
bunchy7ss
30c0656a93 Hotfix - Fix YouTube change (#5819)
Credit to https://git.miningtcup.me/MiningTcup
2026-07-23 05:57:07 +02:00
absidue
9e8d102c94 Fix videos being incorrectly labelled as isUpcoming = true (#5800) 2026-07-11 07:33:23 +02:00
Fijxu
9c62c8b660 Add option to disable easy to abuse API endpoints (#5630)
* Add option to disable easy to abuse API endpoints

The API endpoints that will be disabled when this option are:
 - /api/v1/videos
 - /api/v1/clips
 - /api/v1/transcripts

There is still API endponts that need some sort of validation or
connection/proxying to Invidious companion like
`/api/v1/captions` and `/api/v1/storyboards` since they also do a video
request to Invidious companion. I'm not sure if the `/next` API endpoint
could be used to gather that type of information, if so, that would be
better.

Closes #5599

* Rename configuration variable, add additional comment for the option
2026-06-30 11:55:47 +02:00
unrealtournament
d61dd7205c [RefreshChannelsJob] Reduce backoff if no errors occur (#5759)
* [RefreshChannelsJob] Reduce backoff if no errors occur

* Change log level for backoff decrease
2026-06-30 10:29:03 +02:00
Émilien (perso)
77ad41678b fix: security issue playlist deletion cross user (#5790)
fixes #5777
2026-06-30 10:28:51 +02:00
Fijxu
ab099e46cf chore: update User-Agent header for Youtube requests (#5794) 2026-06-30 10:28:26 +02:00
Fijxu
08f862292a fix: fix playlists not showing any videos due to outdated playlist parsing (#5774)
* TODO, CHANGE COMMIT MESSAGE WHEN DONE

* save

* fix: fix playlists videos parsing

* revert text

* do not shadow outer item variable
2026-06-24 23:54:34 -04:00
Fijxu
c435dc1204 fix: fix private invidious playlists on rss feeds from being fetched without authentication (#5776) 2026-06-14 22:31:22 -04:00
Jan Moesen
6dec63a3e5 Use “www.youtube.com” consistently (#5768)
Saves an unnecessary redirect by using `www.youtube.com` on some parts of Invidious where `youtube.com` was used instead. youtube.com will redirect to www.youtube.com anyways.

Co-authored-by: janmoesen <@>
2026-06-09 16:25:27 -04:00
Fijxu
98f4f118b2 Add support for alternative domains for Invidious cookies (#5647)
* Add support for alternative domains for Invidious cookies

* check if @@secure is already true before changing it's value

* Add alternative_domains config option example
2026-06-04 19:59:32 -04:00
Fijxu
85534a988d Only include '&' if params are present (#5646) 2026-06-03 18:18:57 -04:00
Fijxu
e96ad036ca fix: Do not append query params quality=medium to videos that are about to premiere (#5755)
* fix: Do not append query params `quality=medium` to videos that are about to premiere

Video premieres do not have `audio_streams` and they aren't `video.live_now == true` either,
therefore we skip the checks that are made for older videos (`if audio_streams.empty? && !video.live_now` closure)
if the video is a premiere.

This commit also adds the `microformat` field to the `info` instance
variable of the `Video` struct, since it's needed for the function
`Video#premiere_timestamp : Time?`. This is more like a quick fix than a
proper fix because in `Invidious::Videos::Parser#parse_video_info`,
`premiere_timestamp` is gathered from the `microformat` JSON Object but
is used to set the `published` hash key for the `params` variable.

The parsers and structs really need a rework :/

* Revert "fix: Do not append query params `quality=medium` to videos that are about to premiere"

This reverts commit 5cfc8dace8.

* chore: build premiere_timestamp using video_type and published time
2026-05-30 15:49:21 -04:00
Fijxu
3a35552a66 fix: fix wrong call to I18n.translate() function 2026-05-29 23:51:34 -04:00
Fijxu
8ef5ea03d4 feat: Add support for POST requests on searches for privacy (#5551)
Use already set preferences variable

Use span for description, grammar fix from Copilot
2026-05-29 23:48:11 -04:00
shiny-comic
86c425b43f Fix disappearing end of the comments with emoji (#5587)
Previous code use UTF-8 to count characters however Emojis are UTF-16 units.
This difference leads to misalignment of index offsets.

Co-authored-by: shiny-comic <shiny-comic@winPC>
2026-05-28 16:51:06 -04:00
Fijxu
4ae227ce91 Encapsulate videos parser and clip functions inside it's own Invidious::Videos::Parser and Invidious::Videos::Clip module (#5745)
Part of https://github.com/iv-org/invidious/issues/5744
2026-05-28 13:11:41 -04:00