pull/334/head
Agustin Ferrari 6 years ago
commit c0e73e71c5

@ -0,0 +1,274 @@
{
"`x` subscribers": "",
"`x` videos": "",
"LIVE": "",
"Shared `x` ago": "",
"Unsubscribe": "",
"Subscribe": "Harpidetu",
"Login to subscribe to `x`": "",
"View channel on YouTube": "Ikusi kanala YouTuben",
"newest": "berrienak",
"oldest": "zaharrenak",
"popular": "ospetsuenak",
"Preview page": "Aurrebista orria",
"Next page": "Hurrengo orria",
"Clear watch history?": "Garbitu ikusitakoen historia?",
"Yes": "Bai",
"No": "Ez",
"Import and Export Data": "Datuak inportatu eta esportatu",
"Import": "Inportatu",
"Import Invidious data": "Invidiouseko datuak inportatu",
"Import YouTube subscriptions": "YouTubeko harpidetzak inportatu",
"Import FreeTube subscriptions (.db)": "FreeTubeko harpidetzak inportatu (.db)",
"Import NewPipe subscriptions (.json)": "NewPipeko harpidetzak inportatu (.json)",
"Import NewPipe data (.zip)": "NewPipeko datuak inportatu (.zip)",
"Export": "Esportatu",
"Export subscriptions as OPML": "Esportatu harpidetzak OPML bezala",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "",
"Export data as JSON": "",
"Delete account?": "Kontua ezabatu?",
"History": "Historia",
"Previous page": "Aurreko orria",
"An alternative front-end to YouTube": "",
"JavaScript license information": "",
"source": "",
"Login": "",
"Login/Register": "",
"Login to Google": "",
"User ID:": "",
"Password:": "",
"Time (h:mm:ss):": "",
"Text CAPTCHA": "",
"Image CAPTCHA": "",
"Sign In": "",
"Register": "",
"Email:": "",
"Google verification code:": "",
"Preferences": "",
"Player preferences": "",
"Always loop: ": "",
"Autoplay: ": "",
"Autoplay next video: ": "",
"Listen by default: ": "",
"Default speed: ": "",
"Preferred video quality: ": "",
"Player volume: ": "",
"Default comments: ": "",
"Default captions: ": "",
"Fallback captions: ": "",
"Show related videos? ": "",
"Visual preferences": "",
"Dark mode: ": "",
"Thin mode: ": "",
"Subscription preferences": "",
"Redirect homepage to feed: ": "",
"Number of videos shown in feed: ": "",
"Sort videos by: ": "",
"published": "",
"published - reverse": "",
"alphabetically": "",
"alphabetically - reverse": "",
"channel name": "",
"channel name - reverse": "",
"Only show latest video from channel: ": "",
"Only show latest unwatched video from channel: ": "",
"Only show unwatched: ": "",
"Only show notifications (if there are any): ": "",
"Data preferences": "",
"Clear watch history": "",
"Import/Export data": "",
"Manage subscriptions": "",
"Watch history": "",
"Delete account": "",
"Save preferences": "",
"Subscription manager": "",
"`x` subscriptions": "",
"Import/Export": "",
"unsubscribe": "",
"Subscriptions": "",
"`x` unseen notifications": "",
"search": "",
"Sign out": "",
"Released under the AGPLv3 by Omar Roth.": "",
"Source available here.": "",
"View JavaScript license information.": "",
"Trending": "",
"Watch video on Youtube": "",
"Genre: ": "",
"License: ": "",
"Family friendly? ": "",
"Wilson score: ": "",
"Engagement: ": "",
"Whitelisted regions: ": "",
"Blacklisted regions: ": "",
"Shared `x`": "",
"Hi! Looks like you have JavaScript disabled. Click here to view comments, keep in mind it may take a bit longer to load.": "",
"View YouTube comments": "",
"View more comments on Reddit": "",
"View `x` comments": "",
"View Reddit comments": "",
"Hide replies": "",
"Show replies": "",
"Incorrect password": "",
"Quota exceeded, try again in a few hours": "",
"Unable to login, make sure two-factor authentication (Authenticator or SMS) is enabled.": "",
"Invalid TFA code": "",
"Login failed. This may be because two-factor authentication is not enabled on your account.": "",
"Invalid answer": "",
"Invalid CAPTCHA": "",
"CAPTCHA is a required field": "",
"User ID is a required field": "",
"Password is a required field": "",
"Invalid username or password": "",
"Please sign in using 'Sign in with Google'": "",
"Password cannot be empty": "",
"Password cannot be longer than 55 characters": "",
"Please sign in": "",
"Invidious Private Feed for `x`": "",
"channel:`x`": "",
"Deleted or invalid channel": "",
"This channel does not exist.": "",
"Could not get channel info.": "",
"Could not fetch comments": "",
"View `x` replies": "",
"`x` ago": "",
"Load more": "",
"`x` points": "",
"Could not create mix.": "",
"Playlist is empty": "",
"Invalid playlist.": "",
"Playlist does not exist.": "",
"Could not pull trending pages.": "",
"Hidden field \"challenge\" is a required field": "",
"Hidden field \"token\" is a required field": "",
"Invalid challenge": "",
"Invalid token": "",
"Invalid user": "",
"Token is expired, please try again": "",
"English": "",
"English (auto-generated)": "",
"Afrikaans": "",
"Albanian": "",
"Amharic": "",
"Arabic": "",
"Armenian": "",
"Azerbaijani": "",
"Bangla": "",
"Basque": "",
"Belarusian": "",
"Bosnian": "",
"Bulgarian": "",
"Burmese": "",
"Catalan": "",
"Cebuano": "",
"Chinese (Simplified)": "",
"Chinese (Traditional)": "",
"Corsican": "",
"Croatian": "",
"Czech": "",
"Danish": "",
"Dutch": "",
"Esperanto": "",
"Estonian": "",
"Filipino": "",
"Finnish": "",
"French": "",
"Galician": "",
"Georgian": "",
"German": "",
"Greek": "",
"Gujarati": "",
"Haitian Creole": "",
"Hausa": "",
"Hawaiian": "",
"Hebrew": "",
"Hindi": "",
"Hmong": "",
"Hungarian": "",
"Icelandic": "",
"Igbo": "",
"Indonesian": "",
"Irish": "",
"Italian": "",
"Japanese": "",
"Javanese": "",
"Kannada": "",
"Kazakh": "",
"Khmer": "",
"Korean": "",
"Kurdish": "",
"Kyrgyz": "",
"Lao": "",
"Latin": "",
"Latvian": "",
"Lithuanian": "",
"Luxembourgish": "",
"Macedonian": "",
"Malagasy": "",
"Malay": "",
"Malayalam": "",
"Maltese": "",
"Maori": "",
"Marathi": "",
"Mongolian": "",
"Nepali": "",
"Norwegian": "",
"Nyanja": "",
"Pashto": "",
"Persian": "",
"Polish": "",
"Portuguese": "",
"Punjabi": "",
"Romanian": "",
"Russian": "",
"Samoan": "",
"Scottish Gaelic": "",
"Serbian": "",
"Shona": "",
"Sindhi": "",
"Sinhala": "",
"Slovak": "",
"Slovenian": "",
"Somali": "",
"Southern Sotho": "",
"Spanish": "",
"Spanish (Latin America)": "",
"Sundanese": "",
"Swahili": "",
"Swedish": "",
"Tajik": "",
"Tamil": "",
"Telugu": "",
"Thai": "",
"Turkish": "",
"Ukrainian": "",
"Urdu": "",
"Uzbek": "",
"Vietnamese": "",
"Welsh": "",
"Western Frisian": "",
"Xhosa": "",
"Yiddish": "",
"Yoruba": "",
"Zulu": "",
"`x` years": "",
"`x` months": "",
"`x` weeks": "",
"`x` days": "",
"`x` hours": "",
"`x` minutes": "",
"`x` seconds": "",
"Fallback comments: ": "",
"Popular": "",
"Top": "",
"About": "",
"Rating: ": "",
"Language: ": "",
"Default": "",
"Music": "",
"Gaming": "",
"News": "",
"Movies": "",
"Download": "",
"Download as: ": ""
}

