Merge branch 'development' into piped-support

This commit is contained in:
ChunkyProgrammer 2023-06-19 17:00:05 -07:00
commit e759679c81
26 changed files with 1074 additions and 948 deletions

View File

@ -69,7 +69,7 @@
"videojs-contrib-quality-levels": "^3.0.0",
"videojs-http-source-selector": "^1.1.6",
"videojs-mobile-ui": "^0.8.0",
"videojs-overlay": "^3.0.0",
"videojs-overlay": "^3.1.0",
"videojs-vtt-thumbnails-freetube": "0.0.15",
"vue": "^2.7.14",
"vue-i18n": "^8.28.2",
@ -80,52 +80,52 @@
"youtubei.js": "^5.1.0"
},
"devDependencies": {
"@babel/core": "^7.22.1",
"@babel/eslint-parser": "^7.21.8",
"@babel/core": "^7.22.5",
"@babel/eslint-parser": "^7.22.5",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/preset-env": "^7.22.2",
"@babel/preset-env": "^7.22.5",
"@double-great/stylelint-a11y": "^2.0.2",
"babel-loader": "^9.1.2",
"copy-webpack-plugin": "^11.0.0",
"css-loader": "^6.8.1",
"css-minimizer-webpack-plugin": "^5.0.0",
"electron": "^22.3.2",
"css-minimizer-webpack-plugin": "^5.0.1",
"electron": "^22.3.13",
"electron-builder": "^23.6.0",
"eslint": "^8.41.0",
"eslint": "^8.43.0",
"eslint-config-prettier": "^8.8.0",
"eslint-config-standard": "^17.0.0",
"eslint-config-standard": "^17.1.0",
"eslint-plugin-import": "^2.27.5",
"eslint-plugin-jsonc": "^2.8.0",
"eslint-plugin-n": "^15.7.0",
"eslint-plugin-jsonc": "^2.9.0",
"eslint-plugin-n": "^16.0.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-promise": "^6.1.1",
"eslint-plugin-unicorn": "^47.0.0",
"eslint-plugin-vue": "^9.14.1",
"eslint-plugin-vue": "^9.15.0",
"eslint-plugin-vuejs-accessibility": "^2.1.0",
"eslint-plugin-yml": "^1.7.0",
"html-webpack-plugin": "^5.5.1",
"eslint-plugin-yml": "^1.8.0",
"html-webpack-plugin": "^5.5.3",
"js-yaml": "^4.1.0",
"json-minimizer-webpack-plugin": "^4.0.0",
"lefthook": "^1.4.1",
"lefthook": "^1.4.2",
"mini-css-extract-plugin": "^2.7.6",
"npm-run-all": "^4.1.5",
"postcss": "^8.4.24",
"postcss-scss": "^4.0.6",
"prettier": "^2.8.8",
"rimraf": "^5.0.1",
"sass": "^1.62.1",
"sass-loader": "^13.3.1",
"sass": "^1.63.4",
"sass-loader": "^13.3.2",
"stylelint": "^14.16.1",
"stylelint-config-sass-guidelines": "^9.0.1",
"stylelint-config-standard": "^29.0.0",
"stylelint-high-performance-animation": "^1.8.0",
"tree-kill": "1.2.2",
"vue-devtools": "^5.1.4",
"vue-eslint-parser": "^9.3.0",
"vue-eslint-parser": "^9.3.1",
"vue-loader": "^15.10.0",
"webpack": "^5.84.1",
"webpack-cli": "^5.1.1",
"webpack-dev-server": "^4.15.0",
"webpack": "^5.87.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1",
"yaml-eslint-parser": "^1.2.2"
}
}

View File

