diff --git a/docker/Dockerfile b/docker/Dockerfile
index 34549df1..57864883 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -43,7 +43,7 @@ RUN if [[ "${release}" == 1 && "${disable_quic}" == 1 ]] ; then \
FROM alpine:3.16
-RUN apk add --no-cache librsvg ttf-opensans
+RUN apk add --no-cache librsvg ttf-opensans tini
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
@@ -58,4 +58,5 @@ RUN chmod o+rX -R ./assets ./config ./locales
EXPOSE 3000
USER invidious
+ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "/invidious/invidious" ]
diff --git a/docker/Dockerfile.arm64 b/docker/Dockerfile.arm64
index ef3284b1..10135efb 100644
--- a/docker/Dockerfile.arm64
+++ b/docker/Dockerfile.arm64
@@ -42,7 +42,7 @@ RUN if [[ "${release}" == 1 && "${disable_quic}" == 1 ]] ; then \
fi
FROM alpine:3.16
-RUN apk add --no-cache librsvg ttf-opensans
+RUN apk add --no-cache librsvg ttf-opensans tini
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
@@ -57,4 +57,5 @@ RUN chmod o+rX -R ./assets ./config ./locales
EXPOSE 3000
USER invidious
+ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "/invidious/invidious" ]
diff --git a/locales/ar.json b/locales/ar.json
index 2a746e5d..e31a0e28 100644
--- a/locales/ar.json
+++ b/locales/ar.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` أعجب بهذا",
"Audio mode": "الوضع الصوتي",
"Video mode": "وضع الفيديو",
- "Videos": "الفيديوهات",
+ "channel_tab_videos_label": "الفيديوهات",
"Playlists": "قوائم التشغيل",
- "Community": "المجتمع",
+ "channel_tab_community_label": "المجتمع",
"search_filters_sort_option_relevance": "ملائمة",
"search_filters_sort_option_rating": "تقييم",
"search_filters_sort_option_date": "التاريخ",
diff --git a/locales/ca.json b/locales/ca.json
index 741414d2..2ba6ae39 100644
--- a/locales/ca.json
+++ b/locales/ca.json
@@ -51,7 +51,7 @@
"Movies": "Películes",
"Download": "Descarrega",
"Download as: ": "Descarrega com: ",
- "Videos": "Vídeos",
+ "channel_tab_videos_label": "Vídeos",
"search_filters_type_label": "Tipus",
"search_filters_duration_label": "Duració",
"search_filters_sort_label": "Ordena per",
diff --git a/locales/cs.json b/locales/cs.json
index 7538365a..466a3058 100644
--- a/locales/cs.json
+++ b/locales/cs.json
@@ -260,8 +260,8 @@
"`x` marked it with a ❤": "`x` to označil(a) se ❤",
"Audio mode": "Audiový režim",
"Video mode": "Videový režim",
- "Videos": "Videa",
- "Community": "Komunita",
+ "channel_tab_videos_label": "Videa",
+ "channel_tab_community_label": "Komunita",
"search_filters_sort_option_rating": "Hodnocení",
"search_filters_sort_option_date": "Datum nahrání",
"search_filters_sort_option_views": "Počet zhlédnutí",
diff --git a/locales/da.json b/locales/da.json
index 4816c2c9..2bee6c80 100644
--- a/locales/da.json
+++ b/locales/da.json
@@ -187,7 +187,7 @@
"Esperanto": "Esperanto",
"Czech": "Tjekkisk",
"Danish": "Dansk",
- "Community": "Samfund",
+ "channel_tab_community_label": "Samfund",
"Afrikaans": "Afrikansk",
"Portuguese": "Portugisisk",
"Ukrainian": "Ukrainsk",
@@ -267,7 +267,7 @@
"search_filters_sort_option_rating": "Bedømmelse",
"Yoruba": "Yoruba",
"Erroneous token": "Fejlagtig token",
- "Videos": "Videoer",
+ "channel_tab_videos_label": "Videoer",
"search_filters_type_option_show": "Vis",
"Luxembourgish": "Luxemboursk",
"Vietnamese": "Vietnamesisk",
diff --git a/locales/de.json b/locales/de.json
index a2070cf5..55c40905 100644
--- a/locales/de.json
+++ b/locales/de.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` markierte es mit einem ❤",
"Audio mode": "Audiomodus",
"Video mode": "Videomodus",
- "Videos": "Videos",
+ "channel_tab_videos_label": "Videos",
"Playlists": "Wiedergabelisten",
- "Community": "Gemeinschaft",
+ "channel_tab_community_label": "Gemeinschaft",
"search_filters_sort_option_relevance": "Relevanz",
"search_filters_sort_option_rating": "Bewertung",
"search_filters_sort_option_date": "Datum",
diff --git a/locales/el.json b/locales/el.json
index d91d64fc..3448a4dc 100644
--- a/locales/el.json
+++ b/locales/el.json
@@ -315,9 +315,9 @@
"`x` marked it with a ❤": "Ο χρηστης `x` έβαλε ❤",
"Audio mode": "Λειτουργία ήχου",
"Video mode": "Λειτουργία βίντεο",
- "Videos": "Βίντεο",
+ "channel_tab_videos_label": "Βίντεο",
"Playlists": "Λίστες Αναπαραγωγής",
- "Community": "Κοινότητα",
+ "channel_tab_community_label": "Κοινότητα",
"Current version: ": "Τρέχουσα έκδοση: ",
"generic_playlists_count": "{{count}} λίστα αναπαραγωγής",
"generic_playlists_count_plural": "{{count}} λίστες αναπαραγωγής",
diff --git a/locales/eo.json b/locales/eo.json
index 5aa2bbc6..1a5d9938 100644
--- a/locales/eo.json
+++ b/locales/eo.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` markis ĝin per ❤",
"Audio mode": "Aŭda reĝimo",
"Video mode": "Videa reĝimo",
- "Videos": "Filmetoj",
+ "channel_tab_videos_label": "Filmetoj",
"Playlists": "Ludlistoj",
- "Community": "Komunumo",
+ "channel_tab_community_label": "Komunumo",
"search_filters_sort_option_relevance": "rilateco",
"search_filters_sort_option_rating": "takso",
"search_filters_sort_option_date": "dato",
diff --git a/locales/es.json b/locales/es.json
index 8603e9fe..dc63619e 100644
--- a/locales/es.json
+++ b/locales/es.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` lo ha marcado con un ❤",
"Audio mode": "Modo de audio",
"Video mode": "Modo de vídeo",
- "Videos": "Vídeos",
+ "channel_tab_videos_label": "Vídeos",
"Playlists": "Listas de reproducción",
- "Community": "Comunidad",
+ "channel_tab_community_label": "Comunidad",
"search_filters_sort_option_relevance": "relevancia",
"search_filters_sort_option_rating": "valoración",
"search_filters_sort_option_date": "fecha",
diff --git a/locales/et.json b/locales/et.json
index 7beb1749..74338aba 100644
--- a/locales/et.json
+++ b/locales/et.json
@@ -296,8 +296,8 @@
"Corsican": "Korsika",
"Javanese": "Jaava",
"Lithuanian": "Leedu",
- "Videos": "Videod",
- "Community": "Kogukond",
+ "channel_tab_videos_label": "Videod",
+ "channel_tab_community_label": "Kogukond",
"CAPTCHA is a required field": "CAPTCHA on kohustuslik väli",
"comments_points_count": "{{count}} punkt",
"comments_points_count_plural": "{{count}} punkti",
diff --git a/locales/fa.json b/locales/fa.json
index 3a8f547f..f2ca2745 100644
--- a/locales/fa.json
+++ b/locales/fa.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` نشان گذاری شده با یک ❤",
"Audio mode": "حالت صدا",
"Video mode": "حالت ویدیو",
- "Videos": "ویدیو ها",
+ "channel_tab_videos_label": "ویدیو ها",
"Playlists": "سیاهههای پخش",
- "Community": "اجتماع",
+ "channel_tab_community_label": "اجتماع",
"search_filters_sort_option_relevance": "مرتبط بودن",
"search_filters_sort_option_rating": "امتیاز",
"search_filters_sort_option_date": "تاریخ بارگذاری",
diff --git a/locales/fi.json b/locales/fi.json
index bef9027f..366a2739 100644
--- a/locales/fi.json
+++ b/locales/fi.json
@@ -324,9 +324,9 @@
"`x` marked it with a ❤": "`x` merkkasi ❤:llä",
"Audio mode": "Äänitila",
"Video mode": "Videotila",
- "Videos": "Videot",
+ "channel_tab_videos_label": "Videot",
"Playlists": "Soittolistat",
- "Community": "Yhteisö",
+ "channel_tab_community_label": "Yhteisö",
"search_filters_sort_option_relevance": "Osuvuus",
"search_filters_sort_option_rating": "Arvostelu",
"search_filters_sort_option_date": "Latauspäivämäärä",
diff --git a/locales/fr.json b/locales/fr.json
index 2f384eb1..59a960d0 100644
--- a/locales/fr.json
+++ b/locales/fr.json
@@ -358,9 +358,9 @@
"`x` marked it with a ❤": "`x` l'a marqué d'un ❤",
"Audio mode": "Mode audio",
"Video mode": "Mode vidéo",
- "Videos": "Vidéos",
+ "channel_tab_videos_label": "Vidéos",
"Playlists": "Listes de lecture",
- "Community": "Communauté",
+ "channel_tab_community_label": "Communauté",
"search_filters_sort_option_relevance": "Pertinence",
"search_filters_sort_option_rating": "Notation",
"search_filters_sort_option_date": "Date d'ajout",
diff --git a/locales/he.json b/locales/he.json
index 384b2657..ab42313b 100644
--- a/locales/he.json
+++ b/locales/he.json
@@ -271,9 +271,9 @@
"`x` marked it with a ❤": "סומנה ב־❤ על ידי `x`",
"Audio mode": "Audio mode",
"Video mode": "Video mode",
- "Videos": "סרטונים",
+ "channel_tab_videos_label": "סרטונים",
"Playlists": "פלייליסטים",
- "Community": "קהילה",
+ "channel_tab_community_label": "קהילה",
"search_filters_sort_option_relevance": "רלוונטיות",
"search_filters_sort_option_rating": "דירוג",
"search_filters_sort_option_date": "תאריך העלאה",
diff --git a/locales/hi.json b/locales/hi.json
index 32ae7823..e576080f 100644
--- a/locales/hi.json
+++ b/locales/hi.json
@@ -401,12 +401,12 @@
"(edited)": "(संपादित)",
"YouTube comment permalink": "YouTube पर टिप्पणी की स्थायी कड़ी",
"permalink": "स्थायी कड़ी",
- "Videos": "वीडियो",
+ "channel_tab_videos_label": "वीडियो",
"`x` marked it with a ❤": "`x` ने इसे एक ❤ से चिह्नित किया",
"Audio mode": "ऑडियो मोड",
"Playlists": "प्लेलिस्ट्स",
"Video mode": "वीडियो मोड",
- "Community": "समुदाय",
+ "channel_tab_community_label": "समुदाय",
"search_filters_title": "फ़िल्टर",
"search_filters_date_label": "अपलोड करने का समय",
"search_filters_date_option_none": "कोई भी समय",
diff --git a/locales/hr.json b/locales/hr.json
index e42cc4f5..c8414322 100644
--- a/locales/hr.json
+++ b/locales/hr.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "Označeno sa ❤ od `x`",
"Audio mode": "Audio modus",
"Video mode": "Videomodus",
- "Videos": "Videa",
+ "channel_tab_videos_label": "Videa",
"Playlists": "Zbirke",
- "Community": "Zajednica",
+ "channel_tab_community_label": "Zajednica",
"search_filters_sort_option_relevance": "Značaj",
"search_filters_sort_option_rating": "Ocjena",
"search_filters_sort_option_date": "Datum prijenosa",
diff --git a/locales/hu-HU.json b/locales/hu-HU.json
index 19ada1d8..f93930e0 100644
--- a/locales/hu-HU.json
+++ b/locales/hu-HU.json
@@ -348,9 +348,9 @@
"`x` marked it with a ❤": "`x` ❤ jelet adott a hozzászóláshoz",
"Audio mode": "Csak hanggal",
"Video mode": "Hanggal és képpel",
- "Videos": "Videói",
+ "channel_tab_videos_label": "Videói",
"Playlists": "Lejátszási listái",
- "Community": "Közösség",
+ "channel_tab_community_label": "Közösség",
"Current version: ": "Jelenlegi verzió: ",
"preferences_quality_option_medium": "Közepes",
"preferences_quality_dash_option_auto": "Automatikus",
diff --git a/locales/id.json b/locales/id.json
index a30f0ad4..51d6d55c 100644
--- a/locales/id.json
+++ b/locales/id.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` telah ditandai dengan ❤",
"Audio mode": "Mode audio",
"Video mode": "Mode video",
- "Videos": "Video",
+ "channel_tab_videos_label": "Video",
"Playlists": "Daftar putar",
- "Community": "Komunitas",
+ "channel_tab_community_label": "Komunitas",
"search_filters_sort_option_relevance": "Relevansi",
"search_filters_sort_option_rating": "Penilaian",
"search_filters_sort_option_date": "Tanggal Unggah",
diff --git a/locales/is.json b/locales/is.json
index 99bd6574..3282eb50 100644
--- a/locales/is.json
+++ b/locales/is.json
@@ -315,9 +315,9 @@
"`x` marked it with a ❤": "`x` merkti það með ❤",
"Audio mode": "Hljóð ham",
"Video mode": "Myndband ham",
- "Videos": "Myndbönd",
+ "channel_tab_videos_label": "Myndbönd",
"Playlists": "Spilunarlistar",
- "Community": "Samfélag",
+ "channel_tab_community_label": "Samfélag",
"Current version: ": "Núverandi útgáfa: ",
"preferences_watch_history_label": "Virkja áhorfssögu: "
}
diff --git a/locales/it.json b/locales/it.json
index c195f3b9..1a0d8efc 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -344,9 +344,9 @@
"`x` marked it with a ❤": "`x` l'ha contrassegnato con un ❤",
"Audio mode": "Modalità audio",
"Video mode": "Modalità video",
- "Videos": "Video",
+ "channel_tab_videos_label": "Video",
"Playlists": "Playlist",
- "Community": "Comunità",
+ "channel_tab_community_label": "Comunità",
"search_filters_sort_option_relevance": "Pertinenza",
"search_filters_sort_option_rating": "Valutazione",
"search_filters_sort_option_date": "Data di caricamento",
diff --git a/locales/ja.json b/locales/ja.json
index 4971c472..a392abfe 100644
--- a/locales/ja.json
+++ b/locales/ja.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` が❤を込めてマークしました",
"Audio mode": "オーディオモード",
"Video mode": "ビデオモード",
- "Videos": "動画",
+ "channel_tab_videos_label": "動画",
"Playlists": "プレイリスト",
- "Community": "コミュニティ",
+ "channel_tab_community_label": "コミュニティ",
"search_filters_sort_option_relevance": "関連",
"search_filters_sort_option_rating": "評価",
"search_filters_sort_option_date": "時刻",
diff --git a/locales/ko.json b/locales/ko.json
index 28b518a2..af19fd02 100644
--- a/locales/ko.json
+++ b/locales/ko.json
@@ -2,7 +2,7 @@
"preferences_sort_label": "동영상 정렬 기준: ",
"preferences_max_results_label": "피드에 표시된 동영상 수: ",
"Redirect homepage to feed: ": "피드로 홈페이지 리디렉션: ",
- "preferences_annotations_subscribed_label": "구독한 채널에 기본적으로 특수효과를 표시하시겠습니까? ",
+ "preferences_annotations_subscribed_label": "구독한 채널에 기본으로 주석 표시: ",
"preferences_category_subscription": "구독 설정",
"preferences_automatic_instance_redirect_label": "자동 인스턴스 리디렉션 (redirect.invidious.io로 대체): ",
"preferences_thin_mode_label": "단순 모드: ",
@@ -26,7 +26,7 @@
"preferences_speed_label": "기본 속도: ",
"preferences_local_label": "비디오를 프록시: ",
"preferences_listen_label": "라디오 모드: ",
- "preferences_continue_autoplay_label": "다음 동영상 자동재생 ",
+ "preferences_continue_autoplay_label": "다음 동영상 자동재생: ",
"preferences_continue_label": "다음 동영상으로 이동: ",
"preferences_autoplay_label": "자동재생: ",
"preferences_video_loop_label": "항상 반복: ",
@@ -37,8 +37,8 @@
"Register": "회원가입",
"Sign In": "로그인",
"preferences_category_misc": "기타 설정",
- "Image CAPTCHA": "이미지 CAPTCHA",
- "Text CAPTCHA": "텍스트 CAPTCHA",
+ "Image CAPTCHA": "이미지 캡차",
+ "Text CAPTCHA": "텍스트 캡차",
"Time (h:mm:ss):": "시각 (h:mm:ss):",
"Password": "비밀번호",
"User ID": "사용자 ID",
@@ -50,15 +50,15 @@
"An alternative front-end to YouTube": "유튜브의 프론트엔드 대안",
"History": "역사",
"Delete account?": "계정을 삭제 하시겠습니까?",
- "Export data as JSON": "데이터를 JSON으로 내보내기",
- "Export subscriptions as OPML (for NewPipe & FreeTube)": "구독을 OPML로 내보내기 (NewPipe 및 FreeTube 용)",
- "Export subscriptions as OPML": "구독을 OPML로 내보내기",
+ "Export data as JSON": "JSON으로 데이터 내보내기",
+ "Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML로 구독 내보내기 (뉴파이프 및 프리튜브)",
+ "Export subscriptions as OPML": "OPML로 구독 내보내기",
"Export": "내보내기",
- "Import NewPipe data (.zip)": "NewPipe 데이터 가져오기 (.zip)",
- "Import NewPipe subscriptions (.json)": "NewPipe 구독을 가져오기 (.json)",
- "Import FreeTube subscriptions (.db)": "FreeTube 구독 가져오기 (.db)",
+ "Import NewPipe data (.zip)": "뉴파이프 데이터 가져오기 (.zip)",
+ "Import NewPipe subscriptions (.json)": "뉴파이프 구독 가져오기 (.json)",
+ "Import FreeTube subscriptions (.db)": "프리튜브 구독 가져오기 (.db)",
"Import YouTube subscriptions": "유튜브 구독 가져오기",
- "Import Invidious data": "인비디어스 JSON 데이터 가져오기",
+ "Import Invidious data": "인비디어스 데이터 가져오기 (.json)",
"Import": "가져오기",
"Import and Export Data": "데이터 가져오기 및 내보내기",
"No": "아니요",
@@ -152,7 +152,7 @@
"Report statistics: ": "통계 보고: ",
"Registration enabled: ": "등록 활성화: ",
"Login enabled: ": "로그인 활성화: ",
- "CAPTCHA enabled: ": "CAPTCHA 활성화: ",
+ "CAPTCHA enabled: ": "캡차 활성화: ",
"Top enabled: ": "Top 활성화: ",
"preferences_show_nick_label": "상단에 닉네임 표시: ",
"preferences_feed_menu_label": "피드 메뉴: ",
@@ -284,10 +284,10 @@
"Password cannot be empty": "비밀번호는 비워둘 수 없습니다",
"Please sign in using 'Log in with Google'": "'구글로 로그인'을 사용하여 로그인하세요",
"Wrong username or password": "잘못된 사용자 이름 또는 비밀번호",
- "Password is a required field": "비밀번호는 필수 필드입니다",
- "User ID is a required field": "사용자 ID는 필수 필드입니다",
- "CAPTCHA is a required field": "CAPTCHA는 필수 필드입니다",
- "Erroneous CAPTCHA": "잘못된 CAPTCHA",
+ "Password is a required field": "비밀번호는 필수 입력란입니다",
+ "User ID is a required field": "사용자 ID는 필수 입력란입니다",
+ "CAPTCHA is a required field": "캡차는 필수 입력란입니다",
+ "Erroneous CAPTCHA": "잘못된 캡차",
"Login failed. This may be because two-factor authentication is not turned on for your account.": "로그인 실패. 계정에 이중 인증이 설정되어 있지 않기 때문일 수 있습니다.",
"Blacklisted regions: ": "차단된 지역: ",
"Playlists": "재생목록",
@@ -297,7 +297,7 @@
"Empty playlist": "재생목록 비어 있음",
"Show annotations": "주석 보이기",
"Hide annotations": "주석 숨기기",
- "Switch Invidious Instance": "Invidious 인스턴스 변경",
+ "Switch Invidious Instance": "인비디어스 인스턴스 변경",
"Spanish": "스페인어",
"Southern Sotho": "소토어",
"Somali": "소말리어",
@@ -347,8 +347,8 @@
"search_filters_sort_option_date": "업로드 날짜",
"search_filters_sort_option_rating": "평점",
"search_filters_sort_option_relevance": "관련성",
- "Community": "커뮤니티",
- "Videos": "동영상",
+ "channel_tab_community_label": "커뮤니티",
+ "channel_tab_videos_label": "동영상",
"Video mode": "비디오 모드",
"Audio mode": "오디오 모드",
"permalink": "퍼머링크",
@@ -383,7 +383,7 @@
"adminprefs_modified_source_code_url_label": "수정된 소스 코드 저장소의 URL",
"search_filters_title": "필터",
"preferences_quality_dash_option_4320p": "4320p",
- "Popular enabled: ": "인기 급상승 활성화: ",
+ "Popular enabled: ": "인기 활성화: ",
"Dutch (auto-generated)": "네덜란드어 (자동 생성됨)",
"Chinese (Hong Kong)": "중국어 (홍콩)",
"Chinese (Taiwan)": "중국어 (대만)",
diff --git a/locales/lt.json b/locales/lt.json
index 35ababee..9bfcfdba 100644
--- a/locales/lt.json
+++ b/locales/lt.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` pažymėjo tai su ❤",
"Audio mode": "Garso rėžimas",
"Video mode": "Vaizdo rėžimas",
- "Videos": "Vaizdo įrašai",
+ "channel_tab_videos_label": "Vaizdo įrašai",
"Playlists": "Grojaraiščiai",
- "Community": "Bendruomenė",
+ "channel_tab_community_label": "Bendruomenė",
"search_filters_sort_option_relevance": "Aktualumas",
"search_filters_sort_option_rating": "Reitingas",
"search_filters_sort_option_date": "Įkėlimo data",
diff --git a/locales/nb-NO.json b/locales/nb-NO.json
index f4c2021b..d29cca43 100644
--- a/locales/nb-NO.json
+++ b/locales/nb-NO.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` levnet et ❤",
"Audio mode": "Lydmodus",
"Video mode": "Video-modus",
- "Videos": "Videoer",
+ "channel_tab_videos_label": "Videoer",
"Playlists": "Spillelister",
- "Community": "Gemenskap",
+ "channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "relevans",
"search_filters_sort_option_rating": "vurdering",
"search_filters_sort_option_date": "dato",
diff --git a/locales/nl.json b/locales/nl.json
index 17057553..dfc68671 100644
--- a/locales/nl.json
+++ b/locales/nl.json
@@ -320,9 +320,9 @@
"`x` marked it with a ❤": "`x` heeft dit gemarkeerd met ❤",
"Audio mode": "Audiomodus",
"Video mode": "Videomodus",
- "Videos": "Video's",
+ "channel_tab_videos_label": "Video's",
"Playlists": "Afspeellijsten",
- "Community": "Gemeenschap",
+ "channel_tab_community_label": "Gemeenschap",
"search_filters_sort_option_relevance": "relevantie",
"search_filters_sort_option_rating": "beoordeling",
"search_filters_sort_option_date": "datum",
diff --git a/locales/pl.json b/locales/pl.json
index f1a07490..6c642475 100644
--- a/locales/pl.json
+++ b/locales/pl.json
@@ -324,9 +324,9 @@
"`x` marked it with a ❤": "`x` oznaczonych ❤",
"Audio mode": "Tryb audio",
"Video mode": "Tryb wideo",
- "Videos": "Filmy",
+ "channel_tab_videos_label": "Filmy",
"Playlists": "Playlisty",
- "Community": "Społeczność",
+ "channel_tab_community_label": "Społeczność",
"search_filters_sort_option_relevance": "Trafność",
"search_filters_sort_option_rating": "Ocena",
"search_filters_sort_option_date": "Data przesłania",
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
index 41b457bb..112ed4b7 100644
--- a/locales/pt-BR.json
+++ b/locales/pt-BR.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` foi marcado como ❤",
"Audio mode": "Modo de áudio",
"Video mode": "Modo de vídeo",
- "Videos": "Vídeos",
+ "channel_tab_videos_label": "Vídeos",
"Playlists": "Listas de reprodução",
- "Community": "Comunidade",
+ "channel_tab_community_label": "Comunidade",
"search_filters_sort_option_relevance": "relevância",
"search_filters_sort_option_rating": "avaliação",
"search_filters_sort_option_date": "data",
diff --git a/locales/pt-PT.json b/locales/pt-PT.json
index 1bee2807..1788deb1 100644
--- a/locales/pt-PT.json
+++ b/locales/pt-PT.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` foi marcado como ❤",
"Audio mode": "Modo de áudio",
"Video mode": "Modo de vídeo",
- "Videos": "Vídeos",
+ "channel_tab_videos_label": "Vídeos",
"Playlists": "Listas de reprodução",
- "Community": "Comunidade",
+ "channel_tab_community_label": "Comunidade",
"search_filters_sort_option_relevance": "Relevância",
"search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_date": "Data de envio",
diff --git a/locales/pt.json b/locales/pt.json
index b550bc87..2facba94 100644
--- a/locales/pt.json
+++ b/locales/pt.json
@@ -267,9 +267,9 @@
"Next page": "Próxima página",
"last": "últimos",
"Current version: ": "Versão atual: ",
- "Community": "Comunidade",
+ "channel_tab_community_label": "Comunidade",
"Playlists": "Listas de reprodução",
- "Videos": "Vídeos",
+ "channel_tab_videos_label": "Vídeos",
"Video mode": "Modo de vídeo",
"Audio mode": "Modo de áudio",
"`x` marked it with a ❤": "`x` foi marcado como ❤",
diff --git a/locales/ro.json b/locales/ro.json
index 342f5f37..0f6407d6 100644
--- a/locales/ro.json
+++ b/locales/ro.json
@@ -315,9 +315,9 @@
"`x` marked it with a ❤": "`x` l-a marcat cu o ❤",
"Audio mode": "Mod audio",
"Video mode": "Mod video",
- "Videos": "Videoclipuri",
+ "channel_tab_videos_label": "Videoclipuri",
"Playlists": "Liste de redare",
- "Community": "Comunitate",
+ "channel_tab_community_label": "Comunitate",
"Current version: ": "Versiunea actuală: ",
"crash_page_read_the_faq": "citit lista Întrebărilor Frecvente (FAQ)",
"generic_count_days_0": "{{count}} zi",
diff --git a/locales/ru.json b/locales/ru.json
index 93c9cbec..e54937a6 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "❤ от автора канала \"`x`\"",
"Audio mode": "Аудио режим",
"Video mode": "Видео режим",
- "Videos": "Видео",
+ "channel_tab_videos_label": "Видео",
"Playlists": "Плейлисты",
- "Community": "Сообщество",
+ "channel_tab_community_label": "Сообщество",
"search_filters_sort_option_relevance": "по актуальности",
"search_filters_sort_option_rating": "по рейтингу",
"search_filters_sort_option_date": "по дате загрузки",
diff --git a/locales/sl.json b/locales/sl.json
index 5994ca1a..f27bb20d 100644
--- a/locales/sl.json
+++ b/locales/sl.json
@@ -222,7 +222,7 @@
"About": "O aplikaciji",
"%A %B %-d, %Y": "%A %-d %B %Y",
"Audio mode": "Avdio način",
- "Videos": "Videoposnetki",
+ "channel_tab_videos_label": "Videoposnetki",
"search_filters_date_label": "Datum nalaganja",
"search_filters_date_option_today": "Danes",
"search_filters_date_option_week": "Ta teden",
@@ -455,7 +455,7 @@
"Download": "Prenesi",
"permalink": "stalna povezava",
"`x` marked it with a ❤": "`x` ga je označil/a z ❤",
- "Community": "Skupnost",
+ "channel_tab_community_label": "Skupnost",
"search_filters_features_option_three_sixty": "360°",
"Video mode": "Video način",
"search_filters_features_option_c_commons": "Creative Commons",
diff --git a/locales/sq.json b/locales/sq.json
index 76dfd1b7..b8651316 100644
--- a/locales/sq.json
+++ b/locales/sq.json
@@ -259,10 +259,10 @@
"YouTube comment permalink": "Permalidhje komenti YouTube",
"Audio mode": "Mënyrë për audion",
"Playlists": "Luajlista",
- "Community": "Bashkësi",
+ "channel_tab_community_label": "Bashkësi",
"search_filters_sort_option_relevance": "Rëndësi",
"Video mode": "Mënyrë video",
- "Videos": "Video",
+ "channel_tab_videos_label": "Video",
"search_filters_sort_option_rating": "Vlerësim",
"search_filters_sort_option_date": "Datë ngarkimi",
"search_filters_sort_option_views": "Numër parjesh",
diff --git a/locales/sr.json b/locales/sr.json
index d2f990ae..fd19c493 100644
--- a/locales/sr.json
+++ b/locales/sr.json
@@ -257,7 +257,7 @@
"preferences_volume_label": "Jačina zvuka: ",
"preferences_locale_label": "Jezik: ",
"adminprefs_modified_source_code_url_label": "URL veza do skladišta sa Izmenjenom Izvornom Kodom",
- "Community": "Zajednica",
+ "channel_tab_community_label": "Zajednica",
"Video mode": "Video mod",
"Fallback captions: ": "Titl u slučaju da glavni nije dostupan: ",
"Private": "Privatno",
@@ -289,7 +289,7 @@
"Erroneous token": "Pogrešan žeton",
"Czech": "Češki",
"Latin": "Latinski",
- "Videos": "Video klipovi",
+ "channel_tab_videos_label": "Video klipovi",
"search_filters_features_option_four_k": "4К",
"footer_donate_page": "Doniraj",
"English": "Engleski",
diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json
index c0f1224f..bef9915d 100644
--- a/locales/sr_Cyrl.json
+++ b/locales/sr_Cyrl.json
@@ -245,7 +245,7 @@
"(edited)": "(измењено)",
"`x` marked it with a ❤": "`x` је означио/ла ово са ❤",
"Audio mode": "Аудио мод",
- "Videos": "Видео клипови",
+ "channel_tab_videos_label": "Видео клипови",
"search_filters_sort_option_views": "Број прегледа",
"search_filters_features_label": "Карактеристике",
"search_filters_date_option_today": "Данас",
@@ -298,7 +298,7 @@
"Ukrainian": "Украјински",
"permalink": "трајна веза",
"Pashto": "Паштунски",
- "Community": "Заједница",
+ "channel_tab_community_label": "Заједница",
"Sindhi": "Синди",
"Could not fetch comments": "Узимање коментара није успело",
"Bangla": "Бангла/Бенгалски",
diff --git a/locales/sv-SE.json b/locales/sv-SE.json
index 777899d0..39e94fd3 100644
--- a/locales/sv-SE.json
+++ b/locales/sv-SE.json
@@ -323,9 +323,9 @@
"`x` marked it with a ❤": "`x` lämnade ett ❤",
"Audio mode": "Ljudläge",
"Video mode": "Videoläge",
- "Videos": "Videor",
+ "channel_tab_videos_label": "Videor",
"Playlists": "Spellistor",
- "Community": "Gemenskap",
+ "channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "Relevans",
"search_filters_sort_option_rating": "Rankning",
"search_filters_sort_option_date": "Datum",
diff --git a/locales/tr.json b/locales/tr.json
index 17db1cf1..7dc256a9 100644
--- a/locales/tr.json
+++ b/locales/tr.json
@@ -325,9 +325,9 @@
"`x` marked it with a ❤": "`x` ❤ İle İşaretledi",
"Audio mode": "Ses Modu",
"Video mode": "Video Modu",
- "Videos": "Videolar",
+ "channel_tab_videos_label": "Videolar",
"Playlists": "Oynatma Listeleri",
- "Community": "Topluluk",
+ "channel_tab_community_label": "Topluluk",
"search_filters_sort_option_relevance": "İlgi",
"search_filters_sort_option_rating": "Değerlendirme",
"search_filters_sort_option_date": "Yükleme Tarihi",
diff --git a/locales/uk.json b/locales/uk.json
index b6994c56..d063799e 100644
--- a/locales/uk.json
+++ b/locales/uk.json
@@ -315,9 +315,9 @@
"`x` marked it with a ❤": "❤ цьому від каналу `x`",
"Audio mode": "Аудіорежим",
"Video mode": "Відеорежим",
- "Videos": "Відео",
+ "channel_tab_videos_label": "Відео",
"Playlists": "Плейлисти",
- "Community": "Спільнота",
+ "channel_tab_community_label": "Спільнота",
"Current version: ": "Поточна версія: ",
"generic_views_count_0": "{{count}} перегляд",
"generic_views_count_1": "{{count}} перегляди",
diff --git a/locales/vi.json b/locales/vi.json
index 07fcf52f..3f7125c4 100644
--- a/locales/vi.json
+++ b/locales/vi.json
@@ -311,9 +311,9 @@
"`x` marked it with a ❤": "` x` đã đánh dấu nó bằng một ❤",
"Audio mode": "Chế độ âm thanh",
"Video mode": "Chế độ quay",
- "Videos": "Video",
+ "channel_tab_videos_label": "Video",
"Playlists": "Danh sách phát",
- "Community": "Cộng đồng",
+ "channel_tab_community_label": "Cộng đồng",
"search_filters_sort_option_relevance": "liên quan",
"search_filters_sort_option_rating": "Xếp hạng",
"search_filters_sort_option_date": "ngày",
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index 7e749dc9..385f16bd 100644
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` 为此加 ❤",
"Audio mode": "音频模式",
"Video mode": "视频模式",
- "Videos": "视频",
+ "channel_tab_videos_label": "视频",
"Playlists": "播放列表",
- "Community": "社区",
+ "channel_tab_community_label": "社区",
"search_filters_sort_option_relevance": "相关度",
"search_filters_sort_option_rating": "评分",
"search_filters_sort_option_date": "上传日期",
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
index 54933701..584d4a0a 100644
--- a/locales/zh-TW.json
+++ b/locales/zh-TW.json
@@ -341,9 +341,9 @@
"`x` marked it with a ❤": "`x` 為此標記 ❤",
"Audio mode": "音訊模式",
"Video mode": "視訊模式",
- "Videos": "影片",
+ "channel_tab_videos_label": "影片",
"Playlists": "播放清單",
- "Community": "社群",
+ "channel_tab_community_label": "社群",
"search_filters_sort_option_relevance": "關聯",
"search_filters_sort_option_rating": "評分",
"search_filters_sort_option_date": "日期",
diff --git a/scripts/deploy-database.sh b/scripts/deploy-database.sh
old mode 100644
new mode 100755
diff --git a/scripts/fetch-player-dependencies.cr b/scripts/fetch-player-dependencies.cr
old mode 100644
new mode 100755
diff --git a/scripts/install-dependencies.sh b/scripts/install-dependencies.sh
old mode 100644
new mode 100755
diff --git a/src/invidious.cr b/src/invidious.cr
index 5064f0b8..d4f8e0fb 100644
--- a/src/invidious.cr
+++ b/src/invidious.cr
@@ -34,6 +34,7 @@ require "protodec/utils"
require "./invidious/database/*"
require "./invidious/database/migrations/*"
+require "./invidious/http_server/*"
require "./invidious/helpers/*"
require "./invidious/yt_backend/*"
require "./invidious/frontend/*"
diff --git a/src/invidious/http_server/utils.cr b/src/invidious/http_server/utils.cr
new file mode 100644
index 00000000..e3f1fa0f
--- /dev/null
+++ b/src/invidious/http_server/utils.cr
@@ -0,0 +1,20 @@
+module Invidious::HttpServer
+ module Utils
+ extend self
+
+ def proxy_video_url(raw_url : String, *, region : String? = nil, absolute : Bool = false)
+ url = URI.parse(raw_url)
+
+ # Add some URL parameters
+ params = url.query_params
+ params["host"] = url.host.not_nil! # Should never be nil, in theory
+ params["region"] = region if !region.nil?
+
+ if absolute
+ return "#{HOST_URL}#{url.request_target}?#{params}"
+ else
+ return "#{url.request_target}?#{params}"
+ end
+ end
+ end
+end
diff --git a/src/invidious/jsonify/api_v1/video_json.cr b/src/invidious/jsonify/api_v1/video_json.cr
index 642789aa..a2b1a35c 100644
--- a/src/invidious/jsonify/api_v1/video_json.cr
+++ b/src/invidious/jsonify/api_v1/video_json.cr
@@ -3,7 +3,7 @@ require "json"
module Invidious::JSONify::APIv1
extend self
- def video(video : Video, json : JSON::Builder, *, locale : String?)
+ def video(video : Video, json : JSON::Builder, *, locale : String?, proxy : Bool = false)
json.object do
json.field "type", video.video_type
@@ -89,7 +89,14 @@ module Invidious::JSONify::APIv1
# Not available on MPEG-4 Timed Text (`text/mp4`) streams (livestreams only)
json.field "bitrate", fmt["bitrate"].as_i.to_s if fmt["bitrate"]?
- json.field "url", fmt["url"]
+ if proxy
+ json.field "url", Invidious::HttpServer::Utils.proxy_video_url(
+ fmt["url"].to_s, absolute: true
+ )
+ else
+ json.field "url", fmt["url"]
+ end
+
json.field "itag", fmt["itag"].as_i.to_s
json.field "type", fmt["mimeType"]
json.field "clen", fmt["contentLength"]? || "-1"
diff --git a/src/invidious/routes/api/manifest.cr b/src/invidious/routes/api/manifest.cr
index ae65f10d..662d1002 100644
--- a/src/invidious/routes/api/manifest.cr
+++ b/src/invidious/routes/api/manifest.cr
@@ -29,7 +29,7 @@ module Invidious::Routes::API::Manifest
if local
uri = URI.parse(url)
- url = "#{uri.request_target}host/#{uri.host}/"
+ url = "#{HOST_URL}#{uri.request_target}host/#{uri.host}/"
end
"#{url}"
@@ -42,7 +42,7 @@ module Invidious::Routes::API::Manifest
if local
adaptive_fmts.each do |fmt|
- fmt["url"] = JSON::Any.new(URI.parse(fmt["url"].as_s).request_target)
+ fmt["url"] = JSON::Any.new("#{HOST_URL}#{URI.parse(fmt["url"].as_s).request_target}")
end
end
diff --git a/src/invidious/routes/api/v1/videos.cr b/src/invidious/routes/api/v1/videos.cr
index a6b2eb4e..79f7bd3f 100644
--- a/src/invidious/routes/api/v1/videos.cr
+++ b/src/invidious/routes/api/v1/videos.cr
@@ -6,6 +6,7 @@ module Invidious::Routes::API::V1::Videos
id = env.params.url["id"]
region = env.params.query["region"]?
+ proxy = {"1", "true"}.any? &.== env.params.query["local"]?
begin
video = get_video(id, region: region)
@@ -15,7 +16,9 @@ module Invidious::Routes::API::V1::Videos
return error_json(500, ex)
end
- video.to_json(locale, nil)
+ return JSON.build do |json|
+ Invidious::JSONify::APIv1.video(video, json, locale: locale, proxy: proxy)
+ end
end
def self.captions(env)
diff --git a/src/invidious/routes/video_playback.cr b/src/invidious/routes/video_playback.cr
index 560f9c19..1e932d11 100644
--- a/src/invidious/routes/video_playback.cr
+++ b/src/invidious/routes/video_playback.cr
@@ -35,6 +35,13 @@ module Invidious::Routes::VideoPlayback
end
end
+ # See: https://github.com/iv-org/invidious/issues/3302
+ range_header = env.request.headers["Range"]?
+ if range_header.nil?
+ range_for_head = query_params["range"]? || "0-640"
+ headers["Range"] = "bytes=#{range_for_head}"
+ end
+
client = make_client(URI.parse(host), region)
response = HTTP::Client::Response.new(500)
error = ""
@@ -70,6 +77,9 @@ module Invidious::Routes::VideoPlayback
end
end
+ # Remove the Range header added previously.
+ headers.delete("Range") if range_header.nil?
+
if response.status_code >= 400
env.response.content_type = "text/plain"
haltf env, response.status_code
@@ -91,14 +101,8 @@ module Invidious::Routes::VideoPlayback
env.response.headers["Access-Control-Allow-Origin"] = "*"
if location = resp.headers["Location"]?
- location = URI.parse(location)
- location = "#{location.request_target}&host=#{location.host}"
-
- if region
- location += "®ion=#{region}"
- end
-
- return env.redirect location
+ url = Invidious::HttpServer::Utils.proxy_video_url(location, region: region)
+ return env.redirect url
end
IO.copy(resp.body_io, env.response)
diff --git a/src/invidious/videos/parser.cr b/src/invidious/videos/parser.cr
index 5df49286..5c323975 100644
--- a/src/invidious/videos/parser.cr
+++ b/src/invidious/videos/parser.cr
@@ -66,8 +66,10 @@ def extract_video_info(video_id : String, proxy_region : String? = nil)
reason ||= subreason.try &.[]("runs").as_a.map(&.[]("text")).join("")
reason ||= player_response.dig("playabilityStatus", "reason").as_s
- # Stop here if video is not a scheduled livestream
- if !{"LIVE_STREAM_OFFLINE", "LOGIN_REQUIRED"}.any?(playability_status)
+ # Stop here if video is not a scheduled livestream or
+ # for LOGIN_REQUIRED when videoDetails element is not found because retrying won't help
+ if !{"LIVE_STREAM_OFFLINE", "LOGIN_REQUIRED"}.any?(playability_status) ||
+ playability_status == "LOGIN_REQUIRED" && !player_response.dig?("videoDetails")
return {
"version" => JSON::Any.new(Video::SCHEMA_VERSION.to_i64),
"reason" => JSON::Any.new(reason),