@ -153,12 +153,12 @@
"Token is expired, please try again": "Срок действия токена истек, попробуйте позже", "Token is expired, please try again": "Срок действия токена истек, попробуйте позже",
"English": "Английский", "English": "Английский",
"English (auto-generated)": "Английский (созданы автоматически)", "English (auto-generated)": "Английский (созданы автоматически)",
"Afrikaans": "", "Afrikaans": "Африкаанс",
"Albanian": "", "Albanian": "Албанский",
"Amharic": "", "Amharic": "Амхарский",
"Arabic": "", "Arabic": "Арабский",
"Armenian": "", "Armenian": "Армянский",
"Azerbaijani": "", "Azerbaijani": "Азербайджанский",
"Bangla": "", "Bangla": "",
"Basque": "", "Basque": "",
"Belarusian": "", "Belarusian": "",
@ -256,7 +256,7 @@
"Xhosa": "", "Xhosa": "",
"Yiddish": "", "Yiddish": "",
"Yoruba": "", "Yoruba": "",
"Zulu": "", "Zulu": "Зулусский",
"`x` years": "`x` лет", "`x` years": "`x` лет",
"`x` months": "`x` месяцев", "`x` months": "`x` месяцев",
"`x` weeks": "`x` недель", "`x` weeks": "`x` недель",
@ -270,11 +270,11 @@
"About": "О сайте", "About": "О сайте",
"Rating: ": "Рейтинг: ", "Rating: ": "Рейтинг: ",
"Language: ": "Язык: ", "Language: ": "Язык: ",
"Default": "", "Default": "По-умолчанию",
"Music": "", "Music": "Музыка",
"Gaming": "", "Gaming": "Игры",
"News": "", "News": "Новости",
"Movies": "", "Movies": "Фильмы",
"Download": "", "Download": "Скачать",
"Download as: ": "" "Download as: ": "Скачать как: "
} }