@ -9,6 +9,7 @@ import { MAIN_PROFILE_ID } from '../../../constants'
import { calculateColorLuminance, getRandomColor } from '../../helpers/colors'
import {
copyToClipboard,
escapeHTML,
getTodayDateStrLocalTimezone,
readFileFromDialog,
showOpenDialog,
@ -591,12 +592,7 @@ export default defineComponent({
let opmlData = '<opml version="1.1"><body><outline text="YouTube Subscriptions" title="YouTube Subscriptions">'
this.profileList[0].subscriptions.forEach((channel) => {
const escapedName = channel.name
.replaceAll('&', '&amp;')
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;')
.replaceAll('"', '&quot;')
.replaceAll('\'', '&apos;')
const escapedName = escapeHTML(channel.name)
const channelOpmlString = `<outline text="${escapedName}" title="${escapedName}" type="rss" xmlUrl="https://www.youtube.com/feeds/videos.xml?channel_id=${channel.id}"/>`
opmlData += channelOpmlString

View File

@ -17,11 +17,17 @@ import { sponsorBlockSkipSegments } from '../../helpers/sponsorblock'
import { calculateColorLuminance, colors } from '../../helpers/colors'
import { pathExists } from '../../helpers/filesystem'
import { getPicturesPath, showSaveDialog, showToast } from '../../helpers/utils'
import { getProxyUrl } from '../../helpers/api/invidious'
import store from '../../store'
// YouTube now throttles if you use the `Range` header for the DASH formats, instead of the range query parameter
// videojs-http-streaming calls this hook everytime it makes a request,
// so we can use it to convert the Range header into the range query parameter for the streaming URLs
videojs.Vhs.xhr.beforeRequest = (options) => {
if (store.getters.getProxyVideos) {
const { uri } = options
options.uri = getProxyUrl(uri)
}
// pass in the optional base so it doesn't error for `dashFiles/videoId.xml` (DASH manifest in dev mode)
if (new URL(options.uri, window.location.origin).hostname.endsWith('.googlevideo.com')) {
// The official clients use POST requests with this body for the DASH requests, so we should do that too
@ -34,7 +40,6 @@ videojs.Vhs.xhr.beforeRequest = (options) => {
}
}
}
// videojs-http-streaming spits out a warning every time you access videojs.Vhs.BANDWIDTH_VARIANCE
// so we'll get the value once here, to stop it spamming the console
// https://github.com/videojs/http-streaming/blob/main/src/config.js#L8-L10
@ -304,6 +309,10 @@ export default defineComponent({
screenshotFolder: function() {
return this.$store.getters.getScreenshotFolderPath
},
proxyVideos: function () {
return this.$store.getters.getProxyVideos
}
},
watch: {
@ -1224,7 +1233,15 @@ export default defineComponent({
this.useDash = false
this.useHls = false
this.activeSourceList = this.sourceList
this.activeSourceList = (this.proxyVideos || !process.env.IS_ELECTRON)
// use map here to return slightly different list without modifying original
? this.sourceList.map((source) => {
return {
...source,
url: getProxyUrl(source.url)
}
})
: this.sourceList
setTimeout(this.initializePlayer, 100)
},

View File

@ -1,4 +1,4 @@
import { defineComponent } from 'vue'
import { defineComponent, nextTick } from 'vue'
import FtCard from '../ft-card/ft-card.vue'
export default defineComponent({
@ -23,8 +23,12 @@ export default defineComponent({
}
},
computed: {
currentChapter: function () {
return this.chapters[this.currentIndex]
},
currentTitle: function () {
return this.chapters[this.currentIndex].title
return this.currentChapter.title
},
compact: function () {
@ -67,6 +71,23 @@ export default defineComponent({
}
chapterElements[newIndex].focus()
}
},
toggleShowChapters() {
this.showChapters = !this.showChapters
if (this.showChapters) { this.scrollToCurrentChapter() }
},
scrollToCurrentChapter() {
const container = this.$refs.chaptersWrapper
const currentChaptersItem = (this.$refs.currentChaptersItem || [])[0]
// Must wait until rendering done after value change
nextTick(() => {
if (container != null && currentChaptersItem != null) {
container.scrollTop = currentChaptersItem.offsetTop - container.offsetTop
}
})
},
}
})

View File

@ -8,9 +8,9 @@
: $t('Chapters.Chapters list hidden, current chapter: {chapterName}', null, { chapterName: currentTitle })
"
:aria-pressed="showChapters"
@click="showChapters = !showChapters"
@keydown.space.stop.prevent="showChapters = !showChapters"
@keydown.enter.stop.prevent="showChapters = !showChapters"
@click="toggleShowChapters"
@keydown.space.stop.prevent="toggleShowChapters"
@keydown.enter.stop.prevent="toggleShowChapters"
>
{{ $t("Chapters.Chapters") }}
@ -36,6 +36,7 @@
<div
v-for="(chapter, index) in chapters"
:key="index"
:ref="index === currentIndex ? 'currentChaptersItem' : null"
class="chapter"
role="button"
tabindex="0"

View File

@ -6,6 +6,16 @@ function getCurrentInstance() {
return store.getters.getCurrentInvidiousInstance
}
export function getProxyUrl(uri) {
const url = new URL(uri)
const { origin } = url
if (!url.searchParams.has('host') && origin !== getCurrentInstance()) {
// invidious requires host param to be filled with the origin of the stream
url.searchParams.append('host', origin.replace('https://', ''))
}
return url.toString().replace(origin, getCurrentInstance())
}
export function invidiousAPICall({ resource, id = '', params = {}, doLogError = true, subResource = '' }) {
return new Promise((resolve, reject) => {
const requestUrl = getCurrentInstance() + '/api/v1/' + resource + '/' + id + (!isNullOrEmpty(subResource) ? `/${subResource}` : '') + '?' + new URLSearchParams(params).toString()
@ -119,7 +129,7 @@ export function youtubeImageUrlToInvidious(url, currentInstance = null) {
}
export function invidiousImageUrlToInvidious(url, currentInstance = null) {
return url.replace(/^.+(ggpht.+)/, currentInstance)
return url.replaceAll(/(\/ggpht\/)/g, `${currentInstance}/ggpht/`)
}
function parseInvidiousCommentData(response) {
@ -128,7 +138,7 @@ function parseInvidiousCommentData(response) {
comment.authorLink = comment.authorId
comment.authorThumb = youtubeImageUrlToInvidious(comment.authorThumbnails[1].url)
comment.likes = comment.likeCount
comment.text = autolinker.link(stripHTML(comment.content))
comment.text = autolinker.link(stripHTML(invidiousImageUrlToInvidious(comment.contentHtml, getCurrentInstance())))
comment.dataType = 'invidious'
comment.isOwner = comment.authorIsChannelOwner
comment.numReplies = comment.replies?.replyCount ?? 0

View File

@ -5,6 +5,7 @@ import { join } from 'path'
import { PlayerCache } from './PlayerCache'
import {
CHANNEL_HANDLE_REGEX,
escapeHTML,
extractNumberFromString,
getUserDataPath,
toLocalePublicationString
@ -551,8 +552,12 @@ export function parseLocalTextRuns(runs, emojiSize = 16, options = { looseChanne
const parsedRuns = []
for (const run of runs) {
// may contain HTML, so we need to escape it, as we don't render unwanted HTML
// example: https://youtu.be/Hh_se2Zqsdk (see pinned comment)
const text = escapeHTML(run.text)
if (run instanceof Misc.EmojiRun) {
const { emoji, text } = run
const { emoji } = run
// empty array if video creator removes a channel emoji so we ignore.
// eg: pinned comment here https://youtu.be/v3wm83zoSSY
@ -577,7 +582,7 @@ export function parseLocalTextRuns(runs, emojiSize = 16, options = { looseChanne
parsedRuns.push(`<img src="${emoji.image[0].url}" alt="${altText}" width="${emojiSize}" height="${emojiSize}" loading="lazy" style="vertical-align: middle">`)
}
} else {
const { text, bold, italics, strikethrough, endpoint } = run
const { bold, italics, strikethrough, endpoint } = run
if (endpoint) {
switch (endpoint.metadata.page_type) {

View File

@ -406,7 +406,7 @@ export function createWebURL(path) {
// strip html tags but keep <br>, <b>, </b> <s>, </s>, <i>, </i>
export function stripHTML(value) {
return value.replaceAll(/(<(?!br|\/?[bis]>)([^>]+)>)/gi, '')
return value.replaceAll(/(<(?!br|\/?[bis]|img>)([^>]+)>)/gi, '')
}
/**
@ -646,3 +646,16 @@ export function getTodayDateStrLocalTimezone() {
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString
return timeNowStr.split('T')[0]
}
/**
* Escapes HTML tags to avoid XSS
* @param {string} untrusted
* @returns {string}
*/
export function escapeHTML(untrusted) {
return untrusted.replaceAll('&', '&amp;')
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;')
.replaceAll('"', '&quot;')
.replaceAll('\'', '&apos;')
}

View File

@ -15,7 +15,7 @@ Cut: 'قص'
Copy: 'نسخ'
Paste: 'لصق'
Delete: 'حذف'
Select all: 'تحديد الكل'
Select all: 'حدد الكل'
Reload: 'إعادة تحميل'
Force Reload: 'فرض إعادة التحميل'
Toggle Developer Tools: 'فتح أدوات المطوّر'

View File

@ -954,7 +954,7 @@ Age Restricted:
This {videoOrPlaylist} is age restricted: Toto {videoOrPlaylist} je omezeno věkem
Type:
Channel: kanál
Video: video
Video: Video
Channels:
Channels: Kanály
Title: Seznam kanálů

View File

@ -411,6 +411,11 @@ Settings:
Hide Channel Community: Kanal-Gemeinschaft ausblenden
Hide Channel Shorts: Shorts des jeweiligen Kanals ausblenden
Hide Featured Channels: Hervorgehobene Kanäle ausblenden
Sections:
Side Bar: Seitenleiste
Channel Page: Kanalseite
General: Allgemein
Watch Page: Seite beobachten
The app needs to restart for changes to take effect. Restart and apply change?: Um
die Änderungen anzuwenden muss die Anwendung neustarten. Jetzt neustarten und
Änderungen aktivieren?

View File

@ -403,6 +403,11 @@ Settings:
Hide Channel Playlists: Ocultar las listas de reproducción de los canales
Hide Channel Community: Ocultar los canal de la comunidad
Hide Channel Shorts: Ocultar los canales de vídeos cortos
Sections:
Side Bar: Barra lateral
Channel Page: Página del canal
Watch Page: Ver la página
General: General
The app needs to restart for changes to take effect. Restart and apply change?: ¿Quieres
reiniciar FreeTube ahora para aplicar los cambios?
Proxy Settings:

View File

@ -399,6 +399,11 @@ Settings:
Hide Channel Playlists: Piilota kanavan soittolistat
Hide Channel Community: Piilota kanava yhteisö
Hide Channel Shorts: Piilota kanavan lyhytelokuvat
Sections:
Side Bar: Sivupalkki
Channel Page: Kanavan sivu
Watch Page: Katso sivu
General: Yleiset
The app needs to restart for changes to take effect. Restart and apply change?: Sovellus
on käynnistettävä uudelleen, jotta muutokset tulevat voimaan. Käynnistetäänkö
uudelleen?
@ -569,6 +574,10 @@ Channel:
This channel currently does not have any posts: Tällä kanavalla ei ole tällä hetkellä
mitään
Community: Yhteisö
Live:
Live: Livenä
This channel does not currently have any live streams: Tällä kanavalla ei ole
tällä hetkellä yhtään suoraa lähetystä
Video:
Open in YouTube: 'Avaa Youtubessa'
Copy YouTube Link: 'Kopioi Youtube-linkki'
@ -708,6 +717,8 @@ Video:
Show Super Chat Comment: Näytä Super Chat -kommentti
Scroll to Bottom: Vieritä alaspäin
Upcoming: Tuleva
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Live-chat
ei ole käytettävissä tässä suoratoistossa. Lataaja on saattanut poistaa sen käytöstä.
Videos:
#& Sort By
Sort By:
@ -964,3 +975,7 @@ Chapters:
nykyinen luku: {chapterName}'
Preferences: Asetukset
Ok: OK
Hashtag:
Hashtag: Avainsana
This hashtag does not currently have any videos: Tällä avainsanalla ei ole tällä
hetkellä yhtään videota

View File

@ -422,6 +422,11 @@ Settings:
Hide Featured Channels: Masquer les chaînes en vedette
Hide Channel Community: Masquer la communauté de la chaîne
Hide Channel Shorts: Masquer les shorts de la chaîne
Sections:
Channel Page: Page de la chaîne
Side Bar: Barre latérale
Watch Page: Page de lecture
General: Général
The app needs to restart for changes to take effect. Restart and apply change?: L'application
doit être redémarrée pour que les changements prennent effet. Redémarrer et appliquer
les changements ?
@ -565,7 +570,7 @@ About:
Downloads / Changelog: Téléchargements / Journal des modifications
Channel:
Subscriber: 'Abonnement'
Subscribers: 'Abonnements'
Subscribers: 'Abonnés'
Subscribe: 'S''abonner'
Unsubscribe: 'Se désabonner'
Search Channel: 'Chercher une chaîne'

View File

@ -403,6 +403,11 @@ Settings:
Hide Channel Playlists: Sakrij kanal zbirki
Hide Channel Community: Sakrij kanal zajednice
Hide Channel Shorts: Sakrij kanal kratkih videa
Sections:
Watch Page: Stranica gledanja
General: Opće
Side Bar: Bočna traka
Channel Page: Stranica kanala
The app needs to restart for changes to take effect. Restart and apply change?: Promjene
će se primijeniti nakon ponovnog pokeretanja programa. Ponovo pokrenuti program?
Proxy Settings:

View File

@ -411,6 +411,11 @@ Settings:
Hide Channel Playlists: Csatorna lejátszási listák elrejtése
Hide Channel Community: Csatornaközösség elrejtése
Hide Channel Shorts: Csatorna rövidfilmek elrejtése
Sections:
Side Bar: Oldalsáv
Channel Page: Csatornalap
Watch Page: Nézőlap
General: Általános
The app needs to restart for changes to take effect. Restart and apply change?: Az
alkalmazásnak újra kell indulnia, hogy a változtatások életbe lépjenek. Indítsa
újra és alkalmazza a módosítást?
@ -659,8 +664,8 @@ Video:
Watching: 'Megtekintő'
Watched: 'Megtekintett'
Autoplay: 'Önműködő lejátszás'
Starting soon, please refresh the page to check again: 'Hamarosan kezdődik. Kérjük,
frissítse az oldalt az ellenőrzéshez'
Starting soon, please refresh the page to check again: 'Hamarosan kezdődik, kérjük,
frissítse a lapot az ellenőrzéshez'
# As in a Live Video
Live: 'Élő'
Live Now: 'Élő most'
@ -926,7 +931,7 @@ Tooltips:
használja helyette.
Privacy Settings:
Remove Video Meta Files: Ha engedélyezve van, a SzabadCső önműködően törli a videolejátszás
során létrehozott metafájlokat, amikor a videómegtekintő oldal bezárul.
során létrehozott metafájlokat, amikor a nézőlap bezár.
External Player Settings:
Custom External Player Executable: Alapértelmezés szerint a SzabadCső feltételezi,
hogy a kiválasztott külső lejátszó megtalálható a PATH (ÚTVONAL) környezeti

View File

@ -282,6 +282,8 @@ Settings:
Enter Fullscreen on Display Rotate: Fara í skjáfylli við snúning á skjá
Skip by Scrolling Over Video Player: Sleppa með því að skruna ofan á myndspilara
Allow DASH AV1 formats: Leyfa DASH AV1 snið
Comment Auto Load:
Comment Auto Load: Hlaða sjálfkrafa inn athugasemdum
Privacy Settings:
Privacy Settings: 'Stillingar gagnaleyndar'
Remember History: 'Muna áhorfsferil'
@ -328,6 +330,15 @@ Settings:
Hide Channels: Fela myndskeið úr rásum
Hide Channels Placeholder: Heiti eða auðkenni rásar
Display Titles Without Excessive Capitalisation: Birta titla án umfram-hástafa
Sections:
Side Bar: Hliðarspjald
Channel Page: Rásasíða
Watch Page: Áhorfssíða
General: Almennt
Hide Channel Shorts: Fela stuttmyndir rása
Hide Channel Playlists: Fela spilunarlista rása
Hide Channel Community: Fela samfélag rása
Hide Featured Channels: Fela rásir í deiglunni
Data Settings:
Data Settings: 'Stillingar gagna'
Select Import Type: 'Veldu tegund innflutnings'
@ -565,6 +576,10 @@ Channel:
Community:
Community: Samfélag
This channel currently does not have any posts: Þessi rás er ekki með neinar færslur
Shorts:
Shorts: Stuttmyndir
This channel does not currently have any shorts: Þessi rás er í augnablikinu ekki
með neinar stuttmyndir
Video:
Mark As Watched: 'Merkja sem búið að horfa á'
Remove From History: 'Fjarlægja úr áhorfsferli'
@ -607,8 +622,8 @@ Video:
í þessari byggingarútgáfu.'
'Chat is disabled or the Live Stream has ended.': 'Spjall er óvirkt eða að beinu
streymi er lokið.'
Live chat is enabled. Chat messages will appear here once sent.: 'Beint spjall
er virkt. Skilaboð spjallsins munu birtast hér.'
Live chat is enabled. Chat messages will appear here once sent.: 'Beint spjall er
virkt. Skilaboð spjallsins munu birtast hér.'
'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': 'Spjall
í beinni er ekki stutt í Invidious API-kerfisviðmótinu. Nauðsynlegt er að vera
með beina tengingu við YouTube.'
@ -803,9 +818,9 @@ Tooltips:
Region for Trending: 'Landssvæði sem skal miða vinsældir við gerir þér kleift
að velja í hvaða landi aukning á vinsældum í umræðunni skal miða við. Ekki eru
öll löndin sem birtast raunverulega studd af YouTube.'
External Link Handling: "Veldu sjálfgefna hegðun þegar smellt er á tengil sem\
\ ekki er hægt að opna í FreeTube.\nSjálfgefið mun FreeTube opna viðkomandi\
\ tengil í sjálfgefna vafranum þínum.\n"
External Link Handling: "Veldu sjálfgefna hegðun þegar smellt er á tengil sem
ekki er hægt að opna í FreeTube.\nSjálfgefið mun FreeTube opna viðkomandi tengil
í sjálfgefna vafranum þínum.\n"
Player Settings:
Force Local Backend for Legacy Formats: 'Virkar bara þegar Invidious API-kerfisviðmótið
er sjálfgefið hjá þér. Þegar þetta er virkt, mun staðværa API-kerfisviðmótið
@ -934,3 +949,7 @@ Chapters:
núverandi kafli: {chapterName}'
Preferences: Kjörstillingar
Ok: Í lagi
Hashtag:
Hashtag: Myllumerki
This hashtag does not currently have any videos: Þetta myllumerki er í augnablikinu
ekki með nein myndskeið

View File

@ -61,12 +61,14 @@ Search Filters:
Videos: 'Vaizdo įrašai'
Channels: 'Kanalai'
#& Playlists
Movies: Filmai
Duration:
Duration: 'Trukmė'
All Durations: 'Visos trukmės'
Short (< 4 minutes): 'Trumpas (< 4 minutės)'
Long (> 20 minutes): 'Ilgas (> 20 minutės)'
# On Search Page
Medium (4 - 20 minutes): Vidutinis (4 - 20 minučių)
Search Results: 'Paieškos rezultatai'
Fetching results. Please wait: 'Rezultatai kraunami. Prašome luktelėti'
Fetch more results: 'Įkelti daugiau rezultatų'
@ -278,6 +280,10 @@ Settings:
Video Playback Rate Interval: Vaizdo įrašų atkūrimo dažnio intervalas
Max Video Playback Rate: Maksimalus vaizdo įrašų atkūrimo dažnis
Enter Fullscreen on Display Rotate: Viso ekrano režimas pasukus ekraną
Skip by Scrolling Over Video Player: Praleiskite slinkdami per vaizdo grotuvą
Comment Auto Load:
Comment Auto Load: Komentuoti Automatinis įkėlimas
Allow DASH AV1 formats: Leisti DASH AV1 formatus
External Player Settings:
External Player Settings: 'Išorinio grotuvo nustatymai'
External Player: 'Išorinis grotuvas'
@ -304,6 +310,8 @@ Settings:
Remove All Subscriptions / Profiles: 'Pašalinti visas prenumeratas / profilius'
Are you sure you want to remove all subscriptions and profiles? This cannot be undone.: 'Ar
tikrai norite pašalinti visas prenumeratas ir profilius? To nebus galima atšaukti.'
Save Watched Videos With Last Viewed Playlist: Išsaugokite Žiūrėtus Vaizdo Įrašus
Naudodami Paskutinį Žiūrėtą Grojaraštį
Subscription Settings:
Subscription Settings: 'Prenumeratų nustatymai'
Hide Videos on Watch: 'Slėpti vaizdo įrašus po peržiūros'
@ -328,6 +336,19 @@ Settings:
Hide Sharing Actions: Slėpti bendrinimo veiksmus
Hide Chapters: Slėpti skirsnius
Hide Upcoming Premieres: Slėpti būsimas premjeras
Sections:
General: Generolas
Side Bar: Šoninė juosta
Channel Page: Kanalas Puslapis
Watch Page: Žiūrėti Puslapis
Display Titles Without Excessive Capitalisation: Rodyti Pavadinimus Be Per Daug
Didžiųjų Raidžių
Hide Channels: Slėpti Vaizdo Įrašus Iš Kanalai
Hide Channels Placeholder: Kanalo pavadinimas arba ID
Hide Featured Channels: Slėpti Teminiai kanalai
Hide Channel Playlists: Slėpti Kanalo Grojaraščiai
Hide Channel Community: Slėpti Kanalo Bendruomenę
Hide Channel Shorts: Slėpti Kanalo Šortus
Data Settings:
Data Settings: 'Duomenų nustatymai'
Select Import Type: 'Pasirinkti importavimo tipą'
@ -421,9 +442,13 @@ Settings:
Experimental Settings:
Replace HTTP Cache: Pakeisti HTTP talpyklą
Experimental Settings: Eksperimentiniai nustatymai
Warning: Šie nustatymai yra eksperimentiniai, juos įjungus gali būti sutrikimų.
Warning: Šie nustatymus yra eksperimentiniai, juos įjungus gali būti sutrikimų.
Labai rekomenduojama iš anksto pasidaryti atsargines kopijas. Naudokite savo
rizika!
Password Dialog:
Password Incorrect: Slaptažodis Neteisingas
Password: Slaptažodis
Enter Password To Unlock: Įveskite slaptažodį į atrakintumėte nustatymus
About:
#On About page
About: 'Apie'
@ -756,9 +781,9 @@ Tooltips:
Region for Trending: '„Dabar populiaru“ regionas leidžia pasirinkti, kurios šalies
populiarius vaizdo įrašus norite rodyti. YouTube iš tikrųjų nepalaiko visų rodomų
šalių.'
External Link Handling: "Pasirinkite numatytąjį elgesį, kai spustelėjama nuoroda,\
\ kurios negalima atidaryti „FreeTube“.\nPagal numatytuosius nustatymus „FreeTube“\
\ atidarys spustelėtą nuorodą numatytojoje naršyklėje.\n"
External Link Handling: "Pasirinkite numatytąjį elgesį, kai spustelėjama nuoroda,
kurios negalima atidaryti „FreeTube“.\nPagal numatytuosius nustatymus „FreeTube“
atidarys spustelėtą nuorodą numatytojoje naršyklėje.\n"
Player Settings:
Force Local Backend for Legacy Formats: 'Veikia tik tada, kai numatytasis nustatymas
yra „Invidious“ API. Kai įgalinta, vietinė API veiks ir naudos senus, o ne „Invidious“

View File

@ -272,6 +272,7 @@ Settings:
Comment Auto Load:
Comment Auto Load: Commentaar Automatisch Laden
Skip by Scrolling Over Video Player: Overslaan door over de videospeler te scrollen
Allow DASH AV1 formats: DASH-AV1-bestandstypes toestaan
Privacy Settings:
Privacy Settings: 'Privacy-instellingen'
Remember History: 'Kijkgeschiedenis onthouden'
@ -295,6 +296,7 @@ Settings:
Hide Videos on Watch: 'Bekeken video''s verbergen'
Manage Subscriptions: 'Abonnementen beheren'
Fetch Feeds from RSS: Verzamel feeds via RSS
Fetch Automatically: Haal feed automatisch op
Advanced Settings:
Advanced Settings: 'Geavanceerde Instellingen'
Enable Debug Mode (Prints data to the console): 'Schakel Debug Modus in (Print
@ -368,6 +370,9 @@ Settings:
item word overgeslagen
All playlists has been successfully exported: Alle speellijsten zijn met succes
geëxporteerd
Subscription File: Abonnementenbestand
History File: Geschiedenisbestand
Playlist File: Afspeellijstbestand
Distraction Free Settings:
Hide Live Chat: Livechat verbergen
Hide Popular Videos: Populaire video's verbergen
@ -384,6 +389,11 @@ Settings:
Hide Video Description: Verberg de beschrijving van de video
Hide Comments: Verberg de reacties
Hide Live Streams: Verberg rechtstreekse uitzendingen
Display Titles Without Excessive Capitalisation: Toon titels zonder overmatig
hoofdlettergebruik
Sections:
Side Bar: Zijbalk
General: Algemeen
The app needs to restart for changes to take effect. Restart and apply change?: De
applicatie moet opnieuw opstarten om de veranderingen aan te brengen. Wilt u opnieuw
opstarten en verandering toepassen?
@ -440,6 +450,10 @@ Settings:
Parental Control Settings: Instellingen voor ouderlijk toezicht
Show Family Friendly Only: Enkel familievriendelijke inhoud tonen
Hide Search Bar: Zoekbalk verbergen
Experimental Settings:
Warning: Dit zijn experimentele instellingen, die een crash kunnen veroorzaken.
Het is raadzaam backups te maken. Gebruiken op eigen risico!
Experimental Settings: Experimentele instellingen
About:
#On About page
About: 'Over'
@ -907,6 +921,6 @@ Channels:
Empty: Uw lijst van kanalen is thans leeg.
Unsubscribe: Afmelden
Unsubscribed: '{channelName} is verwijderd uit uw lijst van abonnees'
Unsubscribe Prompt: Weet je zeker dat je je wilt afmelden voor "{channelName}"?
Unsubscribe Prompt: Weet je zeker dat je wilt afmelden voor "{channelName}"?
Screenshot Error: Schermafbeelding kon niet worden opgeslagen. {error}
Preferences: Voorkeuren

View File

@ -410,6 +410,11 @@ Settings:
Hide Channel Shorts: Schowaj filmy Short kanału
Hide Featured Channels: Schowaj polecane kanały
Hide Channel Playlists: Schowaj playlisty kanału
Sections:
Side Bar: Pasek boczny
Channel Page: Strona kanału
General: Ogólne
Watch Page: Strona odtwarzacza
The app needs to restart for changes to take effect. Restart and apply change?: Aplikacja
musi zostać ponownie uruchomiona, aby zmiany zostały wprowadzone. Uruchomić ponownie
i zastosować zmiany?
@ -942,7 +947,7 @@ Tooltips:
DASH.
Privacy Settings:
Remove Video Meta Files: Po włączeniu FreeTube automatycznie usunie pliki metadanych
utworzone podczas odtwarzania filmu, gdy strona odtwarzania zostanie zamknięta.
utworzone podczas odtwarzania filmu, gdy strona odtwarzacza zostanie zamknięta.
External Player Settings:
Ignore Warnings: Nie pokazuj ostrzeżeń o nieobsługiwanych akcjach przez zewnętrzny
odtwarzacz (n.p. odwracanie playlist, itp.).

View File

@ -336,6 +336,11 @@ Settings:
Hide Channel Playlists: Ocultar listas de reprodução de canais
Hide Channel Community: Ocultar canal Comunidade
Hide Channel Shorts: Esconder as curtas do canal
Sections:
Side Bar: Barra lateral
Channel Page: Página do canal
Watch Page: Ver página
General: Geral
Data Settings:
Data Settings: Definições de dados
Select Import Type: Escolher tipo de importação

View File

@ -433,6 +433,11 @@ Settings:
Hide Channel Playlists: Ocultar listas de reprodução de canais
Hide Channel Community: Ocultar canal Comunidade
Hide Channel Shorts: Esconder as curtas do canal
Sections:
Side Bar: Barra lateral
Channel Page: Página do canal
Watch Page: Ver página
General: Geral
External Player Settings:
Custom External Player Arguments: Argumentos do reprodutor externo personalizado
Custom External Player Executable: Executável de reprodutor externo personalizado

View File

@ -244,9 +244,9 @@ Settings:
8k: '8k'
Playlist Next Video Interval: Задержка перед автовоспроизведением
Scroll Volume Over Video Player: Прокрутка громкости поверх видеопроигрывателя
Next Video Interval: Промежуток к переходу на следующее видео
Next Video Interval: Шаг перехода на следующее видео
Display Play Button In Video Player: Отображать кнопку воспроизведения в видеопроигрывателе
Fast-Forward / Rewind Interval: Промежуток перемотки вперёд/назад
Fast-Forward / Rewind Interval: Шаг перемотки вперёд/назад
Scroll Playback Rate Over Video Player: Прокрутка скорости воспроизведения поверх
видеопроигрывателя
Max Video Playback Rate: Предельная скорость воспроизведения
@ -265,7 +265,7 @@ Settings:
File Name Tooltip: Вы можете использовать эти переменные. %Y Год 4 цифры. %M
Месяц 2 цифры. %D День 2 цифры. %H Час 2 цифры. %N Минуты 2 цифры. %S Секунды
2 цифры. %T Миллисекунды 3 цифры. %s Секунды видео. %t Миллисекунды видео
3 цифры. %i Идентификатор видео. Вы также можете использовать "\" или "/"
3 цифры. %i Идентификатор видео. Вы также можете использовать «\» или «/»
для создания подпапок.
Enter Fullscreen on Display Rotate: Входить в полноэкранный режим при повороте
дисплея
@ -383,7 +383,7 @@ Settings:
Hide Popular Videos: Скрыть популярные видео
Hide Trending Videos: Скрыть видео в тренде
Hide Recommended Videos: Скрыть рекомендуемые видео
Distraction Free Settings: Настройки причин отвлечения внимания
Distraction Free Settings: Отвлекающие части интерфейса
Hide Comment Likes: Скрыть лайки в комментариях
Hide Channel Subscribers: Скрыть подписчиков канала
Hide Video Likes And Dislikes: Скрыть лайки и дизлайки к видео
@ -404,6 +404,11 @@ Settings:
Hide Channel Playlists: Скрыть подборки канала
Hide Channel Community: Скрыть сообщество канала
Hide Channel Shorts: Скрыть короткие видео канала
Sections:
Side Bar: Боковая полоса
Channel Page: Страница канала
Watch Page: Страница просмотра
General: Основные
The app needs to restart for changes to take effect. Restart and apply change?: Чтобы
изменения вступили в силу, необходимо перезапустить приложение. Перезапустить
и применить изменения?
@ -411,7 +416,7 @@ Settings:
Error getting network information. Is your proxy configured properly?: Ошибка
при получении информации о сети. Правильно ли настроен ваш прокси-сервер?
Your Info: Ваша информация
Clicking on Test Proxy will send a request to: Нажмите "Протестировать прокси",
Clicking on Test Proxy will send a request to: Нажмите «Протестировать прокси»,
чтобы отправить запрос на
Test Proxy: Протестировать прокси
Proxy Port Number: Порт прокси-сервера
@ -424,7 +429,7 @@ Settings:
Enable Tor / Proxy: Включить Tor/Прокси
Proxy Settings: Прокси
SponsorBlock Settings:
Notify when sponsor segment is skipped: Уведомлять о пропущенном отрезке спонсора
Notify when sponsor segment is skipped: Уведомлять о пропущенном сегменте
'SponsorBlock API Url (Default is https://sponsor.ajay.app)': Сетевой адрес SponsorBlock
API (По умолчанию https://sponsor.ajay.app)
Enable SponsorBlock: Включить
@ -433,7 +438,7 @@ Settings:
Skip Option: Опция пропуска
Prompt To Skip: Предлагать пропустить
Auto Skip: Автопропуск
Show In Seek Bar: Показать на панели
Show In Seek Bar: Показать сегмент
Do Nothing: Ничего не делать
Category Color: Цвет категории
External Player Settings:
@ -579,9 +584,9 @@ Channel:
This channel currently does not have any posts: На этом канале в настоящее время
нет никаких записей
Live:
Live: Прямой показ
Live: Трансляции
This channel does not currently have any live streams: На этом канале в настоящее
время нет прямых показов
время нет прямых трансляций
Shorts:
Shorts: Короткие видео
This channel does not currently have any shorts: На этом канале пока что нет коротких
@ -605,18 +610,18 @@ Video:
Watched: 'Просмотрено'
# As in a Live Video
Live: 'Трансляция'
Live Now: 'Прямой эфир'
Live Now: 'Трансляция'
Live Chat: 'Чат трансляции'
Enable Live Chat: 'Включить чат трансляции'
Live Chat is currently not supported in this build.: 'В настоящее время чат трансляции
в этой версии не поддерживается.'
'Chat is disabled or the Live Stream has ended.': 'Чат отключен или прямая трансляция
закончилась.'
'Chat is disabled or the Live Stream has ended.': 'Чат отключён или прямая трансляция
завершена.'
Live chat is enabled. Chat messages will appear here once sent.: 'Чат трансляции
включен. Сообщения чата будут отображаться здесь после отправки.'
включён. Сообщения чата будут отображаться здесь после отправки.'
'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': 'Чат
трансляции в настоящее время не поддерживается набором функций Invidious. Требуется
прямое подключение к YouTube.'
трансляции в настоящее время не поддерживается Invidious API. Требуется прямое
подключение к YouTube.'
Published:
Jan: 'Янв'
Feb: 'Фев'
@ -679,13 +684,13 @@ Video:
translated from English: переведён с английского
Sponsor Block category:
music offtopic: Сегмент без музыки
interaction: Напоминание о подписке (взаимодействие)
interaction: Напоминание
self-promotion: Самореклама
outro: Концовка
intro: Вступление
sponsor: Покровитель
sponsor: Спонсор
recap: Краткое содержание
filler: Наполнитель
filler: Отвлечение
Skipped segment: Пропущенный сегмент
External Player:
Unsupported Actions:
@ -728,8 +733,8 @@ Video:
Show Super Chat Comment: Показать комментарий «Супер Чата»
Scroll to Bottom: Прокрутите вниз
Upcoming: Предстоящее
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Прямой
чат недоступен для этого показа. Возможно, он был отключён загрузчиком.
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Чат
прямой трансляции недоступен. Возможно, он был отключён владельцем канала.
Videos:
#& Sort By
Sort By:
@ -900,7 +905,7 @@ Tooltips:
Subscription Settings:
Fetch Feeds from RSS: Если эта настройка включена, FreeTube будет получать вашу
ленту подписок с помощью RSS, а не как обычно. RSS работает быстрее и предотвращает
блокировку IP, но не предоставляет определенную информацию, такую как продолжительность
блокировку IP, но не предоставляет определённую информацию, такую как продолжительность
видео или сведения о том, транслируется ли видео в настоящем времени
Fetch Automatically: Если эта функция включена, FreeTube автоматически будет получать
ленту ваших подписок как при открытии нового окна, так при переключении профиля.
@ -914,7 +919,7 @@ Tooltips:
Force Local Backend for Legacy Formats: Работает, только если по умолчанию используется
набор функций Invidious. Если эта настройка включена, локальный набор функций
будет работать и использовать устаревшие форматы вместо форматов Invidious.
Помогает, когда видео, возвращенные Invidious, не воспроизводятся из-за ограничений
Помогает, когда видео, возвращённые Invidious, не воспроизводятся из-за ограничений
страны.
Scroll Playback Rate Over Video Player: Пока указатель мыши находится над видео,
нажмите и удерживайте клавишу Control (клавиша Command на Mac) и прокрутите
@ -936,7 +941,7 @@ Tooltips:
Custom External Player Arguments: Любые пользовательские аргументы командной строки,
разделенные точкой с запятой (';'), которые вы хотите передать внешнему проигрывателю.
Ignore Warnings: Скрыть предупреждения, когда текущий внешний проигрыватель не
поддерживает текущее действие (например, обратный порядок подборок и др.).
поддерживает текущее действие (например, обратный порядок подборок и другие).
Custom External Player Executable: По умолчанию FreeTube будет считать, что выбранный
внешний проигрыватель можно найти через переменную окружения PATH. При необходимости
здесь можно задать собственный путь.
@ -946,7 +951,7 @@ Tooltips:
DefaultCustomArgumentsTemplate: "(По умолчанию: '{defaultCustomArguments}')"
Experimental Settings:
Replace HTTP Cache: Отключает дисковый HTTP-кэш Electron и включает пользовательский
кэш изображений в памяти. Приведет к увеличению использования оперативной памяти.
кэш изображений в памяти. Приведёт к увеличению использования оперативной памяти.
Distraction Free Settings:
Hide Channels: Введите название канала или его идентификатор, чтобы скрыть все
видео, подборки и сам канал от показа в поиске или трендах. Введённое название
@ -990,7 +995,7 @@ Channels:
Search bar placeholder: Поиск каналов
Unsubscribe: Отписаться
Unsubscribed: '{channelName} был удалён из ваших подписок'
Unsubscribe Prompt: Вы уверены, что хотите отписаться от "{channelName}"?
Unsubscribe Prompt: Вы уверены, что хотите отписаться от «{channelName}»?
Clipboard:
Copy failed: Не удалось скопировать в буфер обмена
Cannot access clipboard without a secure connection: Невозможно получить доступ

View File

@ -167,7 +167,7 @@ Tooltips:
میں نہیں ہیں۔ یوٹیوب کے ذریعہ تعاون یافتہ۔'
External Link Handling: |
'جب کوئی لنک، جسے FreeTube میں نہیں کھولا جا سکتا، پر کلک کیا جاتا ہے تو پہلے سے طے شدہ طرز عمل کا انتخاب کریں۔
بطور ڈیفالٹ FreeTube آپ کے ڈیفالٹ براؤزر میں کلک کردہ لنک کو کھول دے گا۔'
بطور ڈیفالٹ FreeTube آپ کے ڈیفالٹ براؤزر میں کلک کردہ لنک کو کھول دے گا۔'
Player Settings:
Force Local Backend for Legacy Formats: 'صرف اس وقت کام کرتا ہے جب Invidious API
آپ کا ہو۔ پہلے سے طے شدہ فعال ہونے پر، مقامی API چلائے گا اور لوٹے گئے لیگیسی

View File

@ -844,7 +844,7 @@ Search Bar:
Are you sure you want to open this link?: 您确定要打开此链接吗?
Unknown YouTube url type, cannot be opened in app: 未知的 YouTube url 类型,不能在应用程序中打开
External link opening has been disabled in the general settings: 外部链接打开在常规设置中被禁用
Hashtags have not yet been implemented, try again later: 哈希标签功能尚未实现,请稍后再试
Hashtags have not yet been implemented, try again later: 话题标签功能尚未实现,请稍后再试
Default Invidious instance has been set to {instance}: 默认的 Invidious 实例已被设置为 {instance}
Playing Next Video Interval: 马上播放下一个视频。单击取消。| {nextVideoInterval} 秒内播放下个视频。单击取消。 |
{nextVideoInterval} 秒内播放下个视频。单击取消。
@ -882,5 +882,5 @@ Chapters:
Preferences: 选项
Ok:
Hashtag:
Hashtag: 标签
This hashtag does not currently have any videos: 标签下当前没有任何短视频
Hashtag: 话题标签
This hashtag does not currently have any videos: 话题标签下当前没有任何短视频

1671
yarn.lock

File diff suppressed because it is too large Load Diff