summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--assets/css/default.css204
-rw-r--r--assets/css/embed.css16
-rw-r--r--assets/css/player.css250
-rw-r--r--assets/css/videojs-mobile-ui.css7
-rw-r--r--assets/js/player.js67
-rw-r--r--assets/js/videojs-mobile-ui.min.js7
-rw-r--r--docker/Dockerfile7
-rw-r--r--locales/ar.json101
-rw-r--r--locales/bn_BD.json3
-rw-r--r--locales/cs.json169
-rw-r--r--locales/da.json5
-rw-r--r--locales/de.json75
-rw-r--r--locales/el.json5
-rw-r--r--locales/en-US.json3
-rw-r--r--locales/eo.json3
-rw-r--r--locales/es.json3
-rw-r--r--locales/eu.json3
-rw-r--r--locales/fa.json3
-rw-r--r--locales/fi.json3
-rw-r--r--locales/fr.json15
-rw-r--r--locales/he.json5
-rw-r--r--locales/hr.json3
-rw-r--r--locales/hu-HU.json3
-rw-r--r--locales/id.json5
-rw-r--r--locales/is.json5
-rw-r--r--locales/it.json59
-rw-r--r--locales/ja.json15
-rw-r--r--locales/nb-NO.json95
-rw-r--r--locales/nl.json3
-rw-r--r--locales/pl.json3
-rw-r--r--locales/pt-BR.json17
-rw-r--r--locales/pt-PT.json3
-rw-r--r--locales/ro.json3
-rw-r--r--locales/ru.json3
-rw-r--r--locales/si.json3
-rw-r--r--locales/sk.json3
-rw-r--r--locales/sr.json3
-rw-r--r--locales/sr_Cyrl.json3
-rw-r--r--locales/sv-SE.json51
-rw-r--r--locales/tr.json3
-rw-r--r--locales/uk.json3
-rw-r--r--locales/zh-CN.json3
-rw-r--r--locales/zh-TW.json3
-rw-r--r--src/invidious/comments.cr8
-rw-r--r--src/invidious/helpers/helpers.cr3
-rw-r--r--src/invidious/users.cr1
-rw-r--r--src/invidious/videos.cr8
-rw-r--r--src/invidious/views/components/player_sources.ecr3
-rw-r--r--src/invidious/views/licenses.ecr14
-rw-r--r--src/invidious/views/preferences.ecr6
-rw-r--r--src/invidious/views/search_homepage.ecr2
-rw-r--r--src/invidious/views/watch.ecr27
53 files changed, 839 insertions, 481 deletions
diff --git a/README.md b/README.md
index ba6c1be5..8dc5e0f5 100644
--- a/README.md
+++ b/README.md
@@ -95,7 +95,7 @@ The complete documentation is available on https://docs.invidious.io/ (or altern
## Contact:
-Feel free to join our [Matrix room](https://matrix.to/#/#invidious:matrix.org), or #invidious on freenode. Both platforms are bridged together.
+Feel free to join our [Matrix room](https://matrix.to/#/#invidious:matrix.org).
---
diff --git a/assets/css/default.css b/assets/css/default.css
index a725b456..07a879bb 100644
--- a/assets/css/default.css
+++ b/assets/css/default.css
@@ -310,194 +310,15 @@ footer a {
}
}
-/* Control Bar */
-@media screen and (max-width: 640px) {
- .video-js .vjs-control-bar,
- .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
- overflow-x: scroll;
- }
-}
-
-ul.vjs-menu-content::-webkit-scrollbar {
- display: none;
-}
-
-.vjs-user-inactive {
- cursor: none;
-}
-
-.video-js .vjs-text-track-display > div > div > div {
- background-color: rgba(0, 0, 0, 0.75) !important;
- border-radius: 9px !important;
- padding: 5px !important;
-}
-
-.vjs-play-control,
-.vjs-volume-panel,
-.vjs-current-time,
-.vjs-time-control,
-.vjs-duration,
-.vjs-progress-control,
-.vjs-remaining-time {
- order: 1;
-}
-
-.vjs-captions-button {
- order: 2;
-}
-
-.vjs-quality-selector,
-.video-js .vjs-http-source-selector {
- order: 3;
-}
-
-.vjs-playback-rate {
- order: 4;
-}
-
-.vjs-share-control {
- order: 5;
-}
-
-.vjs-fullscreen-control {
- order: 6;
-}
-
-.vjs-playback-rate > .vjs-menu {
- width: 50px;
-}
-
-.vjs-control-bar {
- display: flex;
- flex-direction: row;
- scrollbar-width: none;
-}
-
-.vjs-control-bar::-webkit-scrollbar {
- display: none;
-}
-
-.video-js .vjs-icon-cog {
- font-size: 18px;
-}
-
-.video-js .vjs-control-bar,
-.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
- background-color: rgba(35, 35, 35, 0.75);
-}
-
-.vjs-menu li.vjs-menu-item:focus,
-.vjs-menu li.vjs-menu-item:hover {
- background-color: rgba(255, 255, 255, 0.75);
- color: rgba(49, 49, 51, 0.75);
-}
-
-.vjs-menu li.vjs-selected,
-.vjs-menu li.vjs-selected:focus,
-.vjs-menu li.vjs-selected:hover {
- background-color: rgba(0, 182, 240, 0.75);
-}
-
-/* Progress Bar */
-.video-js .vjs-slider {
- background-color: rgba(15, 15, 15, 0.5);
-}
-
fieldset > select,
span > select {
color: rgba(49, 49, 51, 1);
}
-.video-js .vjs-load-progress,
-.video-js .vjs-load-progress div {
- background: rgba(87, 87, 88, 1);
-}
-
-.video-js .vjs-slider:hover,
-.video-js button:hover {
- color: rgba(0, 182, 240, 1);
-}
-
-.video-js .vjs-play-progress {
- background-color: rgba(0, 182, 240, 1);
-}
-
-/* Overlay */
-.video-js .vjs-overlay {
- background-color: rgba(35, 35, 35, 0.75);
- color: rgba(255, 255, 255, 1);
-}
-
-/* ProgressBar marker */
-.vjs-marker {
- background-color: rgba(255, 255, 255, 1);
- z-index: 0;
-}
-
-/* Big "Play" Button */
-.video-js .vjs-big-play-button {
- background-color: rgba(35, 35, 35, 0.5);
-}
-
-.video-js:hover .vjs-big-play-button {
- background-color: rgba(35, 35, 35, 0.75);
-}
-
-.video-js .vjs-current-time,
-.video-js .vjs-time-divider,
-.video-js .vjs-duration {
- display: block;
-}
-
-.video-js .vjs-time-divider {
- min-width: 0px;
- padding-left: 0px;
- padding-right: 0px;
-}
-
-.video-js .vjs-poster {
- background-size: cover;
- object-fit: cover;
-}
-
-.player-dimensions.vjs-fluid {
- padding-top: 82vh;
-}
-
-video.video-js {
- position: absolute;
- height: 100%;
-}
-
-#player-container {
- position: relative;
- padding-bottom: 82vh;
- height: 0;
-}
-
.pure-control-group label {
word-wrap: normal;
}
-.video-js.player-style-invidious {
- /* This is already the default */
-}
-
-.video-js.player-style-youtube .vjs-control-bar {
- display: flex;
- flex-direction: row;
-}
-.video-js.player-style-youtube .vjs-big-play-button {
- /*
- Styles copied from video-js.min.css, definition of
- .vjs-big-play-centered .vjs-big-play-button
- */
- top: 50%;
- left: 50%;
- margin-top: -0.81666em;
- margin-left: -1.5em;
-}
-
/*
* Light theme
*/
@@ -669,3 +490,28 @@ See https://stackoverflow.com/a/34372979 for more info */
hr {
margin: auto 0 auto 0;
}
+
+/* Description Expansion Styling*/
+#description-box {
+ display: flex;
+ flex-direction: column;
+}
+
+#descexpansionbutton {
+ display: none
+}
+
+#descexpansionbutton ~ div {
+ overflow: hidden;
+ height: 8.3em;
+}
+
+#descexpansionbutton:checked ~ div {
+ overflow: unset;
+ height: 100%;
+}
+
+#descexpansionbutton + label {
+ order: 1;
+ margin-top: 20px;
+}
diff --git a/assets/css/embed.css b/assets/css/embed.css
index 12fefe58..466a284a 100644
--- a/assets/css/embed.css
+++ b/assets/css/embed.css
@@ -8,3 +8,19 @@
height: auto;
z-index: -100;
}
+
+.watch-on-invidious {
+ font-size: 1.3em !important;
+ font-weight: bold;
+ white-space: nowrap;
+ margin: 0 1em 0 1em !important;
+ order: 3;
+}
+
+.watch-on-invidious > a {
+ color: white;
+}
+
+.watch-on-invidious > a:hover {
+ color: rgba(0, 182, 240, 1);;
+}
diff --git a/assets/css/player.css b/assets/css/player.css
new file mode 100644
index 00000000..656fb48c
--- /dev/null
+++ b/assets/css/player.css
@@ -0,0 +1,250 @@
+/* Youtube player style */
+.video-js.player-style-youtube .vjs-progress-control {
+ height: 0;
+}
+
+.video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control {
+ position: absolute;
+ right: 0;
+ left: 0;
+ width: 100%;
+ margin: 0;
+}
+
+.video-js.player-style-youtube .vjs-control-bar {
+ background: linear-gradient(rgba(0,0,0,0.1), rgba(0, 0, 0,0.5));
+}
+
+.video-js.player-style-youtube .vjs-slider {
+ background-color: rgba(255,255,255,0.2);
+}
+
+.video-js.player-style-youtube .vjs-load-progress > div {
+ background-color: rgba(255,255,255,0.5);
+}
+
+.video-js.player-style-youtube .vjs-play-progress {
+ background-color: red;
+}
+
+.video-js.player-style-youtube .vjs-progress-control:hover .vjs-progress-holder {
+ font-size: 15px;
+}
+
+.video-js.player-style-youtube .vjs-control-bar > .vjs-spacer {
+ flex: 1;
+ order: 2;
+}
+
+.video-js.player-style-youtube .vjs-play-progress .vjs-time-tooltip {
+ display: none;
+}
+
+.video-js.player-style-youtube .vjs-play-progress::before {
+ color: red;
+ font-size: 0.85em;
+ display: none;
+}
+
+.video-js.player-style-youtube .vjs-progress-holder:hover .vjs-play-progress::before {
+ display: unset;
+}
+
+.video-js.player-style-youtube .vjs-control-bar {
+ display: flex;
+ flex-direction: row;
+}
+
+.video-js.player-style-youtube .vjs-big-play-button {
+ /*
+ Styles copied from video-js.min.css, definition of
+ .vjs-big-play-centered .vjs-big-play-button
+ */
+ top: 50%;
+ left: 50%;
+ margin-top: -0.81666em;
+ margin-left: -1.5em;
+}
+
+.video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu {
+ margin-bottom: 2em;
+}
+
+ul.vjs-menu-content::-webkit-scrollbar {
+ display: none;
+}
+
+.vjs-user-inactive {
+ cursor: none;
+}
+
+.video-js .vjs-text-track-display > div > div > div {
+ background-color: rgba(0, 0, 0, 0.75) !important;
+ border-radius: 9px !important;
+ padding: 5px !important;
+}
+
+.vjs-play-control,
+.vjs-volume-panel,
+.vjs-current-time,
+.vjs-time-control,
+.vjs-duration,
+.vjs-progress-control,
+.vjs-remaining-time {
+ order: 1;
+}
+
+.vjs-captions-button {
+ order: 2;
+}
+
+.vjs-quality-selector,
+.video-js .vjs-http-source-selector {
+ order: 3;
+}
+
+.vjs-playback-rate {
+ order: 4;
+}
+
+.vjs-share-control {
+ order: 5;
+}
+
+.vjs-fullscreen-control {
+ order: 6;
+}
+
+.vjs-playback-rate > .vjs-menu {
+ width: 50px;
+}
+
+.vjs-control-bar {
+ display: flex;
+ flex-direction: row;
+ scrollbar-width: none;
+}
+
+.vjs-control-bar::-webkit-scrollbar {
+ display: none;
+}
+
+.video-js .vjs-icon-cog {
+ font-size: 18px;
+}
+
+.video-js .vjs-control-bar,
+.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+ background-color: rgba(35, 35, 35, 0.75);
+}
+
+.vjs-menu li.vjs-menu-item:focus,
+.vjs-menu li.vjs-menu-item:hover {
+ background-color: rgba(255, 255, 255, 0.75);
+ color: rgba(49, 49, 51, 0.75);
+}
+
+.vjs-menu li.vjs-selected,
+.vjs-menu li.vjs-selected:focus,
+.vjs-menu li.vjs-selected:hover {
+ background-color: rgba(0, 182, 240, 0.75);
+}
+
+/* Progress Bar */
+.video-js .vjs-slider {
+ background-color: rgba(15, 15, 15, 0.5);
+}
+
+.video-js .vjs-load-progress,
+.video-js .vjs-load-progress div {
+ background: rgba(87, 87, 88, 1);
+}
+
+.video-js .vjs-slider:hover,
+.video-js button:hover {
+ color: rgba(0, 182, 240, 1);
+}
+
+.video-js.player-style-invidious .vjs-play-progress {
+ background-color: rgba(0, 182, 240, 1);
+}
+vjs-menu-content
+/* Overlay */
+.video-js .vjs-overlay {
+ background-color: rgba(35, 35, 35, 0.75);
+ color: rgba(255, 255, 255, 1);
+}
+
+/* ProgressBar marker */
+.vjs-marker {
+ background-color: rgba(255, 255, 255, 1);
+ z-index: 0;
+}
+
+/* Big "Play" Button */
+.video-js .vjs-big-play-button {
+ background-color: rgba(35, 35, 35, 0.5);
+}
+
+.video-js:hover .vjs-big-play-button {
+ background-color: rgba(35, 35, 35, 0.75);
+}
+
+.video-js .vjs-current-time,
+.video-js .vjs-time-divider,
+.video-js .vjs-duration {
+ display: block;
+}
+
+.video-js .vjs-time-divider {
+ min-width: 0px;
+ padding-left: 0px;
+ padding-right: 0px;
+}
+
+.video-js .vjs-poster {
+ background-size: cover;
+ object-fit: cover;
+}
+
+.player-dimensions.vjs-fluid {
+ padding-top: 82vh;
+}
+
+video.video-js {
+ position: absolute;
+ height: 100%;
+}
+
+#player-container {
+ position: relative;
+ padding-bottom: 82vh;
+ height: 0;
+}
+
+.mobile-operations-bar {
+ display: flex;
+ position: absolute;
+ top: 0;
+ right: 1px !important;
+ left: initial !important;
+ width: initial !important;
+}
+
+.mobile-operations-bar ul {
+ position: absolute !important;
+ bottom: unset !important;
+ top: 1.5em;
+}
+
+@media screen and (max-width: 700px) {
+ .video-js .vjs-share {
+ justify-content: unset;
+ }
+}
+
+@media screen and (max-width: 650px) {
+ .vjs-modal-dialog-content {
+ overflow-x: hidden;
+ }
+}
diff --git a/assets/css/videojs-mobile-ui.css b/assets/css/videojs-mobile-ui.css
new file mode 100644
index 00000000..c307274a
--- /dev/null
+++ b/assets/css/videojs-mobile-ui.css
@@ -0,0 +1,7 @@
+/**
+ * videojs-mobile-ui
+ * @version 0.5.2
+ * @copyright 2021 mister-ben <git@misterben.me>
+ * @license MIT
+ */
+@keyframes fadeAndScale{0%{opacity:0}25%{opacity:1}100%{opacity:0}}.video-js.vjs-has-started .vjs-touch-overlay{position:absolute;pointer-events:auto;top:0}.video-js .vjs-touch-overlay{display:block;width:100%;height:100%;pointer-events:none}.video-js .vjs-touch-overlay.skip{opacity:0;animation:fadeAndScale 0.6s linear;background-repeat:no-repeat;background-position:80% center;background-size:10%;background-image:url('data:image/svg+xml;utf8,<svg fill="%23FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z"/><path d="M0 0h24v24H0z" fill="none"/></svg>')}.video-js .vjs-touch-overlay.skip.reverse{background-position:20% center;background-image:url('data:image/svg+xml;utf8,<svg fill="%23FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z"/><path d="M0 0h24v24H0z" fill="none"/></svg>')}.video-js .vjs-touch-overlay .vjs-play-control{top:50%;left:50%;transform:translate(-50%, -50%);position:absolute;width:30%;height:80%;pointer-events:none;opacity:0;transition:opacity 0.3s ease}.video-js .vjs-touch-overlay .vjs-play-control .vjs-icon-placeholder::before{content:'';background-size:60%;background-position:center center;background-repeat:no-repeat;background-image:url('data:image/svg+xml;utf8,<svg fill="%23FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z"/><path d="M0 0h24v24H0z" fill="none"/></svg>')}.video-js .vjs-touch-overlay .vjs-play-control.vjs-paused .vjs-icon-placeholder::before{content:'';background-image:url('data:image/svg+xml;utf8,<svg fill="%23FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M8 5v14l11-7z"/><path d="M0 0h24v24H0z" fill="none"/></svg>')}.video-js .vjs-touch-overlay .vjs-play-control.vjs-ended .vjs-icon-placeholder::before{content:'';background-image:url('data:image/svg+xml;utf8,<svg fill="%23FFFFFF" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/></svg>')}.video-js .vjs-touch-overlay.show-play-toggle .vjs-play-control{opacity:1;pointer-events:auto}.video-js.vjs-mobile-ui-disable-end.vjs-ended .vjs-touch-overlay{display:none}
diff --git a/assets/js/player.js b/assets/js/player.js
index 1c6e336c..a6d0c8c1 100644
--- a/assets/js/player.js
+++ b/assets/js/player.js
@@ -14,6 +14,7 @@ var options = {
'durationDisplay',
'progressControl',
'remainingTimeDisplay',
+ 'Spacer',
'captionsButton',
'qualitySelector',
'playbackRateMenuButton',
@@ -73,6 +74,55 @@ if (location.pathname.startsWith('/embed/')) {
});
}
+// Detect mobile users and initalize mobileUi for better UX
+// Detection code taken from https://stackoverflow.com/a/20293441
+
+function isMobile() {
+ try{ document.createEvent("TouchEvent"); return true; }
+ catch(e){ return false; }
+}
+
+if (isMobile()) {
+ player.mobileUi();
+
+ buttons = ["playToggle", "volumePanel", "captionsButton"];
+
+ if (video_data.params.quality !== 'dash') {
+ buttons.push("qualitySelector")
+ }
+
+ // Create new control bar object for operation buttons
+ const ControlBar = videojs.getComponent("controlBar");
+ let operations_bar = new ControlBar(player, {
+ children: [],
+ playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0]
+ });
+ buttons.slice(1).forEach(child => operations_bar.addChild(child))
+
+ // Remove operation buttons from primary control bar
+ primary_control_bar = player.getChild("controlBar");
+ buttons.forEach(child => primary_control_bar.removeChild(child));
+
+ operations_bar_element = operations_bar.el();
+ operations_bar_element.className += " mobile-operations-bar"
+ player.addChild(operations_bar)
+
+ // Playback menu doesn't work when its initalized outside of the primary control bar
+ playback_element = document.getElementsByClassName("vjs-playback-rate")[0]
+ operations_bar_element.append(playback_element)
+
+ // The share and http source selector element can't be fetched till the players ready.
+ player.one("playing", () => {
+ share_element = document.getElementsByClassName("vjs-share-control")[0]
+ operations_bar_element.append(share_element)
+
+ if (video_data.params.quality === 'dash') {
+ http_source_selector = document.getElementsByClassName("vjs-http-source-selector vjs-menu-button")[0]
+ operations_bar_element.append(http_source_selector)
+ }
+ })
+}
+
player.on('error', function (event) {
if (player.error().code === 2 || player.error().code === 4) {
setTimeout(function (event) {
@@ -566,3 +616,20 @@ if (navigator.vendor == "Apple Computer, Inc." && video_data.params.listen) {
});
});
}
+
+// Watch on Invidious link
+if (window.location.pathname.startsWith("/embed/")) {
+ const Button = videojs.getComponent('Button');
+ let watch_on_invidious_button = new Button(player);
+
+ // Create hyperlink for current instance
+ redirect_element = document.createElement("a");
+ redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
+ redirect_element.appendChild(document.createTextNode("Invidious"))
+
+ watch_on_invidious_button.el().appendChild(redirect_element)
+ watch_on_invidious_button.addClass("watch-on-invidious")
+
+ cb = player.getChild('ControlBar')
+ cb.addChild(watch_on_invidious_button)
+};
diff --git a/assets/js/videojs-mobile-ui.min.js b/assets/js/videojs-mobile-ui.min.js
new file mode 100644
index 00000000..e624fbe2
--- /dev/null
+++ b/assets/js/videojs-mobile-ui.min.js
@@ -0,0 +1,7 @@
+/**
+ * videojs-mobile-ui
+ * @version 0.5.2
+ * @copyright 2021 mister-ben <git@misterben.me>
+ * @license MIT
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("video.js"),require("global/window")):"function"==typeof define&&define.amd?define(["video.js","global/window"],t):e.videojsMobileUi=t(e.videojs,e.window)}(this,function(e,t){"use strict";e=e&&e.hasOwnProperty("default")?e.default:e,t=t&&t.hasOwnProperty("default")?t.default:t;var n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},o=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},i=e.getComponent("Component"),r=e.dom||e,a=function(e){function i(t,r){n(this,i);var a=o(this,e.call(this,t,r));return a.seekSeconds=r.seekSeconds,a.tapTimeout=r.tapTimeout,a.addChild("playToggle",{}),t.on(["playing","userinactive"],function(e){a.removeClass("show-play-toggle")}),0===a.player_.options_.inactivityTimeout&&(a.player_.options_.inactivityTimeout=5e3),a.enable(),a}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(i,e),i.prototype.createEl=function(){return r.createEl("div",{className:"vjs-touch-overlay",tabIndex:-1})},i.prototype.handleTap=function(e){var n=this;e.target===this.el_&&(e.preventDefault(),this.firstTapCaptured?(this.firstTapCaptured=!1,this.timeout&&t.clearTimeout(this.timeout),this.handleDoubleTap(e)):(this.firstTapCaptured=!0,this.timeout=t.setTimeout(function(){n.firstTapCaptured=!1,n.handleSingleTap(e)},this.tapTimeout)))},i.prototype.handleSingleTap=function(e){this.removeClass("skip"),this.toggleClass("show-play-toggle")},i.prototype.handleDoubleTap=function(e){var n=this,o=this.el_.getBoundingClientRect(),i=e.changedTouches[0].clientX-o.left;if(i<.4*o.width)this.player_.currentTime(Math.max(0,this.player_.currentTime()-this.seekSeconds)),this.addClass("reverse");else{if(!(i>o.width-.4*o.width))return;this.player_.currentTime(Math.min(this.player_.duration(),this.player_.currentTime()+this.seekSeconds)),this.removeClass("reverse")}this.removeClass("show-play-toggle"),this.removeClass("skip"),t.requestAnimationFrame(function(){n.addClass("skip")})},i.prototype.enable=function(){this.firstTapCaptured=!1,this.on("touchend",this.handleTap)},i.prototype.disable=function(){this.off("touchend",this.handleTap)},i}(i);i.registerComponent("TouchOverlay",a);var s={fullscreen:{enterOnRotate:!0,exitOnRotate:!0,lockOnRotate:!0,iOS:!1},touchControls:{seekSeconds:10,tapTimeout:300,disableOnEnd:!1}},l=t.screen,u=function(n,o){n.addClass("vjs-mobile-ui"),(o.touchControls.disableOnEnd||"function"==typeof n.endscreen)&&n.addClass("vjs-mobile-ui-disable-end"),o.fullscreen.iOS&&e.browser.IS_IOS&&e.browser.IOS_VERSION>9&&!n.el_.ownerDocument.querySelector(".bc-iframe")&&(n.tech_.el_.setAttribute("playsinline","playsinline"),n.tech_.supportsFullScreen=function(){return!1});var i=void 0,r=e.VERSION.split("."),a=parseInt(r[0],10),s=parseInt(r[1],10);i=a<7||7===a&&s<7?Array.prototype.indexOf.call(n.el_.children,n.getChild("ControlBar").el_):n.children_.indexOf(n.getChild("ControlBar")),n.addChild("TouchOverlay",o.touchControls,i);var u=!1,c=function(){var i="number"==typeof t.orientation?t.orientation:l&&l.orientation&&l.orientation.angle?t.orientation:(e.log("angle unknown"),0);90!==i&&270!==i&&-90!==i||!o.enterOnRotate||!1===n.paused()&&(n.requestFullscreen(),o.fullscreen.lockOnRotate&&l.orientation&&l.orientation.lock&&l.orientation.lock("landscape").then(function(){u=!0}).catch(function(){e.log("orientation lock not allowed")})),0!==i&&180!==i||!o.exitOnRotate||n.isFullscreen()&&n.exitFullscreen()};e.browser.IS_IOS?t.addEventListener("orientationchange",c):l.orientation&&(l.orientation.onchange=c),n.on("ended",function(e){!0===u&&(l.orientation.unlock(),u=!1)})},c=function(){var t=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};(n.forceForTesting||e.browser.IS_ANDROID||e.browser.IS_IOS)&&this.ready(function(){u(t,e.mergeOptions(s,n))})};return(e.registerPlugin||e.plugin)("mobileUi",c),c.VERSION="0.5.2",c}); \ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 01abc6f5..87884403 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -18,13 +18,14 @@ RUN apk add --no-cache librsvg ttf-opensans
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
-COPY --chown=invidious ./assets/ ./assets/
+COPY ./assets/ ./assets/
COPY --chown=invidious ./config/config.* ./config/
RUN mv -n config/config.example.yml config/config.yml
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
-COPY --chown=invidious ./config/sql/ ./config/sql/
-COPY --chown=invidious ./locales/ ./locales/
+COPY ./config/sql/ ./config/sql/
+COPY ./locales/ ./locales/
COPY --from=builder /invidious/invidious .
+RUN chmod o+rX -R ./assets ./config ./locales
EXPOSE 3000
USER invidious
diff --git a/locales/ar.json b/locales/ar.json
index 540e4df0..7ce297b9 100644
--- a/locales/ar.json
+++ b/locales/ar.json
@@ -4,79 +4,80 @@
"": "`x` المشتركين"
},
"`x` videos": {
- "([^.,0-9]|^)1([^.,0-9]|$)": "`x` الفيديوهات",
- "": "`x` الفيديوهات"
+ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` المقاطع المرئيَّة",
+ "": "`x` المقاطع المرئيَّة"
},
"`x` playlists": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` قوائم التشغيل",
"": "`x` قوائم التشغيل"
},
- "LIVE": "مباشر",
- "Shared `x` ago": "تم رفع الفيديو منذ `x`",
+ "LIVE": "مُباشِر",
+ "Shared `x` ago": "تمَّ رفع المقطع المرئيّ مُنذ `x`",
"Unsubscribe": "إلغاء الإشتراك",
- "Subscribe": "إشتراك",
+ "Subscribe": "الإشتراك",
"View channel on YouTube": "زيارة القناة على موقع يوتيوب",
"View playlist on YouTube": "عرض قائمة التشغيل على اليوتيوب",
"newest": "الأجدد",
"oldest": "الأقدم",
"popular": "الأكثر شعبية",
- "last": "اخر قوائم التشغيل المعدلة",
- "Next page": "الصفحة الثانية",
+ "last": "الأخيرة",
+ "Next page": "الصفحة التالية",
"Previous page": "الصفحة السابقة",
- "Clear watch history?": "مسح السجل ؟",
- "New password": "الرقم السرى الجديد",
- "New passwords must match": "الأرقام السرية يجب ان تكون متطابقة",
- "Cannot change password for Google accounts": "لا يستطيع تغيير الرقم السرى لحساب جوجل",
- "Authorize token?": "رمز الإذن ؟",
- "Authorize token for `x`?": "تصريح الرمز لـ `x` ؟",
+ "Clear watch history?": "هل تريد محو سجل المشاهدة؟",
+ "New password": "كلمة مرور جديدة",
+ "New passwords must match": "يَجبُ أن تكون كلمتي المرور متطابقتان",
+ "Cannot change password for Google accounts": "لا يُمكن تغيير كلمة المرور لِحسابات جوجل",
+ "Authorize token?": "رمز التفويض؟",
+ "Authorize token for `x`?": "رمز التفويض لِـ `x` ؟",
"Yes": "نعم",
"No": "لا",
- "Import and Export Data": "استخراج و إضافة البيانات",
- "Import": "إضافة",
- "Import Invidious data": "إضافة بيانات Invidious",
- "Import YouTube subscriptions": "إضافةالإشتراكات من موقع يوتيوب",
- "Import FreeTube subscriptions (.db)": "إضافةالمشتركين من FreeTube (.db)",
- "Import NewPipe subscriptions (.json)": "إضافة المشتركين من NewPipe (.json)",
- "Import NewPipe data (.zip)": "إضافة بيانات NewPipe (.zip)",
- "Export": "استخراج",
- "Export subscriptions as OPML": "استخراج المشتركين كـ OPML",
- "Export subscriptions as OPML (for NewPipe & FreeTube)": "استخراج المشتركين كـ OPML (لـ NewPipe و FreeTube)",
- "Export data as JSON": "استخراج البيانات كـ JSON",
- "Delete account?": "حذف الحساب ؟",
- "History": "السجل",
- "An alternative front-end to YouTube": "البديل الكامل لموقع يوتيوب",
- "JavaScript license information": "معلومات ترخيص JavaScript",
+ "Import and Export Data": "اِستيراد البيانات وتصديرها",
+ "Import": "استيراد",
+ "Import Invidious data": "استيراد بيانات انفيدياس",
+ "Import YouTube subscriptions": "استيراد اشتراكات يوتيوب",
+ "Import FreeTube subscriptions (.db)": "استيراد اشتراكات فريتيوب (.db)",
+ "Import NewPipe subscriptions (.json)": "استيراد اشتراكات نيو بايب (.json)",
+ "Import NewPipe data (.zip)": "استيراد بيانات نيو بايب (.zip)",
+ "Export": "تصدير",
+ "Export subscriptions as OPML": "تصدير الاشتراكات كَـ OPML",
+ "Export subscriptions as OPML (for NewPipe & FreeTube)": "تصدير الاشتراكات كَـ OPML (لِنيو بايب و فريتيوب)",
+ "Export data as JSON": "تصدير البيانات بتنسيق JSON",
+ "Delete account?": "حذف الحساب؟",
+ "History": "السِّجل",
+ "An alternative front-end to YouTube": "واجهة أمامية بديلة لموقع يوتيوب",
+ "JavaScript license information": "معلومات ترخيص جافا سكربت",
"source": "المصدر",
"Log in": "تسجيل الدخول",
- "Log in/register": "تسجيل الدخول\\إنشاء حساب",
- "Log in with Google": "تسجيل الدخول بإستخدام جوجل",
- "User ID": "إسم المستخدم",
- "Password": "الرقم السرى",
- "Time (h:mm:ss):": "(يجب ان يكتب مثل هذا التنسيق) الوقت (h(ساعات):mm(دقائق):ss(ثوانى)):",
- "Text CAPTCHA": "CAPTCHA كلامية",
- "Image CAPTCHA": "CAPTCHA صورية",
+ "Log in/register": "تسجيل الدخول \\ إنشاء حساب",
+ "Log in with Google": "تسجيل الدخول باستخدام جوجل",
+ "User ID": "مُعرِّف المُستخدم",
+ "Password": "كلمة المرور",
+ "Time (h:mm:ss):": "الوقت (h:mm:ss):",
+ "Text CAPTCHA": "نص الكابتشا",
+ "Image CAPTCHA": "صورة الكابتشا",
"Sign In": "تسجيل الدخول",
- "Register": "انشاء الحساب",
- "E-mail": "الإيميل",
+ "Register": "التسجيل",
+ "E-mail": "البريد الإلكتروني",
"Google verification code": "رمز تحقق جوجل",
"Preferences": "التفضيلات",
- "Player preferences": "التفضيلات المشغل",
- "Always loop: ": "كرر الفيديو دائما: ",
- "Autoplay: ": "تشغيل تلقائى: ",
- "Play next by default: ": "شغل الفيديو التالي تلقائيا: ",
- "Autoplay next video: ": "شغل الفيديو التالي تلقائيا (في قوائم التشغيل) ",
- "Listen by default: ": "تشغيل النسخة السمعية تلقائى: ",
- "Proxy videos: ": "عرض الفيديوهات عن طريق البروكسي؟ ",
+ "Player preferences": "التفضيلات المُشغِّل",
+ "Always loop: ": "كرر المقطع المرئيّ دائما: ",
+ "Autoplay: ": "تشغيل تلقائي: ",
+ "Play next by default: ": "شغل المقطع التالي تلقائيًا: ",
+ "Autoplay next video: ": "شغل المقطع التالي تلقائيًا: ",
+ "Listen by default: ": "تشغيل النسخة السمعية تلقائيًا: ",
+ "Proxy videos: ": "بروكسي المقاطع المرئيّة؟ ",
"Default speed: ": "السرعة الإفتراضية: ",
- "Preferred video quality: ": "الجودة المفضلة للفيديوهات: ",
+ "Preferred video quality: ": "الجودة المفضلة للمقاطع: ",
"Player volume: ": "صوت المشغل: ",
- "Default comments: ": "إضهار التعليقات الإفتراضية لـ: ",
+ "Default comments: ": "التعليقات الإفتراضية: ",
"youtube": "يوتيوب",
- "reddit": "Reddit",
- "Default captions: ": "الترجمات الإفتراضية: ",
- "Fallback captions: ": "الترجمات المصاحبة: ",
+ "reddit": "ريديت",
+ "Default captions: ": "التسميات التوضيحية الإفتراضية: ",
+ "Fallback captions: ": "التسميات التوضيحية الاحتياطيَّة: ",
"Show related videos: ": "اعرض الفيديوهات ذات الصلة: ",
"Show annotations by default: ": "اعرض الملاحظات في الفيديو تلقائيا: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "التفضيلات المرئية",
"Player style: ": "شكل مشغل الفيديوهات: ",
"Dark mode: ": "الوضع الليلى: ",
@@ -156,6 +157,8 @@
"Title": "العنوان",
"Playlist privacy": "إعدادات الخصوصيه",
"Editing playlist `x`": "تعديل قائمه التشفيل `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
"Hide annotations": "إخفاء الملاحظات فى الفيديو",
"Show annotations": "عرض الملاحظات فى الفيديو",
diff --git a/locales/bn_BD.json b/locales/bn_BD.json
index 1c1cc274..b6df0470 100644
--- a/locales/bn_BD.json
+++ b/locales/bn_BD.json
@@ -71,6 +71,7 @@
"Fallback captions: ": "",
"Show related videos: ": "",
"Show annotations by default: ": "",
+ "Automatically extend video description: ": "",
"Visual preferences": "",
"Player style: ": "",
"Dark mode: ": "",
@@ -144,6 +145,8 @@
"Title": "",
"Playlist privacy": "",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "",
"Hide annotations": "",
"Show annotations": "",
diff --git a/locales/cs.json b/locales/cs.json
index 802249ef..7e0a31a4 100644
--- a/locales/cs.json
+++ b/locales/cs.json
@@ -8,15 +8,15 @@
"": "`x` videí."
},
"`x` playlists": {
- "([^.,0-9]|^)1([^.,0-9]|$)": "",
- "": ""
+ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` playlist",
+ "": "`x` playlisty."
},
"LIVE": "ŽIVĚ",
- "Shared `x` ago": "",
+ "Shared `x` ago": "Sdíleno před `x`",
"Unsubscribe": "Odhlásit odběr",
"Subscribe": "Odebírat",
"View channel on YouTube": "Otevřít kanál na YouTube",
- "View playlist on YouTube": "",
+ "View playlist on YouTube": "Zobrazit playlist na YouTube",
"newest": "nejnovější",
"oldest": "nejstarší",
"popular": "populární",
@@ -28,7 +28,7 @@
"New passwords must match": "Hesla se musí schodovat",
"Cannot change password for Google accounts": "Nelze změnit heslo pro účty Google",
"Authorize token?": "Autorizovat token?",
- "Authorize token for `x`?": "",
+ "Authorize token for `x`?": "Autorizovat token pro `x`?",
"Yes": "Ano",
"No": "Ne",
"Import and Export Data": "Import a Export údajů",
@@ -63,107 +63,110 @@
"Player preferences": "Nastavení přehravače",
"Always loop: ": "Vždy opakovat: ",
"Autoplay: ": "Automatické přehrávání: ",
- "Play next by default: ": "",
- "Autoplay next video: ": "",
- "Listen by default: ": "",
- "Proxy videos: ": "",
- "Default speed: ": "",
- "Preferred video quality: ": "",
+ "Play next by default: ": "Přehrát další ve výchozím stavu: ",
+ "Autoplay next video: ": "Automaticky přehrát další video: ",
+ "Listen by default: ": "Poslouchat ve výchozím nastavení: ",
+ "Proxy videos: ": "Video přes proxy: ",
+ "Default speed: ": "Základní Rychlost: ",
+ "Preferred video quality: ": "Preferovaná kvalita videa: ",
"Player volume: ": "Hlasitost přehrávače: ",
- "Default comments: ": "",
- "youtube": "youtube",
+ "Default comments: ": "Předpřipravené komentáře: ",
+ "youtube": "YouTube",
"reddit": "reddit",
- "Default captions: ": "",
- "Fallback captions: ": "",
+ "Default captions: ": "Standartní Titulky: ",
+ "Fallback captions: ": "Záložní titulky: ",
"Show related videos: ": "Zobrazit podobné videa: ",
- "Show annotations by default: ": "",
- "Visual preferences": "",
+ "Show annotations by default: ": "Zobrazovat poznámky ve výchozím nastavení: ",
+ "Automatically extend video description: ": "Rozšířit automaticky popis u videa: ",
+ "Visual preferences": "Nastavení vzhledu",
"Player style: ": "Styl přehrávače ",
"Dark mode: ": "Tmavý režim ",
- "Theme: ": "",
- "dark": "",
- "light": "",
- "Thin mode: ": "",
- "Subscription preferences": "",
- "Show annotations by default for subscribed channels: ": "",
- "Redirect homepage to feed: ": "",
- "Number of videos shown in feed: ": "",
+ "Theme: ": "Vzhled: ",
+ "dark": "tmavý",
+ "light": "světlý",
+ "Thin mode: ": "Kompaktní režim: ",
+ "Subscription preferences": "Nastavení předplatných",
+ "Show annotations by default for subscribed channels: ": "Ve výchozím nastavení zobrazovat poznámky u odebíraných kanálů: ",
+ "Redirect homepage to feed: ": "Přesměrovávat domovskou stránku na informační kanál: ",
+ "Number of videos shown in feed: ": "Počet videí zobrazovaných v informačním kanále: ",
"Sort videos by: ": "Roztřídit videa podle: ",
"published": "publikováno",
- "published - reverse": "",
+ "published - reverse": "podle publikování - obrátit",
"alphabetically": "podle abecedy",
- "alphabetically - reverse": "",
+ "alphabetically - reverse": "podle abecedy - převrátit",
"channel name": "název kanálu",
- "channel name - reverse": "",
+ "channel name - reverse": "podle jména kanálu - převrátit",
"Only show latest video from channel: ": "Jenom zobrazit nejnovjejší video z kanálu: ",
- "Only show latest unwatched video from channel: ": "",
- "Only show unwatched: ": "",
- "Only show notifications (if there are any): ": "",
+ "Only show latest unwatched video from channel: ": "Zobrazit jen nejnovější nezhlédnuté video z daného kanálu: ",
+ "Only show unwatched: ": "Zobrazit jen již nezhlédnuté: ",
+ "Only show notifications (if there are any): ": "Zobrazit pouze upozornění (pokud nějaká jsou): ",
"Enable web notifications": "Povolit webové upozornění",
"`x` uploaded a video": "`x` nahrál(a) video",
"`x` is live": "`x` je živě",
- "Data preferences": "",
+ "Data preferences": "Nastavení dat",
"Clear watch history": "Smazat historii",
- "Import/export data": "",
+ "Import/export data": "importovat/exportovat data",
"Change password": "Změnit heslo",
- "Manage subscriptions": "",
- "Manage tokens": "",
- "Watch history": "",
- "Delete account": "",
- "Administrator preferences": "",
- "Default homepage: ": "",
- "Feed menu: ": "",
+ "Manage subscriptions": "Spravovat odebírané kanály",
+ "Manage tokens": "Spravovat klíče",
+ "Watch history": "Historie Sledování",
+ "Delete account": "Smazat Účet",
+ "Administrator preferences": "Administrátorská nastavení",
+ "Default homepage: ": "Základní domovská stránka: ",
+ "Feed menu: ": "Menu doporučených: ",
"Top enabled: ": "",
- "CAPTCHA enabled: ": "",
- "Login enabled: ": "",
- "Registration enabled: ": "",
- "Report statistics: ": "",
- "Save preferences": "",
- "Subscription manager": "",
- "Token manager": "",
- "Token": "",
+ "CAPTCHA enabled: ": "CAPTCHA povolena: ",
+ "Login enabled: ": "Přihlášení povoleno: ",
+ "Registration enabled: ": "Registrace povolena ",
+ "Report statistics: ": "Oznámit statistiky: ",
+ "Save preferences": "Uložit nastavení",
+ "Subscription manager": "Správa Odběrů",
+ "Token manager": "Správa klíčů",
+ "Token": "Klíč",
"`x` subscriptions": {
- "([^.,0-9]|^)1([^.,0-9]|$)": "",
- "": ""
+ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` Odběry.([^.,0-9]|^)1([^.,0-9]|$)",
+ "": "`x` Odebíraných kanálů."
},
"`x` tokens": {
- "([^.,0-9]|^)1([^.,0-9]|$)": "",
- "": ""
+ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` Klíčů",
+ "": "`x` klíčů."
},
- "Import/export": "",
- "unsubscribe": "",
- "revoke": "",
- "Subscriptions": "",
+ "Import/export": "Importovat/exportovat",
+ "unsubscribe": "odhlásit odběr",
+ "revoke": "vrátit zpět",
+ "Subscriptions": "Odběry",
"`x` unseen notifications": {
- "([^.,0-9]|^)1([^.,0-9]|$)": "",
- "": ""
+ "([^.,0-9]|^)1([^.,0-9]|$)": "`x` nezhlédnutých oznámení",
+ "": "`x` nezhlédnutých oznámení."
},
- "search": "",
- "Log out": "",
- "Released under the AGPLv3 by Omar Roth.": "",
- "Source available here.": "",
- "View JavaScript license information.": "",
- "View privacy policy.": "",
- "Trending": "",
- "Public": "",
- "Unlisted": "",
- "Private": "",
- "View all playlists": "",
- "Updated `x` ago": "",
- "Delete playlist `x`?": "",
- "Delete playlist": "",
- "Create playlist": "",
- "Title": "",
+ "search": "hledat",
+ "Log out": "Odhlásit se",
+ "Released under the AGPLv3 by Omar Roth.": "Vydáno Omarem Roth pod AGPLv3.",
+ "Source available here.": "Zdrojový kód dostupný zde.",
+ "View JavaScript license information.": "Zobrazit informace o licenci JavaScript .",
+ "View privacy policy.": "Zobrazit Zásady ochrany osobních údajů.",
+ "Trending": "Trendy",
+ "Public": "Veřejné",
+ "Unlisted": "Nevypsáno",
+ "Private": "Soukromé",
+ "View all playlists": "Zobrazit všechny playlisty",
+ "Updated `x` ago": "Aktualizováno před `x`",
+ "Delete playlist `x`?": "Smazat playlist `x`?",
+ "Delete playlist": "Smazat playlist",
+ "Create playlist": "Vytvořit playlist",
+ "Title": "Název",
"Playlist privacy": "",
- "Editing playlist `x`": "",
- "Watch on YouTube": "",
- "Hide annotations": "",
- "Show annotations": "",
- "Genre: ": "",
- "License: ": "",
- "Family friendly? ": "",
+ "Editing playlist `x`": "Upravování playlistu `x`",
+ "Show more": "Zobrazit více",
+ "Show less": "Zobrazit méně",
+ "Watch on YouTube": "Sledovat na YouTube",
+ "Hide annotations": "Skrýt vysvětlivky",
+ "Show annotations": "Zobrazit vysvětlivky",
+ "Genre: ": "Žánr: ",
+ "License: ": "Licence: ",
+ "Family friendly? ": "Vhodné pro děti? ",
"Wilson score: ": "",
- "Engagement: ": "",
+ "Engagement: ": "Závaznost: ",
"Whitelisted regions: ": "",
"Blacklisted regions: ": "",
"Shared `x`": "",
@@ -412,4 +415,4 @@
"hdr": "HDR",
"filter": "filtr",
"Current version: ": ""
-} \ No newline at end of file
+}
diff --git a/locales/da.json b/locales/da.json
index cd98c587..0962524b 100644
--- a/locales/da.json
+++ b/locales/da.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Alternative undertekster: ",
"Show related videos: ": "Vis relaterede videoer: ",
"Show annotations by default: ": "Vis annotationer som standard: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Visuelle præferencer",
"Player style: ": "Afspiller stil: ",
"Dark mode: ": "Mørk tilstand: ",
@@ -156,6 +157,8 @@
"Title": "Titel",
"Playlist privacy": "Privatlivsindstillinger for afspilningsliste",
"Editing playlist `x`": "Redigerer afspilningsliste `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Se på YouTube",
"Hide annotations": "Skjul annotationer",
"Show annotations": "Vis annotationer",
@@ -412,4 +415,4 @@
"hdr": "",
"filter": "",
"Current version: ": ""
-}
+} \ No newline at end of file
diff --git a/locales/de.json b/locales/de.json
index 1985e43a..f82df34f 100644
--- a/locales/de.json
+++ b/locales/de.json
@@ -25,7 +25,7 @@
"Previous page": "Vorherige Seite",
"Clear watch history?": "Verlauf löschen?",
"New password": "Neues Passwort",
- "New passwords must match": "Neue Passwörter müssen gleich sein",
+ "New passwords must match": "Neue Passwörter müssen übereinstimmen",
"Cannot change password for Google accounts": "Ich kann das Passwort deines Google Kontos nicht ändern",
"Authorize token?": "Token autorisieren?",
"Authorize token for `x`?": "Token für `x` autorisieren?",
@@ -50,7 +50,7 @@
"Log in": "Anmelden",
"Log in/register": "Anmelden/registrieren",
"Log in with Google": "Mit Google anmelden",
- "User ID": "Benutzer ID",
+ "User ID": "Benutzer-ID",
"Password": "Passwort",
"Time (h:mm:ss):": "Zeit (h:mm:ss):",
"Text CAPTCHA": "Text CAPTCHA",
@@ -77,12 +77,13 @@
"Fallback captions: ": "Ersatzuntertitel: ",
"Show related videos: ": "Ähnliche Videos anzeigen? ",
"Show annotations by default: ": "Standardmäßig Anmerkungen anzeigen? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Anzeigeeinstellungen",
"Player style: ": "Abspielgeräterstil: ",
"Dark mode: ": "Nachtmodus: ",
"Theme: ": "Modus: ",
"dark": "Nachtmodus",
- "light": "klarer Modus",
+ "light": "heller Modus",
"Thin mode: ": "Schlanker Modus: ",
"Subscription preferences": "Abonnementeinstellungen",
"Show annotations by default for subscribed channels: ": "Anmerkungen für abonnierte Kanäle standardmäßig anzeigen? ",
@@ -104,7 +105,7 @@
"`x` is live": "`x` ist live",
"Data preferences": "Dateneinstellungen",
"Clear watch history": "Verlauf löschen",
- "Import/export data": "Daten im-/exportieren",
+ "Import/export data": "Daten importieren/exportieren",
"Change password": "Passwort ändern",
"Manage subscriptions": "Abonnements verwalten",
"Manage tokens": "Tokens verwalten",
@@ -156,6 +157,8 @@
"Title": "Titel",
"Playlist privacy": "Vertrauliche Wiedergabeliste",
"Editing playlist `x`": "Wiedergabeliste bearbeiten `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Video auf YouTube ansehen",
"Hide annotations": "Anmerkungen ausblenden",
"Show annotations": "Anmerkungen anzeigen",
@@ -215,10 +218,10 @@
"": "`x` Punkte"
},
"Could not create mix.": "Mix konnte nicht erstellt werden.",
- "Empty playlist": "Playlist ist leer",
- "Not a playlist.": "Ungültige Playlist.",
- "Playlist does not exist.": "Playlist existiert nicht.",
- "Could not pull trending pages.": "Trending Seiten konnten nicht geladen werden.",
+ "Empty playlist": "Wiedergabeliste ist leer",
+ "Not a playlist.": "Ungültige Wiedergabeliste.",
+ "Playlist does not exist.": "Wiedergabeliste existiert nicht.",
+ "Could not pull trending pages.": "Trendenz-Seiten konnten nicht geladen werden.",
"Hidden field \"challenge\" is a required field": "Verstecktes Feld „challenge“ ist eine erforderliche Eingabe",
"Hidden field \"token\" is a required field": "Verstecktes Feld „token“ ist eine erforderliche Eingabe",
"Erroneous challenge": "Ungültiger Test",
@@ -361,7 +364,7 @@
},
"Fallback comments: ": "Alternative Kommentare: ",
"Popular": "Populär",
- "Search": "",
+ "Search": "Suchen",
"Top": "Top",
"About": "Über",
"Rating: ": "Bewertung: ",
@@ -384,32 +387,32 @@
"Videos": "Videos",
"Playlists": "Wiedergabelisten",
"Community": "Gemeinschaft",
- "relevance": "",
- "rating": "",
- "date": "",
- "views": "",
- "content_type": "",
- "duration": "",
- "features": "",
- "sort": "",
- "hour": "",
- "today": "",
- "week": "",
- "month": "",
- "year": "",
- "video": "",
- "channel": "",
- "playlist": "",
- "movie": "",
+ "relevance": "Relevanz",
+ "rating": "Bewertung",
+ "date": "Datum",
+ "views": "Aufrufe",
+ "content_type": "Inhaltstyp",
+ "duration": "Dauer",
+ "features": "Eigenschaften",
+ "sort": "sortieren",
+ "hour": "Letzte Stunde",
+ "today": "Heute",
+ "week": "Diese Woche",
+ "month": "Diesen Monat",
+ "year": "Dieses Jahr",
+ "video": "Video",
+ "channel": "Kanal",
+ "playlist": "Wiedergabeliste",
+ "movie": "Film",
"show": "",
- "hd": "",
- "subtitles": "",
- "creative_commons": "",
- "3d": "",
- "live": "",
- "4k": "",
- "location": "",
- "hdr": "",
- "filter": "",
+ "hd": "HD",
+ "subtitles": "Untertitel / CC",
+ "creative_commons": "Creative Commons",
+ "3d": "3D",
+ "live": "Live",
+ "4k": "4K",
+ "location": "Standort",
+ "hdr": "HDR",
+ "filter": "Filtern",
"Current version: ": "Aktuelle Version: "
-} \ No newline at end of file
+}
diff --git a/locales/el.json b/locales/el.json
index 390b81fd..5eb4a304 100644
--- a/locales/el.json
+++ b/locales/el.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Εναλλακτικοί υπότιτλοι: ",
"Show related videos: ": "Προβολή σχετικών βίντεο; ",
"Show annotations by default: ": "Αυτόματη προβολή σημειώσεων: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Προτιμήσεις εμφάνισης",
"Player style: ": "Τεχνοτροπία της συσκευής αναπαραγωγης: ",
"Dark mode: ": "Σκοτεινή λειτουργία: ",
@@ -156,6 +157,8 @@
"Title": "Τίτλος",
"Playlist privacy": "Ιδιωτικότητα καταλόγων αναπαραγωγής",
"Editing playlist `x`": "Επεξεργασία `x` καταλόγου αναπαραγωγής",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Προβολή στο YouTube",
"Hide annotations": "Απόκρυψη σημειώσεων",
"Show annotations": "Προβολή σημειώσεων",
@@ -412,4 +415,4 @@
"hdr": "",
"filter": "",
"Current version: ": "Τρέχουσα έκδοση: "
-}
+} \ No newline at end of file
diff --git a/locales/en-US.json b/locales/en-US.json
index a7dc3107..71485826 100644
--- a/locales/en-US.json
+++ b/locales/en-US.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Fallback captions: ",
"Show related videos: ": "Show related videos: ",
"Show annotations by default: ": "Show annotations by default: ",
+ "Automatically extend video description: ": "Automatically extend video description: ",
"Visual preferences": "Visual preferences",
"Player style: ": "Player style: ",
"Dark mode: ": "Dark mode: ",
@@ -156,6 +157,8 @@
"Title": "Title",
"Playlist privacy": "Playlist privacy",
"Editing playlist `x`": "Editing playlist `x`",
+ "Show more": "Show more",
+ "Show less": "Show less",
"Watch on YouTube": "Watch on YouTube",
"Hide annotations": "Hide annotations",
"Show annotations": "Show annotations",
diff --git a/locales/eo.json b/locales/eo.json
index 14a1c425..a6550cae 100644
--- a/locales/eo.json
+++ b/locales/eo.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Retrodefaŭltaj subtekstoj: ",
"Show related videos: ": "Ĉu montri rilatajn filmetojn? ",
"Show annotations by default: ": "Ĉu montri prinotojn defaŭlte? ",
+ "Automatically extend video description: ": "Aŭtomate etendi priskribon de filmeto: ",
"Visual preferences": "Vidaj preferoj",
"Player style: ": "Ludila stilo: ",
"Dark mode: ": "Malhela reĝimo: ",
@@ -156,6 +157,8 @@
"Title": "Titolo",
"Playlist privacy": "Privateco de ludlisto",
"Editing playlist `x`": "Redaktante ludlisto `x`",
+ "Show more": "Montri pli",
+ "Show less": "Montri malpli",
"Watch on YouTube": "Vidi filmeton en JuTubo",
"Hide annotations": "Kaŝi prinotojn",
"Show annotations": "Montri prinotojn",
diff --git a/locales/es.json b/locales/es.json
index 9562fa84..51993cd2 100644
--- a/locales/es.json
+++ b/locales/es.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Subtítulos alternativos: ",
"Show related videos: ": "¿Mostrar vídeos relacionados? ",
"Show annotations by default: ": "¿Mostrar anotaciones por defecto? ",
+ "Automatically extend video description: ": "Extender automáticamente la descripción del vídeo: ",
"Visual preferences": "Preferencias visuales",
"Player style: ": "Estilo de reproductor: ",
"Dark mode: ": "Modo oscuro: ",
@@ -156,6 +157,8 @@
"Title": "Título",
"Playlist privacy": "Privacidad de la lista de reproducción",
"Editing playlist `x`": "Editando la lista de reproducción 'x'",
+ "Show more": "Mostrar más",
+ "Show less": "Mostrar menos",
"Watch on YouTube": "Ver el vídeo en Youtube",
"Hide annotations": "Ocultar anotaciones",
"Show annotations": "Mostrar anotaciones",
diff --git a/locales/eu.json b/locales/eu.json
index 709d9caf..d5021c25 100644
--- a/locales/eu.json
+++ b/locales/eu.json
@@ -68,6 +68,7 @@
"Fallback captions: ": "",
"Show related videos: ": "Erakutsi erlazionatutako bideoak: ",
"Show annotations by default: ": "Erakutsi oharrak modu lehenetsian: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Hobespen bisualak",
"Player style: ": "Erreproduzigailu mota: ",
"Dark mode: ": "Gai iluna: ",
@@ -138,6 +139,8 @@
"Title": "",
"Playlist privacy": "",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "",
"Hide annotations": "",
"Show annotations": "",
diff --git a/locales/fa.json b/locales/fa.json
index f2fdbf3b..b6114292 100644
--- a/locales/fa.json
+++ b/locales/fa.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "عقب گرد زیرنویس ها: ",
"Show related videos: ": "نمایش ویدیو های مرتبط: ",
"Show annotations by default: ": "نمایش حاشیه نویسی ها به طور پیشفرض: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "ترجیحات بصری",
"Player style: ": "حالت پخش کننده: ",
"Dark mode: ": "حالت تاریک: ",
@@ -156,6 +157,8 @@
"Title": "عنوان",
"Playlist privacy": "حریم خصوصی لیست پخش",
"Editing playlist `x`": "تغییر لیست پخش `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "تماشا در یوتیوب",
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
"Show annotations": "نمایش حاشیه نویسی ها",
diff --git a/locales/fi.json b/locales/fi.json
index a009cdb6..5adeec05 100644
--- a/locales/fi.json
+++ b/locales/fi.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Toissijaiset tekstitykset: ",
"Show related videos: ": "Näytä aiheeseen liittyviä videoita: ",
"Show annotations by default: ": "Näytä huomautukset oletuksena: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Visuaaliset asetukset",
"Player style: ": "Soittimen tyyli: ",
"Dark mode: ": "Tumma tila: ",
@@ -156,6 +157,8 @@
"Title": "Nimi",
"Playlist privacy": "Soittolistan yksityisyys",
"Editing playlist `x`": "Muokataan soittolistaa `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Katso YouTubessa",
"Hide annotations": "Piilota merkkaukset",
"Show annotations": "Näytä merkkaukset",
diff --git a/locales/fr.json b/locales/fr.json
index 3efb69fb..af0f2d1a 100644
--- a/locales/fr.json
+++ b/locales/fr.json
@@ -27,7 +27,7 @@
"New password": "Nouveau mot de passe",
"New passwords must match": "Les nouveaux mots de passe doivent correspondre",
"Cannot change password for Google accounts": "Le mot de passe d'un compte Google ne peut pas être changé depuis Invidious",
- "Authorize token?": "Autoriser le token ?",
+ "Authorize token?": "Autoriser le token ?",
"Authorize token for `x`?": "Autoriser le token pour `x` ?",
"Yes": "Oui",
"No": "Non",
@@ -48,7 +48,7 @@
"JavaScript license information": "Informations sur les licences JavaScript",
"source": "source",
"Log in": "Se connecter",
- "Log in/register": "Se connecter/Créer un compte",
+ "Log in/register": "Se connecter/S'inscrire",
"Log in with Google": "Se connecter avec Google",
"User ID": "Identifiant utilisateur",
"Password": "Mot de passe",
@@ -77,6 +77,7 @@
"Fallback captions: ": "Sous-titres alternatifs : ",
"Show related videos: ": "Voir les vidéos liées : ",
"Show annotations by default: ": "Afficher les annotations par défaut : ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Préférences du site",
"Player style: ": "Style du lecteur : ",
"Dark mode: ": "Mode sombre : ",
@@ -120,7 +121,7 @@
"Report statistics: ": "Télémétrie activé : ",
"Save preferences": "Enregistrer les préférences",
"Subscription manager": "Gestionnaire d'abonnement",
- "Token manager": "Gestionnaire de tokens",
+ "Token manager": "Gestionnaire de token",
"Token": "Token",
"`x` subscriptions": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnements",
@@ -139,7 +140,7 @@
"": "`x` notifications non vues"
},
"search": "rechercher",
- "Log out": "Déconnexion",
+ "Log out": "Se déconnecter",
"Released under the AGPLv3 by Omar Roth.": "Publié sous licence AGPLv3 par Omar Roth.",
"Source available here.": "Code source disponible ici.",
"View JavaScript license information.": "Informations des licences JavaScript.",
@@ -156,6 +157,8 @@
"Title": "Titre",
"Playlist privacy": "Paramètres de confidentialité de la liste de lecture",
"Editing playlist `x`": "Liste de lecture modifier le `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Voir la vidéo sur Youtube",
"Hide annotations": "Masquer les annotations",
"Show annotations": "Afficher les annotations",
@@ -388,11 +391,11 @@
"rating": "évaluation",
"date": "date",
"views": "nombre de vues",
- "content_type": "type de contenu",
+ "content_type": "type",
"duration": "durée",
"features": "fonctionnalités",
"sort": "Trier par",
- "hour": "heure",
+ "hour": "dernière heure",
"today": "aujourd'hui",
"week": "semaine",
"month": "mois",
diff --git a/locales/he.json b/locales/he.json
index 1b014b87..bf34c085 100644
--- a/locales/he.json
+++ b/locales/he.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "כתוביות גיבוי ",
"Show related videos: ": "הצגת סרטונים קשורים: ",
"Show annotations by default: ": "הצגת הערות כברירת מחדל: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "העדפות חזותיות",
"Player style: ": "סגנון הנגן: ",
"Dark mode: ": "מצב כהה: ",
@@ -156,6 +157,8 @@
"Title": "",
"Playlist privacy": "Playlist privacy",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "צפייה ב־YouTube",
"Hide annotations": "",
"Show annotations": "",
@@ -412,4 +415,4 @@
"hdr": "HDR",
"filter": "סינון",
"Current version: ": "הגרסה הנוכחית: "
-}
+} \ No newline at end of file
diff --git a/locales/hr.json b/locales/hr.json
index ae2f6d6f..0083566d 100644
--- a/locales/hr.json
+++ b/locales/hr.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Alternativni titlovi: ",
"Show related videos: ": "Prikaži povezana videa: ",
"Show annotations by default: ": "Standardno prikaži napomene: ",
+ "Automatically extend video description: ": "Automatski proširi opis videa: ",
"Visual preferences": "Postavke prikaza",
"Player style: ": "Stil playera: ",
"Dark mode: ": "Tamni modus: ",
@@ -156,6 +157,8 @@
"Title": "Naslov",
"Playlist privacy": "Privatnost playliste",
"Editing playlist `x`": "Uređivanje playliste `x`",
+ "Show more": "Pokaži više",
+ "Show less": "Pokaži manje",
"Watch on YouTube": "Gledaj na YouTubeu",
"Hide annotations": "Sakrij napomene",
"Show annotations": "Prikaži napomene",
diff --git a/locales/hu-HU.json b/locales/hu-HU.json
index 4bdd742d..5c270c4d 100644
--- a/locales/hu-HU.json
+++ b/locales/hu-HU.json
@@ -68,6 +68,7 @@
"Fallback captions: ": "Másodlagos feliratok: ",
"Show related videos: ": "Kapcsolódó videók mutatása: ",
"Show annotations by default: ": "Annotációk mutatása alapértelmetésben: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Vizuális preferenciák",
"Player style: ": "Lejátszó stílusa: ",
"Dark mode: ": "Sötét mód: ",
@@ -138,6 +139,8 @@
"Title": "Címe",
"Playlist privacy": "Lejátszási lista láthatósága",
"Editing playlist `x`": "`x` lista szerkesztése",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Megtekintés a YouTube-on",
"Hide annotations": "Annotációk elrejtése",
"Show annotations": "Annotációk mutatása",
diff --git a/locales/id.json b/locales/id.json
index e75b3e50..61424233 100644
--- a/locales/id.json
+++ b/locales/id.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Subtitel fallback: ",
"Show related videos: ": "Tampilkan video terkait: ",
"Show annotations by default: ": "Tampilkan anotasi secara default: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferensi visual",
"Player style: ": "Gaya pemutar: ",
"Dark mode: ": "Mode gelap: ",
@@ -156,6 +157,8 @@
"Title": "Judul",
"Playlist privacy": "Privasi daftar putar",
"Editing playlist `x`": "Menyunting daftar putar `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Tonton di YouTube",
"Hide annotations": "Sembunyikan anotasi",
"Show annotations": "Tampilkan anotasi",
@@ -412,4 +415,4 @@
"hdr": "hdr",
"filter": "saring",
"Current version: ": "Versi saat ini: "
-}
+} \ No newline at end of file
diff --git a/locales/is.json b/locales/is.json
index 8bf1ad8f..569ee9d0 100644
--- a/locales/is.json
+++ b/locales/is.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Varatextar: ",
"Show related videos: ": "Sýna tengd myndbönd? ",
"Show annotations by default: ": "Á að sýna glósur sjálfgefið? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Sjónrænar stillingar",
"Player style: ": "Spilara stíl: ",
"Dark mode: ": "Myrkur ham: ",
@@ -156,6 +157,8 @@
"Title": "Titill",
"Playlist privacy": "Spilunarlista opinberri",
"Editing playlist `x`": "Að breyta spilunarlista `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Horfa á YouTube",
"Hide annotations": "Fela glósur",
"Show annotations": "Sýna glósur",
@@ -412,4 +415,4 @@
"hdr": "",
"filter": "",
"Current version: ": "Núverandi útgáfa: "
-}
+} \ No newline at end of file
diff --git a/locales/it.json b/locales/it.json
index d86034e5..19556ac4 100644
--- a/locales/it.json
+++ b/locales/it.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Sottotitoli alternativi: ",
"Show related videos: ": "Mostra video correlati: ",
"Show annotations by default: ": "Mostra le annotazioni in modo predefinito: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferenze grafiche",
"Player style: ": "Stile riproduttore: ",
"Dark mode: ": "Tema scuro: ",
@@ -156,6 +157,8 @@
"Title": "Titolo",
"Playlist privacy": "Privacy playlist",
"Editing playlist `x`": "Modificando la playlist `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Guarda su YouTube",
"Hide annotations": "Nascondi annotazioni",
"Show annotations": "Mostra annotazioni",
@@ -361,7 +364,7 @@
},
"Fallback comments: ": "Commenti alternativi: ",
"Popular": "Popolare",
- "Search": "",
+ "Search": "Cerca",
"Top": "Top",
"About": "Al riguardo",
"Rating: ": "Punteggio: ",
@@ -384,32 +387,32 @@
"Videos": "Video",
"Playlists": "Playlist",
"Community": "Comunità",
- "relevance": "",
- "rating": "",
- "date": "",
- "views": "",
- "content_type": "",
- "duration": "",
- "features": "",
- "sort": "",
- "hour": "",
- "today": "",
- "week": "",
- "month": "",
- "year": "",
- "video": "",
- "channel": "",
- "playlist": "",
- "movie": "",
+ "relevance": "Pertinenza",
+ "rating": "Valutazione",
+ "date": "Data di caricamento",
+ "views": "Numero di visualizzazioni",
+ "content_type": "Tipo",
+ "duration": "Durata",
+ "features": "Caratteristiche",
+ "sort": "Ordina per",
+ "hour": "Ultima ora",
+ "today": "Oggi",
+ "week": "Questa settimana",
+ "month": "Questo mese",
+ "year": "Quest'anno",
+ "video": "Video",
+ "channel": "Canale",
+ "playlist": "Playlist",
+ "movie": "Film",
"show": "",
- "hd": "",
- "subtitles": "",
- "creative_commons": "",
- "3d": "",
- "live": "",
- "4k": "",
- "location": "",
- "hdr": "",
- "filter": "",
+ "hd": "AD",
+ "subtitles": "Sottotitoli / CC",
+ "creative_commons": "Creative Commons",
+ "3d": "3D",
+ "live": "In diretta",
+ "4k": "4K",
+ "location": "Posizione",
+ "hdr": "HDR",
+ "filter": "Filtra",
"Current version: ": "Versione attuale: "
-} \ No newline at end of file
+}
diff --git a/locales/ja.json b/locales/ja.json
index f1c3265a..90092e83 100644
--- a/locales/ja.json
+++ b/locales/ja.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "フォールバック時の字幕: ",
"Show related videos: ": "関連動画を表示: ",
"Show annotations by default: ": "デフォルトでアノテーションを表示: ",
+ "Automatically extend video description: ": "動画の説明文を自動的に拡張: ",
"Visual preferences": "外観設定",
"Player style: ": "プレイヤースタイル: ",
"Dark mode: ": "ダークモード: ",
@@ -156,6 +157,8 @@
"Title": "タイトル",
"Playlist privacy": "再生リストのプライバシー",
"Editing playlist `x`": "再生リスト `x` を編集中",
+ "Show more": "表示を増やす",
+ "Show less": "表示を減らす",
"Watch on YouTube": "YouTube で視聴",
"Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示",
@@ -361,7 +364,7 @@
},
"Fallback comments: ": "フォールバック時のコメント: ",
"Popular": "人気",
- "Search": "",
+ "Search": "検索",
"Top": "トップ",
"About": "このサービスについて",
"Rating: ": "評価: ",
@@ -384,11 +387,11 @@
"Videos": "動画",
"Playlists": "プレイリスト",
"Community": "コミュニティ",
- "relevance": "",
- "rating": "",
+ "relevance": "関連",
+ "rating": "評価",
"date": "",
"views": "",
- "content_type": "",
+ "content_type": "コンテンツの種類",
"duration": "",
"features": "",
"sort": "",
@@ -399,7 +402,7 @@
"year": "",
"video": "",
"channel": "",
- "playlist": "",
+ "playlist": "再生リスト",
"movie": "",
"show": "",
"hd": "",
@@ -412,4 +415,4 @@
"hdr": "",
"filter": "",
"Current version: ": "現在のバージョン: "
-} \ No newline at end of file
+}
diff --git a/locales/nb-NO.json b/locales/nb-NO.json
index 8dd05d48..b4b39192 100644
--- a/locales/nb-NO.json
+++ b/locales/nb-NO.json
@@ -1,15 +1,15 @@
{
"`x` subscribers": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnenter",
- "": "`x` abonnenter"
+ "": "`x` abonnenter."
},
"`x` videos": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` videoer",
- "": "`x` videoer"
+ "": "`x` videoer."
},
"`x` playlists": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` spillelister",
- "": "`x` spillelister"
+ "": "`x` spillelister."
},
"LIVE": "SANNTIDSVISNING",
"Shared `x` ago": "Delt for `x` siden",
@@ -77,6 +77,7 @@
"Fallback captions: ": "Tilbakefallsundertitler: ",
"Show related videos: ": "Vis relaterte videoer? ",
"Show annotations by default: ": "Vis merknader som forvalg? ",
+ "Automatically extend video description: ": "Utvid videobeskrivelse automatisk: ",
"Visual preferences": "Visuelle innstillinger",
"Player style: ": "Avspillerstil: ",
"Dark mode: ": "Mørk drakt: ",
@@ -124,11 +125,11 @@
"Token": "Symbol",
"`x` subscriptions": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` abonnementer",
- "": "`x` abonnementer"
+ "": "`x` abonnementer."
},
"`x` tokens": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` symboler",
- "": "`x` symboler"
+ "": "`x` symboler."
},
"Import/export": "Importer/eksporter",
"unsubscribe": "opphev abonnement",
@@ -136,7 +137,7 @@
"Subscriptions": "Abonnement",
"`x` unseen notifications": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` usette merknader",
- "": "`x` usette merknader"
+ "": "`x` usette merknader."
},
"search": "søk",
"Log out": "Logg ut",
@@ -156,6 +157,8 @@
"Title": "Tittel",
"Playlist privacy": "Vern av spilleliste",
"Editing playlist `x`": "Endre spilleliste «x»",
+ "Show more": "Vis mer",
+ "Show less": "Vis mindre",
"Watch on YouTube": "Vis video på YouTube",
"Hide annotations": "Skjul merknader",
"Show annotations": "Vis merknader",
@@ -169,7 +172,7 @@
"Shared `x`": "Delt `x`",
"`x` views": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` visninger",
- "": "`x` visninger"
+ "": "`x` visninger."
},
"Premieres in `x`": "Premiere om `x`",
"Premieres `x`": "Première `x`",
@@ -178,7 +181,7 @@
"View more comments on Reddit": "Vis flere kommenterer på Reddit",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Vis `x` kommentarer",
- "": "Vis `x` kommentarer"
+ "": "Vis `x` kommentarer."
},
"View Reddit comments": "Vis Reddit-kommentarer",
"Hide replies": "Skjul svar",
@@ -206,13 +209,13 @@
"Could not fetch comments": "Kunne ikke hente kommentarer",
"View `x` replies": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Vis `x` svar",
- "": "Vis `x` svar"
+ "": "Vis `x` svar."
},
"`x` ago": "`x` siden",
"Load more": "Last inn flere",
"`x` points": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` poeng",
- "": "`x` poeng"
+ "": "`x` poeng."
},
"Could not create mix.": "Kunne ikke opprette miks.",
"Empty playlist": "Spillelisten er tom",
@@ -333,35 +336,35 @@
"Zulu": "Zulu",
"`x` years": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` år",
- "": "`x` år"
+ "": "`x` år."
},
"`x` months": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` måneder",
- "": "`x` måneder"
+ "": "`x` måneder."
},
"`x` weeks": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` uker",
- "": "`x` uker"
+ "": "`x` uker."
},
"`x` days": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` dager",
- "": "`x` dager"
+ "": "`x` dager."
},
"`x` hours": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` timer",
- "": "`x` timer"
+ "": "`x` timer."
},
"`x` minutes": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` minutter",
- "": "`x` minutter"
+ "": "`x` minutter."
},
"`x` seconds": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` sekunder",
- "": "`x` sekunder"
+ "": "`x` sekunder."
},
"Fallback comments: ": "Tilbakefallskommentarer: ",
"Popular": "Populært",
- "Search": "",
+ "Search": "Søk",
"Top": "Topp",
"About": "Om",
"Rating: ": "Vurdering: ",
@@ -384,32 +387,32 @@
"Videos": "Videoer",
"Playlists": "Spillelister",
"Community": "Gemenskap",
- "relevance": "",
- "rating": "",
- "date": "",
- "views": "",
- "content_type": "",
- "duration": "",
- "features": "",
- "sort": "",
- "hour": "",
- "today": "",
- "week": "",
- "month": "",
- "year": "",
- "video": "",
- "channel": "",
- "playlist": "",
- "movie": "",
- "show": "",
- "hd": "",
- "subtitles": "",
- "creative_commons": "",
- "3d": "",
- "live": "",
- "4k": "",
- "location": "",
- "hdr": "",
- "filter": "",
+ "relevance": "relevans",
+ "rating": "vurdering",
+ "date": "dato",
+ "views": "visninger",
+ "content_type": "innholdstype",
+ "duration": "varighet",
+ "features": "funksjoner",
+ "sort": "sorter",
+ "hour": "time",
+ "today": "i dag",
+ "week": "uke",
+ "month": "måned",
+ "year": "år",
+ "video": "video",
+ "channel": "kanal",
+ "playlist": "spilleliste",
+ "movie": "film",
+ "show": "vis",
+ "hd": "HD",
+ "subtitles": "undertekster",
+ "creative_commons": "Creative Commons",
+ "3d": "3D",
+ "live": "direkte",
+ "4k": "4k",
+ "location": "sted",
+ "hdr": "HDR",
+ "filter": "filtrer",
"Current version: ": "Gjeldende versjon: "
-} \ No newline at end of file
+}
diff --git a/locales/nl.json b/locales/nl.json
index df223f04..6d2ff68c 100644
--- a/locales/nl.json
+++ b/locales/nl.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Alternatieve ondertiteling: ",
"Show related videos: ": "Gerelateerde video's tonen? ",
"Show annotations by default: ": "Standaard annotaties tonen? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Visuele instellingen",
"Player style: ": "Speler vormgeving ",
"Dark mode: ": "Donkere modus: ",
@@ -156,6 +157,8 @@
"Title": "Titel",
"Playlist privacy": "Afspeellijst privacy",
"Editing playlist `x`": "Afspeellijst `x` wijzigen",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Video bekijken op YouTube",
"Hide annotations": "Annotaties verbergen",
"Show annotations": "Annotaties tonen",
diff --git a/locales/pl.json b/locales/pl.json
index cf54bd9a..3d64aa07 100644
--- a/locales/pl.json
+++ b/locales/pl.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Zastępcze napisy: ",
"Show related videos: ": "Pokaż powiązane filmy? ",
"Show annotations by default: ": "Domyślnie pokazuj adnotacje: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferencje Wizualne",
"Player style: ": "Styl odtwarzacza: ",
"Dark mode: ": "Ciemny motyw: ",
@@ -156,6 +157,8 @@
"Title": "Tytuł",
"Playlist privacy": "Widoczność playlisty",
"Editing playlist `x`": "Edycja playlisty `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Zobacz film na YouTube",
"Hide annotations": "Ukryj adnotacje",
"Show annotations": "Pokaż adnotacje",
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
index 1c9e1f93..d8af008b 100644
--- a/locales/pt-BR.json
+++ b/locales/pt-BR.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Legendas alternativas: ",
"Show related videos: ": "Mostrar vídeos relacionados: ",
"Show annotations by default: ": "Sempre mostrar anotações: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferências visuais",
"Player style: ": "Estilo do tocador: ",
"Dark mode: ": "Modo escuro: ",
@@ -156,6 +157,8 @@
"Title": "Título",
"Playlist privacy": "Privacidade da playlist",
"Editing playlist `x`": "Editando playlist `x`",
+ "Show more": "Mostrar mais",
+ "Show less": "Mostrar menos",
"Watch on YouTube": "Assistir no YouTube",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
@@ -361,7 +364,7 @@
},
"Fallback comments: ": "Comentários alternativos: ",
"Popular": "Populares",
- "Search": "",
+ "Search": "Procurar",
"Top": "No topo",
"About": "Sobre",
"Rating: ": "Avaliação: ",
@@ -384,12 +387,12 @@
"Videos": "Vídeos",
"Playlists": "Listas de reprodução",
"Community": "Comunidade",
- "relevance": "",
- "rating": "",
- "date": "",
- "views": "",
+ "relevance": "relevância",
+ "rating": "avaliação",
+ "date": "data",
+ "views": "visualizações",
"content_type": "",
- "duration": "",
+ "duration": "duração",
"features": "",
"sort": "",
"hour": "",
@@ -412,4 +415,4 @@
"hdr": "",
"filter": "",
"Current version: ": "Versão atual: "
-} \ No newline at end of file
+}
diff --git a/locales/pt-PT.json b/locales/pt-PT.json
index d1d94c1f..c25e9353 100644
--- a/locales/pt-PT.json
+++ b/locales/pt-PT.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Legendas alternativas: ",
"Show related videos: ": "Mostrar vídeos relacionados: ",
"Show annotations by default: ": "Mostrar sempre anotações: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferências visuais",
"Player style: ": "Estilo do reprodutor: ",
"Dark mode: ": "Modo escuro: ",
@@ -156,6 +157,8 @@
"Title": "Título",
"Playlist privacy": "Privacidade da lista de reprodução",
"Editing playlist `x`": "A editar lista de reprodução 'x'",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Ver no YouTube",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
diff --git a/locales/ro.json b/locales/ro.json
index 8507828d..057b919c 100644
--- a/locales/ro.json
+++ b/locales/ro.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Subtitrări alternative: ",
"Show related videos: ": "Afișați videoclipurile asemănătoare: ",
"Show annotations by default: ": "Afișați adnotările în mod implicit: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Preferințele site-ului",
"Player style: ": "Stilul player-ului : ",
"Dark mode: ": "Modul întunecat : ",
@@ -156,6 +157,8 @@
"Title": "Titlu",
"Playlist privacy": "Parametrii de confidențialitate ai listei de redare",
"Editing playlist `x`": "Modificați lista de redare `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Urmăriți videoclipul pe YouTube",
"Hide annotations": "Ascundeți adnotările",
"Show annotations": "Afișați adnotările",
diff --git a/locales/ru.json b/locales/ru.json
index 6f34abeb..a737745e 100644
--- a/locales/ru.json
+++ b/locales/ru.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Дополнительный язык субтитров: ",
"Show related videos: ": "Показывать похожие видео? ",
"Show annotations by default: ": "Всегда показывать аннотации? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Настройки сайта",
"Player style: ": "Стиль проигрывателя: ",
"Dark mode: ": "Тёмное оформление: ",
@@ -156,6 +157,8 @@
"Title": "Заголовок",
"Playlist privacy": "Конфиденциальность плейлиста",
"Editing playlist `x`": "Редактирование плейлиста `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Смотреть на YouTube",
"Hide annotations": "Скрыть аннотации",
"Show annotations": "Показать аннотации",
diff --git a/locales/si.json b/locales/si.json
index 0b3ca597..c30ad33c 100644
--- a/locales/si.json
+++ b/locales/si.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "",
"Show related videos: ": "",
"Show annotations by default: ": "",
+ "Automatically extend video description: ": "",
"Visual preferences": "",
"Player style: ": "",
"Dark mode: ": "",
@@ -156,6 +157,8 @@
"Title": "",
"Playlist privacy": "",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "",
"Hide annotations": "",
"Show annotations": "",
diff --git a/locales/sk.json b/locales/sk.json
index 43e9bc94..f74d66db 100644
--- a/locales/sk.json
+++ b/locales/sk.json
@@ -71,6 +71,7 @@
"Fallback captions: ": "Náhradné titulky: ",
"Show related videos: ": "Zobraziť súvisiace videá: ",
"Show annotations by default: ": "Predvolene zobraziť anotácie: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Vizuálne nastavenia",
"Player style: ": "Štýl prehrávača: ",
"Dark mode: ": "Tmavý režim: ",
@@ -144,6 +145,8 @@
"Title": "",
"Playlist privacy": "",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "",
"Hide annotations": "",
"Show annotations": "",
diff --git a/locales/sr.json b/locales/sr.json
index 1e718d7a..7766f32e 100644
--- a/locales/sr.json
+++ b/locales/sr.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "",
"Show related videos: ": "",
"Show annotations by default: ": "",
+ "Automatically extend video description: ": "",
"Visual preferences": "",
"Player style: ": "",
"Dark mode: ": "",
@@ -156,6 +157,8 @@
"Title": "",
"Playlist privacy": "",
"Editing playlist `x`": "",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "",
"Hide annotations": "",
"Show annotations": "",
diff --git a/locales/sr_Cyrl.json b/locales/sr_Cyrl.json
index bb866522..77465501 100644
--- a/locales/sr_Cyrl.json
+++ b/locales/sr_Cyrl.json
@@ -68,6 +68,7 @@
"Fallback captions: ": "Алтернативни титлови: ",
"Show related videos: ": "Прикажи сличне видее: ",
"Show annotations by default: ": "Увек приказуј анотације: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Подешавања изгледа",
"Player style: ": "Стил плејера: ",
"Dark mode: ": "Тамни режим: ",
@@ -138,6 +139,8 @@
"Title": "Наслов",
"Playlist privacy": "Видљивост плејлисте",
"Editing playlist `x`": "Уређујете плејлисту `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Гледајте на YouTube-у",
"Hide annotations": "Сакриј анотације",
"Show annotations": "Прикажи анотације",
diff --git a/locales/sv-SE.json b/locales/sv-SE.json
index 5cc8c674..bd309c96 100644
--- a/locales/sv-SE.json
+++ b/locales/sv-SE.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Ersättningsundertexter: ",
"Show related videos: ": "Visa relaterade videor? ",
"Show annotations by default: ": "Visa länkar-i-videon som förval? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Visuella inställningar",
"Player style: ": "Spelarstil: ",
"Dark mode: ": "Mörkt läge: ",
@@ -156,6 +157,8 @@
"Title": "Titel",
"Playlist privacy": "Privatläge på spellista",
"Editing playlist `x`": "Redigerer spellistan `x`",
+ "Show more": "Visa mer",
+ "Show less": "Visa mindre",
"Watch on YouTube": "Titta på YouTube",
"Hide annotations": "Dölj länkar-i-video",
"Show annotations": "Visa länkar-i-video",
@@ -361,7 +364,7 @@
},
"Fallback comments: ": "Fallback-kommentarer: ",
"Popular": "Populärt",
- "Search": "",
+ "Search": "Sök",
"Top": "Topp",
"About": "Om",
"Rating: ": "Betyg: ",
@@ -384,32 +387,32 @@
"Videos": "Videor",
"Playlists": "Spellistor",
"Community": "Gemenskap",
- "relevance": "",
- "rating": "",
- "date": "",
- "views": "",
+ "relevance": "relevans",
+ "rating": "rankning",
+ "date": "datum",
+ "views": "visningar",
"content_type": "",
"duration": "",
"features": "",
"sort": "",
- "hour": "",
- "today": "",
- "week": "",
- "month": "",
- "year": "",
- "video": "",
- "channel": "",
- "playlist": "",
- "movie": "",
- "show": "",
- "hd": "",
- "subtitles": "",
- "creative_commons": "",
- "3d": "",
- "live": "",
- "4k": "",
- "location": "",
- "hdr": "",
+ "hour": "timme",
+ "today": "idag",
+ "week": "vecka",
+ "month": "månad",
+ "year": "år",
+ "video": "video",
+ "channel": "kanal",
+ "playlist": "spellista",
+ "movie": "film",
+ "show": "tv-serie",
+ "hd": "hd",
+ "subtitles": "undertexter",
+ "creative_commons": "creative_commons",
+ "3d": "3d",
+ "live": "live",
+ "4k": "4k",
+ "location": "plats",
+ "hdr": "hdr",
"filter": "",
"Current version: ": "Nuvarande version: "
-} \ No newline at end of file
+}
diff --git a/locales/tr.json b/locales/tr.json
index 1c1f0e00..6e0912cb 100644
--- a/locales/tr.json
+++ b/locales/tr.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Yedek altyazılar: ",
"Show related videos: ": "İlgili videoları göster: ",
"Show annotations by default: ": "Öntanımlı olarak ek açıklamaları göster: ",
+ "Automatically extend video description: ": "Video açıklamasını otomatik olarak genişlet: ",
"Visual preferences": "Görsel tercihler",
"Player style: ": "Oynatıcı biçimi: ",
"Dark mode: ": "Karanlık mod: ",
@@ -156,6 +157,8 @@
"Title": "Başlık",
"Playlist privacy": "Oynatma listesi gizliliği",
"Editing playlist `x`": "`x` oynatma listesi düzenleniyor",
+ "Show more": "Daha fazla göster",
+ "Show less": "Daha az göster",
"Watch on YouTube": "YouTube'da izle",
"Hide annotations": "Ek açıklamaları gizle",
"Show annotations": "Ek açıklamaları göster",
diff --git a/locales/uk.json b/locales/uk.json
index eb34e49e..0795612e 100644
--- a/locales/uk.json
+++ b/locales/uk.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "Запасна мова субтитрів: ",
"Show related videos: ": "Показувати схожі відео? ",
"Show annotations by default: ": "Завжди показувати анотації? ",
+ "Automatically extend video description: ": "",
"Visual preferences": "Налаштування сайту",
"Player style: ": "Стиль програвача: ",
"Dark mode: ": "Темне оформлення: ",
@@ -156,6 +157,8 @@
"Title": "Заголовок",
"Playlist privacy": "Конфіденційність списку відтворення",
"Editing playlist `x`": "Редагування списку відтворення \"x\"",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "Дивитися на YouTube",
"Hide annotations": "Приховати анотації",
"Show annotations": "Показати анотації",
diff --git a/locales/zh-CN.json b/locales/zh-CN.json
index a514aaed..8bd49845 100644
--- a/locales/zh-CN.json
+++ b/locales/zh-CN.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "后备字幕语言: ",
"Show related videos: ": "是否显示相关视频: ",
"Show annotations by default: ": "是否默认显示视频注释: ",
+ "Automatically extend video description: ": "",
"Visual preferences": "视觉选项",
"Player style: ": "播放器样式: ",
"Dark mode: ": "深色模式: ",
@@ -156,6 +157,8 @@
"Title": "标题",
"Playlist privacy": "播放列表隐私设置",
"Editing playlist `x`": "正在编辑播放列表 `x`",
+ "Show more": "",
+ "Show less": "",
"Watch on YouTube": "在 YouTube 观看",
"Hide annotations": "隐藏注释",
"Show annotations": "显示注释",
diff --git a/locales/zh-TW.json b/locales/zh-TW.json
index 935ca522..8daf277c 100644
--- a/locales/zh-TW.json
+++ b/locales/zh-TW.json
@@ -77,6 +77,7 @@
"Fallback captions: ": "汰退字幕: ",
"Show related videos: ": "顯示相關的影片: ",
"Show annotations by default: ": "預設顯示註釋: ",
+ "Automatically extend video description: ": "自動展開影片描述: ",
"Visual preferences": "視覺偏好設定",
"Player style: ": "播放器樣式: ",
"Dark mode: ": "深色模式: ",
@@ -156,6 +157,8 @@
"Title": "標題",
"Playlist privacy": "播放清單隱私",
"Editing playlist `x`": "已編輯播放清單 `x`",
+ "Show more": "顯示更多",
+ "Show less": "顯示較少",
"Watch on YouTube": "在 YouTube 上觀看",
"Hide annotations": "隱藏註釋",
"Show annotations": "顯示註釋",
diff --git a/src/invidious/comments.cr b/src/invidious/comments.cr
index 5d72503e..81d6ac2b 100644
--- a/src/invidious/comments.cr
+++ b/src/invidious/comments.cr
@@ -185,12 +185,14 @@ def fetch_youtube_comments(id, db, cursor, format, locale, thin_mode, region, so
json.field "published", published.to_unix
json.field "publishedText", translate(locale, "`x` ago", recode_date(published, locale))
- json.field "likeCount", node_comment["likeCount"]
+ comment_action_buttons_renderer = node_comment["actionButtons"]["commentActionButtonsRenderer"]
+
+ json.field "likeCount", comment_action_buttons_renderer["likeButton"]["toggleButtonRenderer"]["accessibilityData"]["accessibilityData"]["label"].as_s.scan(/\d/).map(&.[0]).join.to_i
json.field "commentId", node_comment["commentId"]
json.field "authorIsChannelOwner", node_comment["authorIsChannelOwner"]
- if node_comment["actionButtons"]["commentActionButtonsRenderer"]["creatorHeart"]?
- hearth_data = node_comment["actionButtons"]["commentActionButtonsRenderer"]["creatorHeart"]["creatorHeartRenderer"]["creatorThumbnail"]
+ if comment_action_buttons_renderer["creatorHeart"]?
+ hearth_data = comment_action_buttons_renderer["creatorHeart"]["creatorHeartRenderer"]["creatorThumbnail"]
json.field "creatorHeart" do
json.object do
json.field "creatorThumbnail", hearth_data["thumbnails"][-1]["url"]
diff --git a/src/invidious/helpers/helpers.cr b/src/invidious/helpers/helpers.cr
index 3767cb50..e1d877b7 100644
--- a/src/invidious/helpers/helpers.cr
+++ b/src/invidious/helpers/helpers.cr
@@ -50,6 +50,7 @@ struct ConfigPreferences
property thin_mode : Bool = false
property unseen_only : Bool = false
property video_loop : Bool = false
+ property extend_desc : Bool = false
property volume : Int32 = 100
def to_tuple
@@ -679,7 +680,7 @@ def create_notification_stream(env, topics, connection_channel)
end
def extract_initial_data(body) : Hash(String, JSON::Any)
- return JSON.parse(body.match(/(window\["ytInitialData"\]|var\s*ytInitialData)\s*=\s*(?<info>\{.*?\});/mx).try &.["info"] || "{}").as_h
+ return JSON.parse(body.match(/(window\["ytInitialData"\]|var\s*ytInitialData)\s*=\s*(?<info>{.*?});<\/script>/mx).try &.["info"] || "{}").as_h
end
def proxy_file(response, env)
diff --git a/src/invidious/users.cr b/src/invidious/users.cr
index 8fef64a0..e4ebb4d1 100644
--- a/src/invidious/users.cr
+++ b/src/invidious/users.cr
@@ -78,6 +78,7 @@ struct Preferences
property thin_mode : Bool = CONFIG.default_user_preferences.thin_mode
property unseen_only : Bool = CONFIG.default_user_preferences.unseen_only
property video_loop : Bool = CONFIG.default_user_preferences.video_loop
+ property extend_desc : Bool = CONFIG.default_user_preferences.extend_desc
property volume : Int32 = CONFIG.default_user_preferences.volume
module BoolToString
diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr
index 38646311..bf281507 100644
--- a/src/invidious/videos.cr
+++ b/src/invidious/videos.cr
@@ -242,6 +242,7 @@ struct VideoPreferences
property speed : Float32 | Float64
property video_end : Float64 | Int32
property video_loop : Bool
+ property extend_desc : Bool
property video_start : Float64 | Int32
property volume : Int32
end
@@ -818,7 +819,7 @@ end
def extract_polymer_config(body)
params = {} of String => JSON::Any
- player_response = body.match(/(window\["ytInitialPlayerResponse"\]|var\sytInitialPlayerResponse)\s*=\s*(?<info>{.*?});/m)
+ player_response = body.match(/(window\["ytInitialPlayerResponse"\]|var\sytInitialPlayerResponse)\s*=\s*(?<info>{.*?});\s*var\s*meta/m)
.try { |r| JSON.parse(r["info"]).as_h }
if body.includes?("To continue with your YouTube experience, please fill out the form below.") ||
@@ -1050,6 +1051,7 @@ def process_video_params(query, preferences)
related_videos = query["related_videos"]?.try { |q| (q == "true" || q == "1").to_unsafe }
speed = query["speed"]?.try &.rchop("x").to_f?
video_loop = query["loop"]?.try { |q| (q == "true" || q == "1").to_unsafe }
+ extend_desc = query["extend_desc"]?.try { |q| (q == "true" || q == "1").to_unsafe }
volume = query["volume"]?.try &.to_i?
if preferences
@@ -1068,6 +1070,7 @@ def process_video_params(query, preferences)
related_videos ||= preferences.related_videos.to_unsafe
speed ||= preferences.speed
video_loop ||= preferences.video_loop.to_unsafe
+ extend_desc ||= preferences.extend_desc.to_unsafe
volume ||= preferences.volume
end
@@ -1085,6 +1088,7 @@ def process_video_params(query, preferences)
related_videos ||= CONFIG.default_user_preferences.related_videos.to_unsafe
speed ||= CONFIG.default_user_preferences.speed
video_loop ||= CONFIG.default_user_preferences.video_loop.to_unsafe
+ extend_desc ||= CONFIG.default_user_preferences.extend_desc.to_unsafe
volume ||= CONFIG.default_user_preferences.volume
annotations = annotations == 1
@@ -1095,6 +1099,7 @@ def process_video_params(query, preferences)
local = local == 1
related_videos = related_videos == 1
video_loop = video_loop == 1
+ extend_desc = extend_desc == 1
if CONFIG.disabled?("dash") && quality == "dash"
quality = "high"
@@ -1141,6 +1146,7 @@ def process_video_params(query, preferences)
speed: speed,
video_end: video_end,
video_loop: video_loop,
+ extend_desc: extend_desc,
video_start: video_start,
volume: volume,
})
diff --git a/src/invidious/views/components/player_sources.ecr b/src/invidious/views/components/player_sources.ecr
index d950e0da..a99fdbca 100644
--- a/src/invidious/views/components/player_sources.ecr
+++ b/src/invidious/views/components/player_sources.ecr
@@ -3,7 +3,10 @@
<link rel="stylesheet" href="/css/videojs.markers.min.css?v=<%= ASSET_COMMIT %>">
<link rel="stylesheet" href="/css/videojs-share.css?v=<%= ASSET_COMMIT %>">
<link rel="stylesheet" href="/css/videojs-vtt-thumbnails.css?v=<%= ASSET_COMMIT %>">
+<link rel="stylesheet" href="/css/videojs-mobile-ui.css?v=<%= ASSET_COMMIT %>">
+<link rel="stylesheet" href="/css/player.css?v=<%= ASSET_COMMIT %>">
<script src="/js/video.min.js?v=<%= ASSET_COMMIT %>"></script>
+<script src="/js/videojs-mobile-ui.min.js?v=<%= ASSET_COMMIT %>"></script>
<script src="/js/videojs-contrib-quality-levels.min.js?v=<%= ASSET_COMMIT %>"></script>
<script src="/js/videojs-http-source-selector.min.js?v=<%= ASSET_COMMIT %>"></script>
<script src="/js/videojs-markers.min.js?v=<%= ASSET_COMMIT %>"></script>
diff --git a/src/invidious/views/licenses.ecr b/src/invidious/views/licenses.ecr
index aae8bb19..c2ada992 100644
--- a/src/invidious/views/licenses.ecr
+++ b/src/invidious/views/licenses.ecr
@@ -151,6 +151,20 @@
<tr>
<td>
+ <a href="/js/videojs-mobile-ui.min.js?v=<%= ASSET_COMMIT %>">videojs-mobile-ui.min.js</a>
+ </td>
+
+ <td>
+ <a href="https://choosealicense.com/licenses/mit/">MIT</a>
+ </td>
+
+ <td>
+ <a href="https://github.com/mister-ben/videojs-mobile-ui"><%= translate(locale, "source") %></a>
+ </td>
+ </tr>
+
+ <tr>
+ <td>
<a href="/js/videojs-markers.min.js?v=<%= ASSET_COMMIT %>">videojs-markers.min.js</a>
</td>
diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr
index c1f10818..602340a4 100644
--- a/src/invidious/views/preferences.ecr
+++ b/src/invidious/views/preferences.ecr
@@ -106,6 +106,12 @@
<input name="annotations" id="annotations" type="checkbox" <% if preferences.annotations %>checked<% end %>>
</div>
+ <div class="pure-control-group">
+ <label for="extend_desc"><%= translate(locale, "Automatically extend video description: ") %></label>
+ <input name="extend_desc" id="extend_desc" type="checkbox" <% if preferences.extend_desc %>checked<% end %>>
+ </div>
+
+
<legend><%= translate(locale, "Visual preferences") %></legend>
<div class="pure-control-group">
diff --git a/src/invidious/views/search_homepage.ecr b/src/invidious/views/search_homepage.ecr
index b36500e9..8927c3f1 100644
--- a/src/invidious/views/search_homepage.ecr
+++ b/src/invidious/views/search_homepage.ecr
@@ -16,7 +16,7 @@
<div class="pure-u-1 pure-u-md-12-24 searchbar">
<form class="pure-form" action="/search" method="get">
<fieldset>
- <input type="search" style="width:100%" name="q" placeholder="<%= translate(locale, "search") %>" value="<%= env.get?("search").try {|x| HTML.escape(x.as(String)) } %>">
+ <input autofocus type="search" style="width:100%" name="q" placeholder="<%= translate(locale, "search") %>" value="<%= env.get?("search").try {|x| HTML.escape(x.as(String)) } %>">
</fieldset>
</form>
</div>
diff --git a/src/invidious/views/watch.ecr b/src/invidious/views/watch.ecr
index a86e23b2..8b587eb3 100644
--- a/src/invidious/views/watch.ecr
+++ b/src/invidious/views/watch.ecr
@@ -25,6 +25,19 @@
<link rel="alternate" href="https://www.youtube.com/watch?v=<%= video.id %>">
<%= rendered "components/player_sources" %>
<title><%= HTML.escape(video.title) %> - Invidious</title>
+
+<!-- Description expansion also updates the 'Show more' button to 'Show less' so
+we're going to need to do it here in order to allow for translations.
+ -->
+<style>
+#descexpansionbutton + label > a::after {
+ content: "<%= translate(locale, "Show more") %>"
+}
+
+#descexpansionbutton:checked + label > a::after {
+ content: "<%= translate(locale, "Show less") %>"
+}
+</style>
<% end %>
<script id="video_data" type="application/json">
@@ -227,8 +240,18 @@
<% end %>
</p>
- <div>
- <%= video.description_html %>
+ <div id="description-box"> <!-- Description -->
+ <% if video.description.size < 200 || params.extend_desc %>
+ <%= video.description_html %>
+ <% else %>
+ <input id="descexpansionbutton" type="checkbox"/>
+ <label for="descexpansionbutton" style="order: 1;">
+ <a></a>
+ </label>
+ <div id="descriptionWrapper">
+ <%= video.description_html %>
+ </div>
+ <% end %>
</div>
<hr>