@ -1128,21 +1128,21 @@ post "/preferences" do |env|
listen = listen == "on" listen = listen == "on"
speed = env.params.body["speed"]?.try &.as(String).to_f? speed = env.params.body["speed"]?.try &.as(String).to_f?
speed ||= 1.0 speed ||= DEFAULT_USER_PREFERENCES.speed
quality = env.params.body["quality"]?.try &.as(String) quality = env.params.body["quality"]?.try &.as(String)
quality ||= "hd720" quality ||= DEFAULT_USER_PREFERENCES.quality
volume = env.params.body["volume"]?.try &.as(String).to_i? volume = env.params.body["volume"]?.try &.as(String).to_i?
volume ||= 100 volume ||= DEFAULT_USER_PREFERENCES.volume
comments_0 = env.params.body["comments_0"]?.try &.as(String) || "youtube" comments_0 = env.params.body["comments_0"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.comments[0]
comments_1 = env.params.body["comments_1"]?.try &.as(String) || "" comments_1 = env.params.body["comments_1"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.comments[1]
comments = [comments_0, comments_1] comments = [comments_0, comments_1]
captions_0 = env.params.body["captions_0"]?.try &.as(String) || "" captions_0 = env.params.body["captions_0"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[0]
captions_1 = env.params.body["captions_1"]?.try &.as(String) || "" captions_1 = env.params.body["captions_1"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[1]
captions_2 = env.params.body["captions_2"]?.try &.as(String) || "" captions_2 = env.params.body["captions_2"]?.try &.as(String) || DEFAULT_USER_PREFERENCES.captions[2]
captions = [captions_0, captions_1, captions_2] captions = [captions_0, captions_1, captions_2]
related_videos = env.params.body["related_videos"]?.try &.as(String) related_videos = env.params.body["related_videos"]?.try &.as(String)
@ -1154,7 +1154,7 @@ post "/preferences" do |env|
redirect_feed = redirect_feed == "on" redirect_feed = redirect_feed == "on"
locale = env.params.body["locale"]?.try &.as(String) locale = env.params.body["locale"]?.try &.as(String)
locale ||= "en-US" locale ||= DEFAULT_USER_PREFERENCES.locale
dark_mode = env.params.body["dark_mode"]?.try &.as(String) dark_mode = env.params.body["dark_mode"]?.try &.as(String)
dark_mode ||= "off" dark_mode ||= "off"
@ -1165,10 +1165,10 @@ post "/preferences" do |env|
thin_mode = thin_mode == "on" thin_mode = thin_mode == "on"
max_results = env.params.body["max_results"]?.try &.as(String).to_i? max_results = env.params.body["max_results"]?.try &.as(String).to_i?
max_results ||= 40 max_results ||= DEFAULT_USER_PREFERENCES.max_results
sort = env.params.body["sort"]?.try &.as(String) sort = env.params.body["sort"]?.try &.as(String)
sort ||= "published" sort ||= DEFAULT_USER_PREFERENCES.sort
latest_only = env.params.body["latest_only"]?.try &.as(String) latest_only = env.params.body["latest_only"]?.try &.as(String)
latest_only ||= "off" latest_only ||= "off"

@ -79,36 +79,36 @@ class Preferences
autoplay: Bool, autoplay: Bool,
continue: { continue: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.continue,
}, },
listen: { listen: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.listen,
}, },
speed: Float32, speed: Float32,
quality: String, quality: String,
volume: Int32, volume: Int32,
comments: { comments: {
type: Array(String), type: Array(String),
default: ["youtube", ""], default: DEFAULT_USER_PREFERENCES.comments,
converter: StringToArray, converter: StringToArray,
}, },
captions: { captions: {
type: Array(String), type: Array(String),
default: ["", "", ""], default: DEFAULT_USER_PREFERENCES.captions,
}, },
redirect_feed: { redirect_feed: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.redirect_feed,
}, },
related_videos: { related_videos: {
type: Bool, type: Bool,
default: true, default: DEFAULT_USER_PREFERENCES.related_videos,
}, },
dark_mode: Bool, dark_mode: Bool,
thin_mode: { thin_mode: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.thin_mode,
}, },
max_results: Int32, max_results: Int32,
sort: String, sort: String,
@ -116,11 +116,11 @@ class Preferences
unseen_only: Bool, unseen_only: Bool,
notifications_only: { notifications_only: {
type: Bool, type: Bool,
default: false, default: DEFAULT_USER_PREFERENCES.notifications_only,
}, },
locale: { locale: {
type: String, type: String,
default: "en-US", default: DEFAULT_USER_PREFERENCES.locale,
}, },
}) })
end end

@ -633,6 +633,10 @@ def fetch_video(id, proxies, region)
end end
end end
if info["errorcode"]?.try &.== "2"
raise "Video unavailable."
end
title = info["title"] title = info["title"]
author = info["author"] author = info["author"]
ucid = info["ucid"] ucid = info["ucid"]
@ -741,14 +745,14 @@ def process_video_params(query, preferences)
volume ||= preferences.volume volume ||= preferences.volume
end end
autoplay ||= 0 autoplay ||= DEFAULT_USER_PREFERENCES.autoplay.to_unsafe
continue ||= 0 continue ||= DEFAULT_USER_PREFERENCES.continue.to_unsafe
listen ||= 0 listen ||= DEFAULT_USER_PREFERENCES.listen.to_unsafe
preferred_captions ||= [] of String preferred_captions ||= DEFAULT_USER_PREFERENCES.captions
quality ||= "hd720" quality ||= DEFAULT_USER_PREFERENCES.quality
speed ||= 1 speed ||= DEFAULT_USER_PREFERENCES.speed
video_loop ||= 0 video_loop ||= DEFAULT_USER_PREFERENCES.video_loop.to_unsafe
volume ||= 100 volume ||= DEFAULT_USER_PREFERENCES.volume
autoplay = autoplay == 1 autoplay = autoplay == 1
continue = continue == 1 continue = continue == 1

@ -115,38 +115,26 @@ var player = videojs("player", options, function() {
}); });
player.on('error', function(event) { player.on('error', function(event) {
if (player.error().code === 2) { if (player.error().code === 2 || player.error().code === 4) {
setInterval(setTimeout(function (event) {
console.log("An error occured in the player, reloading..."); console.log("An error occured in the player, reloading...");
var currentTime = player.currentTime(); var currentTime = player.currentTime();
var playbackRate = player.playbackRate(); var playbackRate = player.playbackRate();
var paused = player.paused()
player.load(); player.load();
if (currentTime > 0.5) { if (currentTime > 0.5) {
currentTime -= 0.5; currentTime -= 0.5;
} }
player.currentTime(currentTime); player.currentTime(currentTime);
player.playbackRate(playbackRate); player.playbackRate(playbackRate);
player.play()
} else if (player.error().code === 4) {
console.log("Detected invalid source, removing...");
var currentTime = player.currentTime();
var sources = player.options().sources;
for (var i = 0; i < sources.length; i++) {
if (sources[i].src === player.currentSource().src) {
sources.splice(i, 1);
break
}
};
player.load(); if (!paused) {
if (currentTime > 0.5) {
currentTime -= 0.5;
}
player.currentTime(currentTime);
player.src(sources);
player.play(); player.play();
} }
}, 5000), 5000);
}
}); });
player.share(shareOptions); player.share(shareOptions);

@ -141,7 +141,7 @@
</div> </div>
</div> </div>
</div> </div>
<% if preferences && preferences.related_videos || plid %> <% if !preferences || preferences && preferences.related_videos || plid %>
<div class="pure-u-1 pure-u-md-1-5"> <div class="pure-u-1 pure-u-md-1-5">
<% if plid %> <% if plid %>
<div id="playlist" class="h-box"> <div id="playlist" class="h-box">

Loading…
Cancel
Save