This commit is contained in:
absidue 2024-04-21 11:07:34 +00:00 committed by GitHub
commit a33c66e5b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
98 changed files with 4681 additions and 7127 deletions

View File

@ -26,7 +26,7 @@
"selector-pseudo-class-no-unknown": [
true,
{
"ignorePseudoClasses": ["deep"]
"ignorePseudoClasses": ["deep", "global"]
}
],
"a11y/no-outline-none": true,

View File

@ -1,5 +0,0 @@
const DOMParser = window.DOMParser
export {
DOMParser
}

View File

@ -17,10 +17,14 @@ const web = process.argv.indexOf('--web') !== -1
let mainConfig
let rendererConfig
let webConfig
let SHAKA_LOCALES_TO_BE_BUNDLED
if (!web) {
mainConfig = require('./webpack.main.config')
rendererConfig = require('./webpack.renderer.config')
SHAKA_LOCALES_TO_BE_BUNDLED = rendererConfig.SHAKA_LOCALES_TO_BE_BUNDLED
delete rendererConfig.SHAKA_LOCALES_TO_BE_BUNDLED
} else {
webConfig = require('./webpack.web.config')
}
@ -110,16 +114,26 @@ function startRenderer(callback) {
})
const server = new WebpackDevServer({
static: {
directory: path.resolve(__dirname, '..', 'static'),
watch: {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
]
static: [
{
directory: path.resolve(__dirname, '..', 'static'),
watch: {
ignored: [
/(dashFiles|storyboards)\/*/,
'/**/.DS_Store',
]
},
publicPath: '/static'
},
publicPath: '/static'
},
{
directory: path.resolve(__dirname, '..', 'node_modules', 'shaka-player', 'ui', 'locales'),
publicPath: '/static/shaka-player-locales',
watch: {
// Ignore everything that isn't one of the locales that we would bundle in production mode
ignored: `**/!(${SHAKA_LOCALES_TO_BE_BUNDLED.join('|')}).json`
}
}
],
port
}, compiler)

114
_scripts/getShakaLocales.js Normal file
View File

@ -0,0 +1,114 @@
const { readFileSync, readdirSync } = require('fs')
function getPreloadedLocales() {
const localesFile = readFileSync(`${__dirname}/../node_modules/shaka-player/dist/locales.js`, 'utf-8')
const localesLine = localesFile.match(/^\/\/ LOCALES: ([\w, -]+)$/m)
if (!localesLine) {
throw new Error("Failed to parse shaka-player's preloaded locales")
}
return localesLine[1].split(',').map(locale => locale.trim())
}
function getAllLocales() {
const filenames = readdirSync(`${__dirname}/../node_modules/shaka-player/ui/locales`)
return new Set(filenames
.filter(filename => filename !== 'source.json' && filename.endsWith('.json'))
.map(filename => filename.replace('.json', '')))
}
/**
* Maps the shaka locales to FreeTube's active ones
* This allows us to know which locale files are actually needed
* and which shaka locale needs to be activated for a given FreeTube one.
* @param {Set<string>} shakaLocales
* @param {string[]} freeTubeLocales
*/
function getMappings(shakaLocales, freeTubeLocales) {
/**
* @type {[string, string][]}
* Using this structure as it gets passed to `new Map()` in the player component
* The first element is the FreeTube locale, the second one is the shaka-player one
**/
const mappings = []
for (const locale of freeTubeLocales) {
if (shakaLocales.has(locale)) {
mappings.push([
locale,
locale
])
} else if (shakaLocales.has(locale.replace('_', '-'))) {
mappings.push([
locale,
locale.replace('_', '-')
])
} else if (shakaLocales.has(locale.split(/[-_]/)[0])) {
mappings.push([
locale,
locale.split(/[-_]/)[0]
])
}
}
// special cases
mappings.push(
// according to https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
// "no" is the macro language for "nb" and "nn"
[
'nb_NO',
'no'
],
[
'nn',
'no'
],
// according to https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
// "iw" is the old/original code for Hewbrew, these days it's "he"
[
'he',
'iw'
],
// not sure why we have pt, pt-PT and pt-BR in the FreeTube locales
// as pt and pt-PT are the same thing, but we should handle it here anyway
[
'pt',
'pt-PT'
]
)
return mappings
}
function getShakaLocales() {
const shakaLocales = getAllLocales()
/** @type {string[]} */
const freeTubeLocales = JSON.parse(readFileSync(`${__dirname}/../static/locales/activeLocales.json`, 'utf-8'))
const mappings = getMappings(shakaLocales, freeTubeLocales)
const preloaded = getPreloadedLocales()
const shakaMappings = mappings.map(mapping => mapping[1])
// use a set to deduplicate the list
// we don't need to bundle any locale files that are already embedded in shaka-player/preloaded
/** @type {string[]} */
const toBeBundled = [...new Set(shakaMappings.filter(locale => !preloaded.includes(locale)))]
return {
SHAKA_LOCALE_MAPPINGS: mappings,
SHAKA_LOCALES_PREBUNDLED: preloaded,
SHAKA_LOCALES_TO_BE_BUNDLED: toBeBundled
}
}
module.exports = getShakaLocales()

105
_scripts/patchShaka.mjs Normal file
View File

@ -0,0 +1,105 @@
// This script fixes shaka not exporting its type definitions and referencing remote google fonts in its CSS
// by adding an export line to the type definitions and donwloading the fonts and updating the CSS to point to the local files
// this script only makes changes if they are needed, so running it multiple times doesn't cause any problems
import { appendFileSync, closeSync, ftruncateSync, openSync, readFileSync, writeFileSync, writeSync } from 'fs'
import { resolve } from 'path'
const SHAKA_DIST_DIR = resolve(import.meta.dirname, '../node_modules/shaka-player/dist')
function fixTypes() {
let fixedTypes = false
let fileHandleNormal
try {
fileHandleNormal = openSync(`${SHAKA_DIST_DIR}/shaka-player.ui.d.ts`, 'a+')
const contents = readFileSync(fileHandleNormal, 'utf-8')
// This script is run after every `yarn install`, even if shaka-player wasn't updated
// So we want to check first, if we actually need to make any changes
// or if the ones from the previous run are still intact
if (!contents.includes('export default shaka')) {
appendFileSync(fileHandleNormal, 'export default shaka;\n')
fixedTypes = true
}
} finally {
if (typeof fileHandleNormal !== 'undefined') {
closeSync(fileHandleNormal)
}
}
let fileHandleDebug
try {
fileHandleDebug = openSync(`${SHAKA_DIST_DIR}/shaka-player.ui.debug.d.ts`, 'a+')
const contents = readFileSync(fileHandleDebug, 'utf-8')
// This script is run after every `yarn install`, even if shaka-player wasn't updated
// So we want to check first, if we actually need to make any changes
// or if the ones from the previous run are still intact
if (!contents.includes('export default shaka')) {
appendFileSync(fileHandleDebug, 'export default shaka;\n')
fixedTypes = true
}
} finally {
if (typeof fileHandleDebug !== 'undefined') {
closeSync(fileHandleDebug)
}
}
if (fixedTypes) {
console.log('Fixed shaka-player types')
}
}
async function fixRemoteFonts() {
let cssFileHandle
try {
cssFileHandle = openSync(`${SHAKA_DIST_DIR}/controls.css`, 'r+')
let cssContents = readFileSync(cssFileHandle, 'utf-8')
const beforeRobotoReplacement = cssContents.length
cssContents = cssContents.replace(/@font-face\{font-family:Roboto;[^}]+\}/, '')
if (cssContents.length !== beforeRobotoReplacement) {
console.log('Removed shaka-player Roboto font, so it uses ours')
}
const remoteFontsRegex = /https:\/\/fonts\.gstatic\.com\/s\/(?<name>[^\/]+)\/(?<version>[^\/]+)\/[^.]+\.(?<extension>[a-z]+)/g
/** @type {RegExpMatchArray[]} */
const remoteFontMatches = [...cssContents.matchAll(remoteFontsRegex)]
if (remoteFontMatches.length > 0) {
console.log('Downloading shaka-player remote fonts...')
for (const match of remoteFontMatches) {
const url = match[0]
const { name, version, extension } = match.groups
const response = await fetch(url)
const fontContent = new Uint8Array(await response.arrayBuffer())
const filename = `shaka-${name}-${version}.${extension}`
writeFileSync(`${SHAKA_DIST_DIR}/${filename}`, fontContent)
cssContents = cssContents.replace(url, `./${filename}`)
}
ftruncateSync(cssFileHandle)
writeSync(cssFileHandle, cssContents, 0, 'utf-8')
console.log('Localised shaka-player fonts')
}
} finally {
if (typeof cssFileHandle !== 'undefined') {
closeSync(cssFileHandle)
}
}
}
fixTypes()
await fixRemoteFonts()

View File

@ -8,6 +8,11 @@ const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const ProcessLocalesPlugin = require('./ProcessLocalesPlugin')
const WatchExternalFilesPlugin = require('webpack-watch-external-files-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const {
SHAKA_LOCALE_MAPPINGS,
SHAKA_LOCALES_PREBUNDLED,
SHAKA_LOCALES_TO_BE_BUNDLED
} = require('./getShakaLocales')
const isDevMode = process.env.NODE_ENV === 'development'
@ -122,7 +127,9 @@ const config = {
'process.env.SUPPORTS_LOCAL_API': true,
'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames),
'process.env.GEOLOCATION_NAMES': JSON.stringify(readdirSync(path.join(__dirname, '..', 'static', 'geolocations')).map(filename => filename.replace('.json', ''))),
'process.env.SWIPER_VERSION': `'${swiperVersion}'`
'process.env.SWIPER_VERSION': `'${swiperVersion}'`,
'process.env.SHAKA_LOCALE_MAPPINGS': JSON.stringify(SHAKA_LOCALE_MAPPINGS),
'process.env.SHAKA_LOCALES_PREBUNDLED': JSON.stringify(SHAKA_LOCALES_PREBUNDLED)
}),
new HtmlWebpackPlugin({
excludeChunks: ['processTaskWorker'],
@ -143,7 +150,21 @@ const config = {
transformAll: (assets) => {
return Buffer.concat(assets.map(asset => asset.data))
}
}
},
// Don't need to copy them in dev mode,
// as we configure WebpackDevServer to serve them
...(isDevMode ? [] : [
{
from: path.join(__dirname, '../node_modules/shaka-player/ui/locales', `{${SHAKA_LOCALES_TO_BE_BUNDLED.join(',')}}.json`).replaceAll('\\', '/'),
to: path.join(__dirname, '../dist/static/shaka-player-locales'),
context: path.join(__dirname, '../node_modules/shaka-player/ui/locales'),
transform: {
transformer: (input) => {
return JSON.stringify(JSON.parse(input.toString('utf-8')))
}
}
}
])
]
})
],
@ -155,10 +176,8 @@ const config = {
'youtubei.js$': 'youtubei.js/web',
// video.js's mpd-parser uses @xmldom/xmldom so that it can support both node and web browsers
// as FreeTube only runs in electron and web browsers we can use the native DOMParser class, instead of the "polyfill"
// https://caniuse.com/mdn-api_domparser
'@xmldom/xmldom$': path.resolve(__dirname, '_domParser.js')
// change to "shaka-player.ui.debug.js" to get debug logs (update jsconfig to get updated types)
'shaka-player$': 'shaka-player/dist/shaka-player.ui.js',
},
extensions: ['.js', '.vue']
},
@ -175,6 +194,10 @@ if (isDevMode) {
],
}),
)
// hack to pass it through to the dev-runner.js script
// gets removed there before the config object is passed to webpack
config.SHAKA_LOCALES_TO_BE_BUNDLED = SHAKA_LOCALES_TO_BE_BUNDLED
}
module.exports = config

View File

@ -8,6 +8,11 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const JsonMinimizerPlugin = require('json-minimizer-webpack-plugin')
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
const ProcessLocalesPlugin = require('./ProcessLocalesPlugin')
const {
SHAKA_LOCALE_MAPPINGS,
SHAKA_LOCALES_PREBUNDLED,
SHAKA_LOCALES_TO_BE_BUNDLED
} = require('./getShakaLocales')
const isDevMode = process.env.NODE_ENV === 'development'
@ -116,19 +121,7 @@ const config = {
'process.env.IS_ELECTRON': false,
'process.env.IS_ELECTRON_MAIN': false,
'process.env.SUPPORTS_LOCAL_API': false,
'process.env.SWIPER_VERSION': `'${swiperVersion}'`,
// video.js' vhs-utils supports both atob() in web browsers and Buffer in node
// As the FreeTube web build only runs in web browsers, we can override their check for atob() here: https://github.com/videojs/vhs-utils/blob/main/src/decode-b64-to-uint8-array.js#L3
// overriding that check means we don't need to include a Buffer polyfill
// https://caniuse.com/atob-btoa
// NOTE FOR THE FUTURE: this override won't work with vite as their define does a find and replace in the code for production builds,
// but uses globals in development builds to save build time, so this would replace the actual atob() function with true if used with vite
// this works in webpack as webpack does a find and replace in the source code for both development and production builds
// https://vitejs.dev/config/shared-options.html#define
// https://webpack.js.org/plugins/define-plugin/
'window.atob': true
'process.env.SWIPER_VERSION': `'${swiperVersion}'`
}),
new webpack.ProvidePlugin({
process: 'process/browser'
@ -162,10 +155,8 @@ const config = {
'DB_HANDLERS_ELECTRON_RENDERER_OR_WEB$': path.resolve(__dirname, '../src/datastores/handlers/web.js'),
// video.js's mpd-parser uses @xmldom/xmldom so that it can support both node and web browsers
// As FreeTube only runs in electron and web browsers, we can use the native DOMParser class, instead of the "polyfill"
// https://caniuse.com/mdn-api_domparser
'@xmldom/xmldom$': path.resolve(__dirname, '_domParser.js')
// change to "shaka-player.ui.debug.js" to get debug logs (update jsconfig to get updated types)
'shaka-player$': 'shaka-player/dist/shaka-player.ui.js',
},
fallback: {
'fs/promises': path.resolve(__dirname, '_empty.js'),
@ -186,7 +177,9 @@ config.plugins.push(
processLocalesPlugin,
new webpack.DefinePlugin({
'process.env.LOCALE_NAMES': JSON.stringify(processLocalesPlugin.localeNames),
'process.env.GEOLOCATION_NAMES': JSON.stringify(fs.readdirSync(path.join(__dirname, '..', 'static', 'geolocations')).map(filename => filename.replace('.json', '')))
'process.env.GEOLOCATION_NAMES': JSON.stringify(fs.readdirSync(path.join(__dirname, '..', 'static', 'geolocations')).map(filename => filename.replace('.json', ''))),
'process.env.SHAKA_LOCALE_MAPPINGS': JSON.stringify(SHAKA_LOCALE_MAPPINGS),
'process.env.SHAKA_LOCALES_PREBUNDLED': JSON.stringify(SHAKA_LOCALES_PREBUNDLED)
}),
new CopyWebpackPlugin({
patterns: [
@ -201,7 +194,12 @@ config.plugins.push(
dot: true,
ignore: ['**/.*', '**/locales/**', '**/pwabuilder-sw.js', '**/dashFiles/**', '**/storyboards/**'],
},
},
},
{
from: path.join(__dirname, '../node_modules/shaka-player/ui/locales', `{${SHAKA_LOCALES_TO_BE_BUNDLED.join(',')}}.json`).replaceAll('\\', '/'),
to: path.join(__dirname, '../dist/web/static/shaka-player-locales'),
context: path.join(__dirname, '../node_modules/shaka-player/ui/locales')
}
]
})
)

View File

@ -9,6 +9,9 @@
"DB_HANDLERS_ELECTRON_RENDERER_OR_WEB": [
"src/datastores/handlers/electron",
"src/datastores/handlers/web"
],
"shaka-player": [
"./node_modules/shaka-player/dist/shaka-player.ui"
]
}
}

View File

@ -19,19 +19,20 @@
"url": "https://github.com/FreeTubeApp/FreeTube/issues"
},
"scripts": {
"build": "run-s rebuild:electron pack build-release",
"build:arm64": "run-s rebuild:electron pack build-release:arm64",
"build:arm32": "run-s rebuild:electron pack build-release:arm32",
"build": "run-s rebuild:electron patch-shaka pack build-release",
"build:arm64": "run-s rebuild:electron patch-shaka pack build-release:arm64",
"build:arm32": "run-s rebuild:electron patch-shaka pack build-release:arm32",
"build-release": "node _scripts/build.js",
"build-release:arm64": "node _scripts/build.js arm64",
"build-release:arm32": "node _scripts/build.js arm32",
"clean": "rimraf build/ dist/",
"debug": "run-s rebuild:electron debug-runner",
"debug": "run-s rebuild:electron patch-shaka debug-runner",
"debug-runner": "node _scripts/dev-runner.js --remote-debug",
"dev": "run-s rebuild:electron dev-runner",
"dev": "run-s rebuild:electron patch-shaka dev-runner",
"dev:web": "node _scripts/dev-runner.js --web",
"dev-runner": "node _scripts/dev-runner.js",
"get-instances": "node _scripts/getInstances.js",
"patch-shaka": "node _scripts/patchShaka.mjs",
"get-regions": "node _scripts/getRegions.mjs",
"lint-all": "run-p lint lint-json",
"lint": "run-p eslint-lint lint-style",
@ -46,7 +47,7 @@
"pack:main": "webpack --mode=production --node-env=production --config _scripts/webpack.main.config.js",
"pack:renderer": "webpack --mode=production --node-env=production --config _scripts/webpack.renderer.config.js",
"pack:web": "webpack --mode=production --node-env=production --config _scripts/webpack.web.config.js",
"postinstall": "yarn run --silent rebuild:electron",
"postinstall": "run-s --silent rebuild:electron patch-shaka",
"prettier": "prettier --write \"{src,_scripts}/**/*.{js,vue}\"",
"rebuild:electron": "electron-builder install-app-deps",
"release": "run-s test build",
@ -58,20 +59,14 @@
"@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/vue-fontawesome": "^2.0.10",
"@seald-io/nedb": "^4.0.4",
"@silvermine/videojs-quality-selector": "^1.3.1",
"autolinker": "^4.0.0",
"electron-context-menu": "^3.6.1",
"lodash.debounce": "^4.0.8",
"marked": "^12.0.1",
"path-browserify": "^1.0.1",
"process": "^0.11.10",
"shaka-player": "^4.7.13",
"swiper": "^11.1.1",
"video.js": "7.21.5",
"videojs-contrib-quality-levels": "^3.0.0",
"videojs-http-source-selector": "^1.1.6",
"videojs-mobile-ui": "^0.8.0",
"videojs-overlay": "^3.1.0",
"videojs-vtt-thumbnails-freetube": "0.0.15",
"vue": "^2.7.16",
"vue-i18n": "^8.28.2",
"vue-observe-visibility": "^1.0.0",

View File

@ -28,13 +28,6 @@ function runApp() {
showSelectAll: false,
showCopyLink: false,
prepend: (defaultActions, parameters, browserWindow) => [
{
label: 'Show / Hide Video Statistics',
visible: parameters.mediaType === 'video',
click: () => {
browserWindow.webContents.send('showVideoStatistics')
}
},
{
label: 'Open in a New Window',
// Only show the option for in-app URLs and not external ones
@ -302,7 +295,7 @@ function runApp() {
// InnerTube rejects requests if the referer isn't YouTube or empty
const innertubeAndMediaRequestFilter = { urls: ['https://www.youtube.com/youtubei/*', 'https://*.googlevideo.com/videoplayback?*'] }
session.defaultSession.webRequest.onBeforeSendHeaders(innertubeAndMediaRequestFilter, ({ requestHeaders, url, resourceType }, callback) => {
session.defaultSession.webRequest.onBeforeSendHeaders(innertubeAndMediaRequestFilter, ({ requestHeaders, url }, callback) => {
requestHeaders.Referer = 'https://www.youtube.com/'
requestHeaders.Origin = 'https://www.youtube.com'
@ -312,39 +305,6 @@ function runApp() {
// YouTube doesn't send the Content-Type header for the media requests, so we shouldn't either
delete requestHeaders['Content-Type']
}
// YouTube throttles the adaptive formats if you request a chunk larger than 10MiB.
// For the DASH formats we are fine as video.js doesn't seem to ever request chunks that big.
// The legacy formats don't have any chunk size limits.
// For the audio formats we need to handle it ourselves, as the browser requests the entire audio file,
// which means that for most videos that are longer than 10 mins, we get throttled, as the audio track file sizes surpass that 10MiB limit.
// This code checks if the file is larger than the limit, by checking the `clen` query param,
// which YouTube helpfully populates with the content length for us.
// If it does surpass that limit, it then checks if the requested range is larger than the limit
// (seeking right at the end of the video, would result in a small enough range to be under the chunk limit)
// if that surpasses the limit too, it then limits the requested range to 10MiB, by setting the range to `start-${start + 10MiB}`.
if (resourceType === 'media' && url.includes('&mime=audio') && requestHeaders.Range) {
const TEN_MIB = 10 * 1024 * 1024
const contentLength = parseInt(new URL(url).searchParams.get('clen'))
if (contentLength > TEN_MIB) {
const [startStr, endStr] = requestHeaders.Range.split('=')[1].split('-')
const start = parseInt(startStr)
// handle open ended ranges like `0-` and `1234-`
const end = endStr.length === 0 ? contentLength : parseInt(endStr)
if (end - start > TEN_MIB) {
const newEnd = start + TEN_MIB
requestHeaders.Range = `bytes=${start}-${newEnd}`
}
}
}
// eslint-disable-next-line n/no-callback-literal
callback({ requestHeaders })
})

View File

@ -91,5 +91,4 @@
<script src="./App.js" />
<style src="./themes.css" />
<style src="./videoJS.css" />
<style scoped src="./App.css" />

View File

@ -1,13 +0,0 @@
<svg
xmlns="http://www.w3.org/2000/svg"
width="26" height="26" viewBox="0 0 24 24"
stroke-width="1.5"
stroke="#ffffff"
fill="none"
stroke-linecap="round"
stroke-linejoin="round"
>
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M5 7h1a2 2 0 0 0 2 -2a1 1 0 0 1 1 -1h6a1 1 0 0 1 1 1a2 2 0 0 0 2 2h1a2 2 0 0 1 2 2v9a2 2 0 0 1 -2 2h-14a2 2 0 0 1 -2 -2v-9a2 2 0 0 1 2 -2" />
<circle cx="12" cy="13" r="3" />
</svg>

Before

Width:  |  Height:  |  Size: 443 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" viewBox="0 0 24 24" fill="white" width="20px" height="20px"><rect fill="none" height="24" width="24"/><path d="M22,3.41l-5.29,5.29L20,12h-8V4l3.29,3.29L20.59,2L22,3.41z M3.41,22l5.29-5.29L12,20v-8H4l3.29,3.29L2,20.59L3.41,22z"/></svg>

Before

Width:  |  Height:  |  Size: 309 B

View File

@ -1 +0,0 @@
<svg aria-hidden="true" focusable="false" fill="white" width="20px" height="19px" data-prefix="fas" data-icon="desktop" class="svg-inline--fa fa-desktop fa-w-18" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><path d="M528 0H48C21.5 0 0 21.5 0 48v320c0 26.5 21.5 48 48 48h192l-16 48h-72c-13.3 0-24 10.7-24 24s10.7 24 24 24h272c13.3 0 24-10.7 24-24s-10.7-24-24-24h-72l-16-48h192c26.5 0 48-21.5 48-48V48c0-26.5-21.5-48-48-48zm-16 352H64V64h448v288z"></path></svg>

Before

Width:  |  Height:  |  Size: 483 B

View File

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="white" width="20px" height="20px"><path class="loop" d="M12 4V2.21c0-.45-.54-.67-.85-.35l-2.8 2.79c-.2.2-.2.51 0 .71l2.79 2.79c.32.31.86.09.86-.36V6c3.31 0 6 2.69 6 6 0 .79-.15 1.56-.44 2.25-.15.36-.04.77.23 1.04.51.51 1.37.33 1.64-.34.37-.91.57-1.91.57-2.95 0-4.42-3.58-8-8-8zm0 14c-3.31 0-6-2.69-6-6 0-.79.15-1.56.44-2.25.15-.36.04-.77-.23-1.04-.51-.51-1.37-.33-1.64.34C4.2 9.96 4 10.96 4 12c0 4.42 3.58 8 8 8v1.79c0 .45.54.67.85.35l2.79-2.79c.2-.2.2-.51 0-.71l-2.79-2.79c-.31-.31-.85-.09-.85.36V18z"/></svg>

Before

Width:  |  Height:  |  Size: 577 B

View File

@ -1 +0,0 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" fill="white" width="18px" height="18px" data-icon="expand-alt" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M212.686 315.314L120 408l32.922 31.029c15.12 15.12 4.412 40.971-16.97 40.971h-112C10.697 480 0 469.255 0 456V344c0-21.382 25.803-32.09 40.922-16.971L72 360l92.686-92.686c6.248-6.248 16.379-6.248 22.627 0l25.373 25.373c6.249 6.248 6.249 16.378 0 22.627zm22.628-118.628L328 104l-32.922-31.029C279.958 57.851 290.666 32 312.048 32h112C437.303 32 448 42.745 448 56v112c0 21.382-25.803 32.09-40.922 16.971L376 152l-92.686 92.686c-6.248 6.248-16.379 6.248-22.627 0l-25.373-25.373c-6.249-6.248-6.249-16.378 0-22.627z"></path></svg>

Before

Width:  |  Height:  |  Size: 726 B

View File

@ -1 +0,0 @@
<svg aria-hidden="true" focusable="false" data-prefix="fas" fill="white" width="20px" height="19px" data-icon="tv" class="svg-inline--fa fa-tv fa-w-20" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M592 0H48A48 48 0 0 0 0 48v320a48 48 0 0 0 48 48h240v32H112a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h416a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16H352v-32h240a48 48 0 0 0 48-48V48a48 48 0 0 0-48-48zm-16 352H64V64h512z"></path></svg>

Before

Width:  |  Height:  |  Size: 458 B

View File

@ -0,0 +1,186 @@
/* stylelint-disable liberty/use-logical-spec */
.ftVideoPlayer {
display: flex;
position: relative;
/*
For vertical videos and full window mode the background is visible,
so we want to make it black as it defaults to transparent
*/
background-color: #000;
}
.player {
width: 100%;
}
:deep(.shaka-bottom-controls) {
/*
Force left to right, so that the UI doesn't break.
With rtl, the progress bar was filling from the left, but the scrubber was moving from the right.
video.js forced the direction for their controls too
*/
direction: ltr;
/* Place the seek bar above the controls (the default is below) */
display: flex;
flex-direction: column-reverse;
}
/*
With the legacy formats, shaka hands over the captions to the browser,
that causes issues like the captions being displayed under the player controls.
The browser positions captions based on the video element as it doesn't know about shaka's custom controls.
To solve that we use shaka's caption displayer (UITextDisplayer), so we need to hide the browser's ones
*/
.player::-webkit-media-text-track-container {
display: none;
}
.sixteenByNine {
aspect-ratio: 16 / 9;
}
.stats {
position: absolute;
left: 5px;
top: 5px;
padding: 10px;
border-radius: 5px;
line-height: 1.4em;
background-color: rgb(0 0 0 / 70%);
color: #fff;
z-index: 2;
/* user-select is intentionally not disabled, so that you can select and copy the stats */
}
:deep(.shaka-volume-bar-container) {
flex-shrink: initial;
}
.skippedSegmentsWrapper {
position: absolute;
right: 2%;
top: 20%;
z-index: 2;
display: flex;
flex-direction: column;
gap: 10px;
align-items: center;
pointer-events: none;
}
.skippedSegment {
margin-block: 0;
padding: 10px;
border-radius: 20px;
background-color: rgb(0 0 0 / 80%);
color: #fff;
}
:deep(.sponsorBlockMarkerContainer) {
position: absolute;
inset: 0;
margin: 0;
padding: 0;
width: 100%;
height: 100%;
}
:deep(.sponsorBlockMarker) {
position: absolute;
opacity: 0.6;
height: 100%;
background-color: var(--primary-color);
}
:deep(.playerFullscreenTitleOverlay) {
display: none;
opacity: 0;
position: absolute;
margin: 0;
top: 5px;
left: 5px;
font-size: xx-large;
color: #fff;
font-weight: normal;
background-color: rgb(0 0 0 / 50%);
border-radius: 5px;
user-select: none;
/* copied from .shaka-scrim-container */
transition: opacity cubic-bezier(.4, 0, .6, 1) .6s;
}
:global(body[dir='rtl'] .playerFullscreenTitleOverlay) {
left: initial;
right: 5px;
}
.ftVideoPlayer:fullscreen :deep(.playerFullscreenTitleOverlay) {
display: block;
}
:deep(.shaka-controls-container[shown="true"] > .playerFullscreenTitleOverlay) {
opacity: 1;
}
@media only screen and (width <= 400px) {
:deep(.shaka-text-container) {
/* make subtitles take up slightly less space when a mobile phone is in portrait orientation */
font-size: 16px !important;
}
}
@media only screen and (width <= 1000px) {
:deep(.playerFullscreenTitleOverlay) {
font-size: large;
}
}
:deep(.player-icon) {
font-size: 18px;
}
:deep(.shaka-overflow-menu .player-icon) {
padding-left: 10px;
padding-right: 10px;
}
:deep(.screenshot-button-icon) {
font-size: 20px;
}
.ftVideoPlayer:fullscreen :deep(.theatre-button),
.ftVideoPlayer:fullscreen :deep(.full-window-button),
.fullWindow :deep(.theatre-button) {
display: none;
}
@media only screen and (width <= 1350px) {
:deep(.theatre-button) {
display: none
}
}
.fullWindow {
position: absolute !important;
max-width: initial !important;
inset: 0;
z-index: 1000;
}
.fullWindow > .player {
width: 100%;
height: 100%;
}
/* added to the body element */
:global(.playerFullWindow) {
overflow: hidden;
margin: 0;
padding: 0;
}
/* stylelint-enable liberty/use-logical-spec */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,84 @@
<template>
<div
ref="container"
class="ftVideoPlayer"
:class="{
fullWindow: fullWindowEnabled,
sixteenByNine: forceAspectRatio
}"
>
<!-- eslint-disable-next-line vuejs-accessibility/media-has-caption -->
<video
ref="video"
class="player"
preload="auto"
crossorigin="anonymous"
playsinline
:autoplay="autoplayVideos ? true : null"
:poster="thumbnail"
@play="handlePlay"
@pause="handlePause"
@ended="handleEnded"
@volumechange="updateVolume"
@timeupdate="handleTimeupdate"
@ratechange="updateMediaSessionPositionState"
@seeked="updateMediaSessionPositionState"
/>
<div
v-if="showStats"
class="stats"
>
<span>{{ $t('Video.Player.Stats.Video ID', { videoId }) }}</span>
<br>
<span>{{ $t('Video.Player.Stats.Media Formats', { formats: format }) }}</span>
<br>
<template
v-if="typeof stats.bitrate !== 'undefined'"
>
<span>{{ $t('Video.Player.Stats.Bitrate', { bitrate: stats.bitrate }) }}</span>
<br>
</template>
<span>{{ $t('Video.Player.Stats.Volume', { volumePercentage: stats.volume }) }}</span>
<br>
<template
v-if="format !== 'legacy'"
>
<span>{{ $t('Video.Player.Stats.Bandwidth', { bandwidth: stats.bandwidth }) }}</span>
<br>
</template>
<span>{{ $t('Video.Player.Stats.Buffered', { bufferedPercentage: stats.buffered }) }}</span>
<br>
<span
v-if="format === 'audio'"
>{{ $t('Video.Player.Stats.CodecAudio', stats.codecs) }}</span>
<span
v-else
>{{ $t('Video.Player.Stats.CodecsVideoAudio', stats.codecs) }}</span>
<br>
<span>{{ $t('Video.Player.Stats.Player Dimensions', stats.playerDimensions) }}</span>
<br>
<template
v-if="format !== 'audio'"
>
<span>{{ $t('Video.Player.Stats.Resolution', stats.resolution) }}</span>
<br>
<span>{{ $t('Video.Player.Stats.Dropped Frames / Total Frames', stats.frames) }}</span>
</template>
</div>
<div
v-if="sponsorBlockShowSkippedToast && skippedSponsorBlockSegments.length > 0"
class="skippedSegmentsWrapper"
>
<p
v-for="{ uuid, translatedCategory } in skippedSponsorBlockSegments"
:key="uuid"
class="skippedSegment"
>
{{ $t('Video.Player.Skipped segment', { segmentCategory: translatedCategory }) }}
</p>
</div>
</div>
</template>
<script src="./ft-shaka-video-player.js" />
<style scoped src="./ft-shaka-video-player.css" />

View File

@ -0,0 +1,84 @@
import shaka from 'shaka-player'
import { icon as faIcon } from '@fortawesome/fontawesome-svg-core'
import i18n from '../../../i18n'
export class FullWindowButton extends shaka.ui.Element {
/**
* @param {boolean} fullWindowEnabled
* @param {EventTarget} events
* @param {HTMLElement} parent
* @param {shaka.ui.Controls} controls
*/
constructor(fullWindowEnabled, events, parent, controls) {
super(parent, controls)
/** @private */
this.button_ = document.createElement('button')
this.button_.classList.add('full-window-button')
this.button_.classList.add('shaka-tooltip')
/** @private */
this.enableIcon_ = faIcon({ prefix: 'fas', iconName: 'up-right-and-down-left-from-center' }).node[0]
this.enableIcon_.classList.add('player-icon')
/** @private */
this.disableIcon_ = faIcon({ prefix: 'fas', iconName: 'down-left-and-up-right-to-center' }).node[0]
this.disableIcon_.classList.add('player-icon')
this.button_.appendChild(this.enableIcon_)
const label = document.createElement('label')
label.classList.add('shaka-overflow-button-label')
label.classList.add('shaka-overflow-menu-only')
/** @private */
this.nameSpan_ = document.createElement('span')
label.appendChild(this.nameSpan_)
/** @private */
this.currentState_ = document.createElement('span')
this.currentState_.classList.add('shaka-current-selection-span')
label.appendChild(this.currentState_)
this.button_.appendChild(label)
this.parent.appendChild(this.button_)
/** @private */
this.fullWindowEnabled_ = fullWindowEnabled
// listeners
this.eventManager.listen(this.button_, 'click', () => {
events.dispatchEvent(new CustomEvent('setFullWindow', {
detail: {
enabled: !this.fullWindowEnabled_
}
}))
})
this.eventManager.listen(events, 'setFullWindow', (/** @type {CustomEvent} */ event) => {
this.fullWindowEnabled_ = event.detail.enabled
this.updateLocalisedStrings_()
})
this.eventManager.listen(events, 'localeChanged', () => {
this.updateLocalisedStrings_()
})
this.updateLocalisedStrings_()
}
/** @private */
updateLocalisedStrings_() {
this.nameSpan_.textContent = i18n.t('Video.Player.Full Window')
this.button_.firstChild.replaceWith(this.fullWindowEnabled_ ? this.disableIcon_ : this.enableIcon_)
this.currentState_.textContent = this.localization.resolve(this.fullWindowEnabled_ ? 'ON' : 'OFF')
this.button_.ariaLabel = this.fullWindowEnabled_ ? i18n.t('Video.Player.Exit Full Window') : i18n.t('Video.Player.Full Window')
}
}

View File

@ -0,0 +1,150 @@
import shaka from 'shaka-player'
import { qualityLabelToDimension } from '../../../helpers/player/utils'
export class LegacyQualitySelection extends shaka.ui.SettingsMenu {
/**
* @param {object} activeLegacyFormat
* @param {object[]} legacyFormats
* @param {EventTarget} events
* @param {!HTMLElement} parent
* @param {!shaka.ui.Controls} controls
*/
constructor(activeLegacyFormat, legacyFormats, events, parent, controls) {
super(parent, controls, 'settings')
this.button.classList.add('legacy-quality-button')
this.button.classList.add('shaka-tooltip-status')
this.menu.classList.add('legacy-qualities')
/** @private */
this.events_ = events
/** @private */
this.activeLegacyFormat_ = activeLegacyFormat
const sortedLegacyFormats = [...legacyFormats]
// Invidious doesn't return the height, width or bitrate for the legacy formats, so we have to parse the qualityLabel instead
// while it doesn't reflect the actual width or height of the format, it is still usuable for sorting
if (typeof legacyFormats[0].width === 'undefined' || typeof legacyFormats[0].height === 'undefined') {
sortedLegacyFormats.sort((a, b) => {
return qualityLabelToDimension(b.qualityLabel) - qualityLabelToDimension(a.qualityLabel)
})
} else {
const isPortrait = legacyFormats[0].height > legacyFormats[0].width
sortedLegacyFormats.sort((a, b) => isPortrait ? b.width - a.width : b.height - a.height)
}
/** @private */
this.legacyFormats_ = sortedLegacyFormats
for (const format of sortedLegacyFormats) {
const button = document.createElement('button')
button.classList.add('legacy-resolution')
this.eventManager.listen(button, 'click', () => {
this.onFormatSelected_(format)
})
const span = document.createElement('span')
span.textContent = format.qualityLabel
button.appendChild(span)
this.menu.appendChild(button)
}
// listeners
this.eventManager.listen(events, 'localeChanged', () => {
this.updateLocalisedStrings_()
})
this.eventManager.listen(events, 'setLegacyFormat', (/** @type {CustomEvent} */ event) => {
this.activeLegacyFormat_ = event.detail.format
this.updateResolutionSelection_()
})
this.updateResolutionSelection_()
}
/** @private */
updateResolutionSelection_() {
if (!this.activeLegacyFormat_) {
return
}
// remove previous selection
const previousSpan = this.menu.querySelector('.shaka-chosen-item')
if (previousSpan) {
previousSpan.classList.remove('shaka-chosen-item')
const button = previousSpan.parentElement
button.ariaSelected = 'false'
button.querySelector('.material-icons-round').remove()
}
// current selection
const index = this.legacyFormats_.indexOf(this.activeLegacyFormat_)
const button = this.menu.querySelectorAll('.legacy-resolution')[index]
const span = button.querySelector('span')
button.ariaSelected = 'true'
span.classList.add('shaka-chosen-item')
const icon = document.createElement('i')
icon.classList.add('material-icons-round')
icon.classList.add('shaka-chosen-item')
icon.textContent = 'done'
icon.ariaHidden = 'true'
button.appendChild(icon)
this.currentSelection.textContent = span.textContent
this.button.setAttribute('shaka-status', span.textContent)
button.focus()
this.updateLocalisedStrings_()
}
/** @private */
async onFormatSelected_(format) {
if (format === this.activeLegacyFormat_) {
return
}
const playbackPosition = this.player.getMediaElement().currentTime
const activeCaptionIndex = this.player.getTextTracks().findIndex(caption => caption.active)
let restoreCaptionIndex = null
if (activeCaptionIndex >= 0 && this.player.isTextTrackVisible()) {
restoreCaptionIndex = activeCaptionIndex
// hide captions before switching as shaka/the browser doesn't clean up the displayed captions
// when switching away from the legacy formats
await this.player.setTextTrackVisibility(false)
}
this.events_.dispatchEvent(new CustomEvent('setLegacyFormat', {
detail: {
format,
playbackPosition,
restoreCaptionIndex
}
}))
}
/** @private */
updateLocalisedStrings_() {
const resolutionText = this.localization.resolve('RESOLUTION')
this.button.ariaLabel = resolutionText
this.backButton.ariaLabel = resolutionText
this.backSpan.textContent = resolutionText
this.nameSpan.textContent = resolutionText
}
}

View File

@ -0,0 +1,57 @@
import shaka from 'shaka-player'
import { icon as faIcon } from '@fortawesome/fontawesome-svg-core'
import i18n from '../../../i18n'
export class ScreenshotButton extends shaka.ui.Element {
/**
* @param {EventTarget} events
* @param {HTMLElement} parent
* @param {shaka.ui.Controls} controls
*/
constructor(events, parent, controls) {
super(parent, controls)
/** @private */
this.button_ = document.createElement('button')
this.button_.classList.add('screenshot-button')
this.button_.classList.add('shaka-tooltip')
const icon = faIcon({ prefix: 'fas', iconName: 'camera' }).node[0]
icon.classList.add('player-icon')
icon.classList.add('screenshot-button-icon')
this.button_.appendChild(icon)
const label = document.createElement('label')
label.classList.add('shaka-overflow-button-label')
label.classList.add('shaka-overflow-menu-only')
/** @private */
this.nameSpan_ = document.createElement('span')
label.appendChild(this.nameSpan_)
this.button_.appendChild(label)
this.parent.appendChild(this.button_)
// listeners
this.eventManager.listen(this.button_, 'click', () => {
events.dispatchEvent(new CustomEvent('takeScreenshot'))
})
this.eventManager.listen(events, 'localeChanged', () => {
this.updateLocalisedStrings_()
})
this.updateLocalisedStrings_()
}
/** @private */
updateLocalisedStrings_() {
this.nameSpan_.textContent = i18n.t('Video.Player.Take Screenshot')
this.button_.ariaLabel = i18n.t('Video.Player.Take Screenshot')
}
}

View File

@ -0,0 +1,80 @@
import shaka from 'shaka-player'
import { icon as faIcon } from '@fortawesome/fontawesome-svg-core'
import i18n from '../../../i18n'
export class StatsButton extends shaka.ui.Element {
/**
* @param {boolean} showStats
* @param {EventTarget} events
* @param {HTMLElement} parent
* @param {shaka.ui.Controls} controls
*/
constructor(showStats, events, parent, controls) {
super(parent, controls)
/** @private */
this.button_ = document.createElement('button')
this.button_.classList.add('stats-button')
/** @private */
this.enableIcon_ = faIcon({ prefix: 'fas', iconName: 'list' }).node[0]
this.enableIcon_.classList.add('player-icon')
/** @private */
this.disableIcon_ = faIcon({ prefix: 'fas', iconName: 'rectangle-list' }).node[0]
this.disableIcon_.classList.add('player-icon')
this.button_.appendChild(this.enableIcon_)
const label = document.createElement('label')
label.classList.add('shaka-overflow-button-label')
/** @private */
this.nameSpan_ = document.createElement('span')
label.appendChild(this.nameSpan_)
/** @private */
this.currentState_ = document.createElement('span')
this.currentState_.classList.add('shaka-current-selection-span')
label.appendChild(this.currentState_)
this.button_.appendChild(label)
this.parent.appendChild(this.button_)
/** @private */
this.showStats_ = showStats
// listeners
this.eventManager.listen(this.button_, 'click', () => {
events.dispatchEvent(new CustomEvent('setStatsVisibility', {
detail: !this.showStats_
}))
})
this.eventManager.listen(events, 'setStatsVisibility', (/** @type {CustomEvent} */ event) => {
this.showStats_ = event.detail
this.updateLocalisedStrings_()
})
this.eventManager.listen(events, 'localeChanged', () => {
this.updateLocalisedStrings_()
})
this.updateLocalisedStrings_()
}
/** @private */
updateLocalisedStrings_() {
this.nameSpan_.textContent = i18n.t('Video.Player.Stats.Stats')
this.button_.firstChild.replaceWith(this.showStats_ ? this.disableIcon_ : this.enableIcon_)
this.currentState_.textContent = this.localization.resolve(this.showStats_ ? 'ON' : 'OFF')
this.button_.ariaLabel = this.showStats_ ? i18n.t('Video.Player.Hide Stats') : i18n.t('Video.Player.Show Stats')
}
}

View File

@ -0,0 +1,84 @@
import shaka from 'shaka-player'
import { icon as faIcon } from '@fortawesome/fontawesome-svg-core'
import i18n from '../../../i18n'
export class TheatreModeButton extends shaka.ui.Element {
/**
* @param {boolean} theatreModeEnabled
* @param {EventTarget} events
* @param {HTMLElement} parent
* @param {shaka.ui.Controls} controls
*/
constructor(theatreModeEnabled, events, parent, controls) {
super(parent, controls)
/** @private */
this.button_ = document.createElement('button')
this.button_.classList.add('theatre-button')
this.button_.classList.add('shaka-tooltip')
/** @private */
this.enableIcon_ = faIcon({ prefix: 'fas', iconName: 'tv' }).node[0]
this.enableIcon_.classList.add('player-icon')
/** @private */
this.disableIcon_ = faIcon({ prefix: 'fas', iconName: 'display' }).node[0]
this.disableIcon_.classList.add('player-icon')
this.button_.appendChild(this.enableIcon_)
const label = document.createElement('label')
label.classList.add('shaka-overflow-button-label')
label.classList.add('shaka-overflow-menu-only')
/** @private */
this.nameSpan_ = document.createElement('span')
label.appendChild(this.nameSpan_)
/** @private */
this.currentState_ = document.createElement('span')
this.currentState_.classList.add('shaka-current-selection-span')
label.appendChild(this.currentState_)
this.button_.appendChild(label)
this.parent.appendChild(this.button_)
/** @private */
this.theatreModeEnabled_ = theatreModeEnabled
// listeners
this.eventManager.listen(this.button_, 'click', () => {
events.dispatchEvent(new CustomEvent('toggleTheatreMode', {
detail: {
enabled: !this.theatreModeEnabled_
}
}))
})
this.eventManager.listen(events, 'toggleTheatreMode', (/** @type {CustomEvent} */event) => {
this.theatreModeEnabled_ = event.detail.enabled
this.updateLocalisedStrings_()
})
this.eventManager.listen(events, 'localeChanged', () => {
this.updateLocalisedStrings_()
})
this.updateLocalisedStrings_()
}
/** @private */
updateLocalisedStrings_() {
this.nameSpan_.textContent = i18n.t('Video.Player.Theatre Mode')
this.button_.firstChild.replaceWith(this.theatreModeEnabled_ ? this.disableIcon_ : this.enableIcon_)
this.currentState_.textContent = this.localization.resolve(this.theatreModeEnabled_ ? 'ON' : 'OFF')
this.button_.ariaLabel = this.theatreModeEnabled_ ? i18n.t('Video.Player.Exit Theatre Mode') : i18n.t('Video.Player.Theatre Mode')
}
}

View File

@ -1,37 +0,0 @@
/* stylelint-disable liberty/use-logical-spec */
.relative {
position: relative;
}
.ftVideoPlayer {
width: 100%;
}
.ftVideoPlayer.vjs-user-inactive {
cursor: none;
}
:deep(.sponsorBlockMarker), :deep(.chapterMarker) {
position: absolute;
opacity: 0.6;
}
:deep(.sponsorBlockMarker) {
block-size: 100%;
background-color: var(--primary-color);
}
:deep(.chapterMarker) {
height: 100%;
top: 0;
width: 2px;
z-index: 2;
background-color: #000;
}
/* stylelint-enable liberty/use-logical-spec */
@media only screen and (width <= 460px) {
:deep(.dash-selector .vjs-menu) {
max-block-size: 14em;
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,36 +0,0 @@
<!-- eslint-disable vuejs-accessibility/mouse-events-have-key-events -->
<!-- eslint-disable vuejs-accessibility/media-has-caption -->
<template>
<div
class="relative"
:class="{
'vjs-using-touch': usingTouch,
'vjs-hide-play-button': !displayVideoPlayButton
}"
@mouseover="handleMouseOver"
>
<video
ref="video"
class="ftVideoPlayer video-js vjs-default-skin dark"
:poster="thumbnail"
controls
preload="auto"
:data-setup="JSON.stringify(dataSetup)"
crossorigin="anonymous"
@touchstart="handleTouchStart"
>
<source
v-for="(source, index) in activeSourceList"
:key="index + '_source'"
:src="source.url"
:type="source.type || source.mimeType"
:label="source.qualityLabel"
:selected="source.qualityLabel === selectedDefaultQuality"
>
</video>
</div>
</template>
<script src="./ft-video-player.js" />
<style scoped src="./ft-video-player.css" />

View File

@ -39,7 +39,9 @@ export default defineComponent({
360,
480,
720,
1080
1080,
1440,
2160
],
playbackRateIntervalValues: [
0.1,
@ -113,10 +115,6 @@ export default defineComponent({
return this.$store.getters.getDefaultQuality
},
allowDashAv1Formats: function () {
return this.$store.getters.getAllowDashAv1Formats
},
defaultTheatreMode: function () {
return this.$store.getters.getDefaultTheatreMode
},
@ -169,7 +167,9 @@ export default defineComponent({
this.$t('Settings.Player Settings.Default Quality.360p'),
this.$t('Settings.Player Settings.Default Quality.480p'),
this.$t('Settings.Player Settings.Default Quality.720p'),
this.$t('Settings.Player Settings.Default Quality.1080p')
this.$t('Settings.Player Settings.Default Quality.1080p'),
this.$t('Settings.Player Settings.Default Quality.1440p'),
this.$t('Settings.Player Settings.Default Quality.4k')
]
},
@ -293,7 +293,6 @@ export default defineComponent({
'updateDefaultPlayback',
'updateDefaultVideoFormat',
'updateDefaultQuality',
'updateAllowDashAv1Formats',
'updateVideoVolumeMouseScroll',
'updateVideoPlaybackRateMouseScroll',
'updateVideoSkipMouseScroll',

View File

@ -1,7 +1,3 @@
.av1Switch {
align-self: center;
}
.screenshotFolderContainer {
align-items: center;
column-gap: 1rem;

View File

@ -158,14 +158,6 @@
:select-values="qualityValues"
@change="updateDefaultQuality"
/>
<ft-toggle-switch
class="av1Switch"
:label="$t('Settings.Player Settings.Allow DASH AV1 formats')"
:compact="true"
:default-value="allowDashAv1Formats"
:tooltip="$t('Tooltips.Player Settings.Allow DASH AV1 formats')"
@change="updateAllowDashAv1Formats"
/>
</ft-flex-box>
<br>
<ft-flex-box

View File

@ -295,40 +295,19 @@ function parseInvidiousCommunityAttachments(data) {
}
/**
* video.js only supports MP4 DASH not WebM DASH
* so we filter out the WebM DASH formats
* Invidious doesn't include the correct height or width for all formats in their API response and are also missing the fps and qualityLabel for the AV1 formats.
* When the local API is supported we generate our own manifest with the local API manifest generator, based on the Invidious API response and the height, width and fps extracted from Invidious' DASH manifest.
* As Invidious only includes h264 and AV1 in their DASH manifest, we have to always filter out the VP9 formats, due to missing information.
* @param {any[]} formats
* @param {boolean} allowAv1 Use the AV1 formats if they are available
*/
export function filterInvidiousFormats(formats, allowAv1 = false) {
const audioFormats = []
const h264Formats = []
const av1Formats = []
formats.forEach(format => {
export function filterInvidiousFormats(formats) {
return formats.filter(format => {
const mimeType = format.type
if (mimeType.startsWith('audio/mp4')) {
audioFormats.push(format)
} else if (allowAv1 && mimeType.startsWith('video/mp4; codecs="av01')) {
av1Formats.push(format)
} else if (mimeType.startsWith('video/mp4; codecs="avc')) {
h264Formats.push(format)
}
return mimeType.startsWith('audio/') ||
mimeType.startsWith('video/mp4; codecs="avc') ||
mimeType.startsWith('video/mp4; codecs="av01')
})
// Disabled AV1 as a workaround to https://github.com/FreeTubeApp/FreeTube/issues/3382
// Which is caused by Invidious API limitation on AV1 formats (see related issues)
// Commented code to be restored after Invidious issue fixed
//
// As we generate our own DASH manifest (using YouTube.js) for multiple audio track support when the local API is supported,
// we can allow AV1 in that situation. When the local API isn't supported,
// we still can't use them until Invidious fixes the issue on their side
if (process.env.SUPPORTS_LOCAL_API && allowAv1 && av1Formats.length > 0) {
return [...audioFormats, ...av1Formats]
}
return [...audioFormats, ...h264Formats]
}
export async function getHashtagInvidious(hashtag, page) {
@ -412,9 +391,22 @@ export function convertInvidiousToLocalFormat(format) {
})
})
// Adding freeTubeUrl allows us to reuse the code,
// to generate the audio tracks for audio only mode, that we use for the local API
localFormat.freeTubeUrl = format.url
return localFormat
}
export function mapInvidiousLegacyFormat(format) {
return {
itag: format.itag,
qualityLabel: format.qualityLabel,
fps: format.fps,
bitrate: undefined, // Invidious doesn't provide it for legacy formats :(
mimeType: format.type,
// Invidious' size parameter can't be trusted as it is hardcoded based on itag,
// this is especially problematic for shorts, where it returns landscape dimenions,
// even though the video is portrait
height: undefined,
width: undefined,
url: format.url
}
}

View File

@ -1053,7 +1053,7 @@ export function parseLocalTextRuns(runs, emojiSize = 16, options = { looseChanne
/**
* @param {LocalFormat} format
*/
export function mapLocalFormat(format) {
export function mapLocalLegacyFormat(format) {
return {
itag: format.itag,
qualityLabel: format.quality_label,

View File

@ -0,0 +1,292 @@
import shaka from 'shaka-player'
const ShakaCue = shaka.text.Cue
/**
* Creates a shaka Cue from a browser native VTTCue
* including parsing the karake style text, styling information and unescaping the text.
*
* Please note this is designed specifically to parse YouTube's VTT files
* and makes some assumptions that won't be applicable to other VTT files.
* E.g. that the class names always refer to colours, as the actual CSS that the class name points to,
* isn't accessible through the VTTCues. It's the only way (as far as I can tell) to support coloured text,
* without parsing the VTT file to extract the style section.
*
* The only tag this currently doesn't parse, is the voice (`<v>`) one, as I wasn't able to find a video with them.
* @param {VTTCue} vttCue
*/
export function shakaCueFromVTTCue(vttCue) {
// https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#cue_payload_text_tags
// https://w3c.github.io/webvtt
// strip the voice tags as we don't support them yet
/** @type {string} */
const text = vttCue.text.replaceAll(/<(?:v(?:[\t .][^>]+)?|\/v)>/g, '')
// if the text doesn't contain any tags, we can bypass all the parsing and directly return a Cue
if (!text.includes('<')) {
const shakaCue = new ShakaCue(vttCue.startTime, vttCue.endTime, replaceCueTextEscapeSequences(text))
copyFromVttCueToShakaCue(vttCue, shakaCue)
return shakaCue
}
const nestedCues = []
const TIME_TAG_REGEX = /(?:(?<hours>\d{2,}):)?(?<minutes>\d{2}):(?<seconds>\d{2}\.\d{3})/
let currentStartTime = vttCue.startTime
let currentText = ''
/** @type {string|null} */
let currentColor = null
let bold = false
let italic = false
let underline = false
let ruby = false
let rubyRt = false
let inTag = false
let tagText = ''
const createCueWithCurrentConfig = () => {
/** @type {'rt'|'ruby'|null} */
let rubyTag = null
if (rubyRt) {
rubyTag = 'rt'
} else if (ruby) {
rubyTag = 'ruby'
}
const cue = createFormattedShakaCue(currentStartTime, vttCue.endTime, currentText, bold, italic, underline, currentColor, rubyTag)
currentText = ''
return cue
}
for (let i = 0; i < text.length; i++) {
const character = text.charAt(i)
if (inTag) {
if (character === '>') {
if (currentText.length > 0) {
nestedCues.push(createCueWithCurrentConfig())
}
switch (tagText) {
case 'b':
bold = true
break
case '/b':
bold = false
break
case 'i':
italic = true
break
case '/i':
italic = false
break
case 'u':
underline = true
break
case '/u':
underline = false
break
case 'ruby':
ruby = true
break
case '/ruby':
ruby = false
break
case 'rt':
rubyRt = true
break
case '/rt':
rubyRt = false
break
case '/c':
currentColor = null
break
default:
if (tagText.charAt(0) === 'c') {
// examples
// <c></c>
// <c.yellow></c>
// <c.colorA0AAB4></c>
currentColor = tagText.substring(2)
} else {
const match = tagText.match(TIME_TAG_REGEX)
if (match) {
let startSeconds = parseFloat(match.groups.seconds)
startSeconds += parseInt(match.groups.minutes) * 60
if (match.groups.hours) {
startSeconds += parseInt(match.groups.hours) * 60 * 60
}
currentStartTime = startSeconds
}
}
break
}
inTag = false
tagText = ''
} else {
tagText += character
}
} else if (character === '<') {
inTag = true
if (currentText.length > 0) {
nestedCues.push(createCueWithCurrentConfig())
}
// create cue with current settings
} else if (character === '\n') {
const cue = createCueWithCurrentConfig()
const lineBreakCue = new ShakaCue(currentStartTime, vttCue.endTime, '')
lineBreakCue.lineBreak = true
nestedCues.push(cue, lineBreakCue)
} else {
currentText += character
}
}
if (currentText.length > 0) {
nestedCues.push(createCueWithCurrentConfig())
}
const shakaCue = new ShakaCue(vttCue.startTime, vttCue.endTime, '')
copyFromVttCueToShakaCue(vttCue, shakaCue)
shakaCue.nestedCues = nestedCues
return shakaCue
}
/**
* @param {number} startTime
* @param {number} endTime
* @param {string} text
* @param {boolean} bold
* @param {boolean} italic
* @param {boolean} underline
* @param {string|null} color
* @param {'ruby'|'rt'|null} rubyTag
*/
function createFormattedShakaCue(startTime, endTime, text, bold, italic, underline, color, rubyTag) {
const cue = new ShakaCue(startTime, endTime, replaceCueTextEscapeSequences(text))
if (bold) {
cue.fontWeight = ShakaCue.fontWeight.BOLD
}
if (italic) {
cue.fontStyle = ShakaCue.fontStyle.ITALIC
}
if (underline) {
cue.textDecoration = [ShakaCue.textDecoration.UNDERLINE]
}
if (color !== null && color.length > 0) {
// even though we can't directly access the style section in the vtt file
// YouTube uses predictable class names for their colour classes:
// either the name of a colour e.g. "c.yellow" or the hex values e.g. "c.colorEEEEEE"
// (I checked the style section in one of their VTT files to verify that)
if (color.startsWith('color')) {
cue.color = color.replace('color', '#')
} else {
cue.color = color
}
}
if (rubyTag !== null) {
cue.rubyTag = rubyTag
}
return cue
}
/**
* @param {VTTCue} vttCue
* @param {shaka.text.Cue} shakaCue
*/
function copyFromVttCueToShakaCue(vttCue, shakaCue) {
shakaCue.lineAlign = vttCue.lineAlign ?? ShakaCue.lineAlign.START
shakaCue.positionAlign = vttCue.positionAlign ?? ShakaCue.positionAlign.AUTO
shakaCue.size = vttCue.size
shakaCue.textAlign = vttCue.align
switch (vttCue.vertical) {
case '':
shakaCue.writingMode = ShakaCue.writingMode.HORIZONTAL_TOP_TO_BOTTOM
break
case 'lr':
shakaCue.writingMode = ShakaCue.writingMode.VERTICAL_LEFT_TO_RIGHT
break
case 'rl':
shakaCue.writingMode = ShakaCue.writingMode.VERTICAL_RIGHT_TO_LEFT
break
}
shakaCue.lineInterpretation = vttCue.snapToLines ? ShakaCue.lineInterpretation.LINE_NUMBER : ShakaCue.lineInterpretation.PERCENTAGE
shakaCue.line = vttCue.line === 'auto' ? null : vttCue.line
shakaCue.position = vttCue.position === 'auto' ? null : vttCue.position
// only available in Firefox at the moment, but we might as well copy it, when it's there
if (vttCue.region) {
const shakaRegion = shakaCue.region
shakaRegion.id = vttCue.region.id
shakaRegion.viewportAnchorX = vttCue.region.viewportAnchorX
shakaRegion.viewportAnchorY = vttCue.region.viewportAnchorY
shakaRegion.regionAnchorX = vttCue.region.regionAnchorX
shakaRegion.regionAnchorY = vttCue.region.regionAnchorY
shakaRegion.width = vttCue.region.width
shakaRegion.height = vttCue.region.lines
shakaRegion.heightUnits = shaka.text.CueRegion.units.LINES
shakaRegion.scroll = vttCue.region.scroll
}
}
/**
* @param {string} text
* @returns {string}
*/
function replaceCueTextEscapeSequences(text) {
return text.replaceAll(/&(amp|lt|gt|lrm|rlm|nbsp);/g, escapeSequenceReplacer)
}
/**
* @param {string} _match
* @param {string} sequence
* @returns {string}
*/
function escapeSequenceReplacer(_match, sequence) {
switch (sequence) {
case 'amp':
return '&'
case 'lt':
return '<'
case 'gt':
return '>'
case 'lrm':
return '\u200E'
case 'rlm':
return '\u200F'
case 'nbsp':
return '\u00A0'
}
}

View File

@ -0,0 +1,190 @@
import shaka from 'shaka-player'
import { deepCopy } from '../utils'
import i18n from '../../i18n/index'
import { sponsorBlockSkipSegments } from '../sponsorblock'
/** @typedef {import('../sponsorblock').SponsorBlockCategory} SponsorBlockCategory */
/**
* @param {shaka.util.Error} error
* @param {string} context
* @param {object} details
*/
export function logShakaError(error, context, details) {
const { Severity, Category, Code } = shaka.util.Error
// shaka's error type also has a message property but that is apparently only available in uncompiled mode
/** @type {keyof Severity} */
const severityText = Object.keys(Severity).find((/** @type {keyof Severity} */ key) => Severity[key] === error.severity)
/** @type {keyof Category} */
const categoryText = Object.keys(Category).find((/** @type {keyof Category} */ key) => Category[key] === error.category)
/** @type {keyof Code} */
const codeText = Object.keys(Code).find((/** @type {keyof Code} */ key) => Code[key] === error.code)
const message =
'Player Error (category and code explainations here: https://shaka-player-demo.appspot.com/docs/api/shaka.util.Error.html)\n' +
`FreeTube player context: "${context}"\n\n` +
`Severity: ${severityText} (${error.severity})\n` +
`Category: ${categoryText} (${error.category})\n` +
`Code: ${codeText} (${error.code})\n` +
`Stack trace:\n${error.stack}`
/** @type {*[]} */
const args = [message]
if (error.data && error.data.length > 0) {
args.push(
'\n\nshaka-player Data:',
error.data
)
}
if (details) {
args.push(
'\n\nFreeTube data:',
// use deepCopy to get rid of Vue's proxying,
// as that requires you click the 3 dots for every property in the logged object to see their values
// doing it like this, results in a "clean" object where everything is immediately visible
typeof details === 'object' ? deepCopy(details) : details
)
}
console.error(...args)
}
/**
* @param {string} videoId
* @param {SponsorBlockCategory[]} categories
*/
export async function getSponsorBlockSegments(videoId, categories) {
const segments = await sponsorBlockSkipSegments(videoId, categories)
if (segments.length === 0) {
return {
segments: [],
averageDuration: 0
}
}
const averageDuration = segments.reduce((accumulator, segment) => {
return accumulator + segment.videoDuration
}, 0) / segments.length
const mappedSegments = segments.map(({ category, segment: [startTime, endTime], UUID }) => {
return {
uuid: UUID,
category,
startTime,
endTime
}
})
mappedSegments.forEach(Object.freeze)
mappedSegments.sort((a, b) => a.startTime - b.startTime)
return {
segments: mappedSegments,
averageDuration
}
}
/**
* @param {SponsorBlockCategory} category
*/
export function translateSponsorBlockCategory(category) {
switch (category) {
case 'sponsor':
return i18n.t('Video.Sponsor Block category.sponsor')
case 'intro':
return i18n.t('Video.Sponsor Block category.intro')
case 'outro':
return i18n.t('Video.Sponsor Block category.outro')
case 'recap':
return this.$t('Video.Sponsor Block category.recap')
case 'selfpromo':
return i18n.t('Video.Sponsor Block category.self-promotion')
case 'interaction':
return i18n.t('Video.Sponsor Block category.interaction')
case 'music_offtopic':
return i18n.t('Video.Sponsor Block category.music offtopic')
case 'filler':
return i18n.t('Video.Sponsor Block category.filler')
default:
console.error(`Unknown translation for SponsorBlock category ${category}`)
return category
}
}
/**
* @param {string} qualityLabel
* @returns {number}
*/
export function qualityLabelToDimension(qualityLabel) {
return parseInt(qualityLabel.split('p')[0])
}
/**
* Moves the captions that are the most similar to the display language to the top
* and sorts the remaining ones alphabetically.
* @param {{
* url: string,
* label: string,
* language: string,
* mimeType: string,
* isAutotranslated?: boolean
* }[]} captions
*/
export function sortCaptions(captions) {
const currentLocale = i18n.locale.replace('_', '-')
const userLocale = currentLocale.split('-') // ex. [en,US]
return captions.sort((captionA, captionB) => {
const aCode = captionA.language.split('-') // ex. [en,US] or [en]
const bCode = captionB.language.split('-')
const aName = captionA.label // ex: english (auto-generated)
const bName = captionB.label
const aIsAutotranslated = !!captionA.isAutotranslated
const bIsAutotranslated = !!captionB.isAutotranslated
if (aCode[0] === userLocale[0]) { // caption a has same language as user's locale
if (bCode[0] === userLocale[0]) { // caption b has same language as user's locale
if (bName.includes('auto')) {
// prefer caption a: b is auto-generated captions
return -1
} else if (aName.includes('auto')) {
// prefer caption b: a is auto-generated captions
return 1
} else if (bIsAutotranslated) {
// prefer caption a: b is auto-translated captions
return -1
} else if (aIsAutotranslated) {
// prefer caption b: a is auto-translated captions
return 1
} else if (aCode[1] === userLocale[1]) {
// prefer caption a: caption a has same county code as user's locale
return -1
} else if (bCode[1] === userLocale[1]) {
// prefer caption b: caption b has same county code as user's locale
return 1
} else if (aCode[1] === undefined) {
// prefer caption a: no country code is better than wrong country code
return -1
} else if (bCode[1] === undefined) {
// prefer caption b: no country code is better than wrong country code
return 1
}
} else {
// prefer caption a: b does not match user's language
return -1
}
} else if (bCode[0] === userLocale[0]) {
// prefer caption b: a does not match user's language
return 1
}
// sort alphabetically
return aName.localeCompare(bName, currentLocale)
})
}

View File

@ -10,6 +10,27 @@ async function getVideoHash(videoId) {
hashArray[1].toString(16).padStart(2, '0')
}
/**
* @typedef {'sponsor' | 'selfpromo' | 'interaction' | 'intro' | 'outro' | 'preview' | 'music_offtopic' | 'filler'} SponsorBlockCategory
*/
/**
* @param {string} videoId
* @param {SponsorBlockCategory[]} categories
* @returns {Promise<{
* UUID: string,
* actionType: string,
* category: SponsorBlockCategory,
* description: string,
* locked: 1|0,
* segment: [
* number,
* number
* ],
* videoDuration: number,
* votes: number
* }[]>}
*/
export async function sponsorBlockSkipSegments(videoId, categories) {
const videoIdHashPrefix = await getVideoHash(videoId)
const requestUrl = `${store.getters.getSponsorBlockUrl}/api/skipSegments/${videoIdHashPrefix}?categories=${JSON.stringify(categories)}`

View File

@ -219,41 +219,6 @@ export function buildVTTFileLocally(storyboard, videoLengthSeconds) {
return vttString
}
export async function getFormatsFromHLSManifest(manifestUrl) {
const response = await fetch(manifestUrl)
const text = await response.text()
const lines = text.split('\n').filter(line => line)
const formats = []
let currentHeight = 0
let currentFPS = 0
for (const line of lines) {
if (line.startsWith('#')) {
if (!line.startsWith('#EXT-X-STREAM-INF:')) {
continue
}
const parts = line.split(',')
const height = parts.find(part => part.startsWith('RESOLUTION'))
.split('x')[1]
const fps = parts.find(part => part.startsWith('FRAME-RATE'))
.split('=')[1]
currentHeight = parseInt(height)
currentFPS = parseInt(fps)
} else {
formats.push({
height: currentHeight,
fps: currentFPS,
url: line.trim()
})
}
}
return formats
}
export function showToast(message, time = null, action = null) {
FtToastEvents.dispatchEvent(new CustomEvent('toast-open', {
detail: {

View File

@ -19,6 +19,7 @@ import {
faArrowUp,
faBars,
faBookmark,
faCamera,
faCheck,
faChevronRight,
faCircleUser,
@ -26,6 +27,8 @@ import {
faComment,
faCommentDots,
faCopy,
faDisplay,
faDownLeftAndUpRightToCenter,
faDownload,
faEdit,
faEllipsisH,
@ -55,6 +58,7 @@ import {
faPlus,
faQuestionCircle,
faRandom,
faRectangleList,
faRetweet,
faRss,
faSatelliteDish,
@ -72,6 +76,8 @@ import {
faTimes,
faTimesCircle,
faTrash,
faTv,
faUpRightAndDownLeftFromCenter,
faUsers,
} from '@fortawesome/free-solid-svg-icons'
import {
@ -98,6 +104,7 @@ library.add(
faArrowUp,
faBars,
faBookmark,
faCamera,
faCheck,
faChevronRight,
faCircleUser,
@ -105,6 +112,8 @@ library.add(
faComment,
faCommentDots,
faCopy,
faDisplay,
faDownLeftAndUpRightToCenter,
faDownload,
faEdit,
faEllipsisH,
@ -134,6 +143,7 @@ library.add(
faPlus,
faQuestionCircle,
faRandom,
faRectangleList,
faRetweet,
faRss,
faSatelliteDish,
@ -151,6 +161,8 @@ library.add(
faTimes,
faTimesCircle,
faTrash,
faTv,
faUpRightAndDownLeftFromCenter,
faUsers,
// brand icons

View File

@ -10,6 +10,7 @@ import profiles from './profiles'
import settings from './settings'
import subscriptions from './subscriptions'
import utils from './utils'
import player from './player'
export default {
history,
@ -18,5 +19,6 @@ export default {
profiles,
settings,
subscriptions,
utils
utils,
player
}

View File

@ -0,0 +1,39 @@
import { set as vueSet } from 'vue'
import { createWebURL } from '../../helpers/utils'
// replace with a Map after the Vue 3 and Pinia migrations
const state = {
cachedPlayerLocales: {}
}
const getters = {
getCachedPlayerLocales(state) {
return state.cachedPlayerLocales
}
}
const actions = {
async cachePlayerLocale({ commit }, locale) {
const url = createWebURL(`/static/shaka-player-locales/${locale}.json`)
const response = await fetch(url)
const data = await response.json()
Object.freeze(data)
commit('addPlayerLocaleToCache', { locale, data })
}
}
const mutations = {
addPlayerLocaleToCache(state, { locale, data }) {
vueSet(state.cachedPlayerLocales, locale, data)
}
}
export default {
state,
getters,
actions,
mutations
}

View File

@ -298,7 +298,6 @@ const state = {
screenshotFilenamePattern: '%Y%M%D-%H%N%S',
fetchSubscriptionsAutomatically: true,
settingsPassword: '',
allowDashAv1Formats: false,
useDeArrowTitles: false,
useDeArrowThumbnails: false,
deArrowThumbnailGeneratorUrl: 'https://dearrow-thumb.ajay.app',

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@
max-inline-size: calc(80vh * 1.78);
position: relative;
.upcomingThumbnail {
.videoThumbnail {
inline-size: 100%;
}
@ -82,6 +82,46 @@
}
}
}
.errorContainer {
position: absolute;
inset: 30px;
display: grid;
place-content: center;
}
.errorWrapper {
display: flex;
flex-direction: row;
align-items: center;
gap: 20px;
padding: 10px;
border-radius: 20px;
background-color: rgb(0 0 0 / 90%);
color: #fff;
}
.errorIcon {
font-size: 80px;
}
.errorMessage {
margin: 0;
}
@media only screen and (width <= 680px) {
.errorContainer {
inset: 10px;
}
.errorWrapper {
gap: 10px;
}
.errorIcon {
font-size: 60px;
}
}
}
}

View File

@ -16,42 +16,40 @@
class="videoArea"
>
<div class="videoAreaMargin">
<ft-video-player
v-if="!isLoading && !hidePlayer && !isUpcoming"
ref="videoPlayer"
:dash-src="dashSrc"
:source-list="activeSourceList"
:audio-tracks="audioTracks"
:adaptive-formats="adaptiveFormats"
:caption-hybrid-list="captionHybridList"
<ft-shaka-video-player
v-if="!isLoading && !isUpcoming && !errorMessage"
ref="player"
:manifest-src="manifestSrc"
:manifest-mime-type="manifestMimeType"
:legacy-formats="legacyFormats"
:start-time="startTimeSeconds"
:captions="captions"
:storyboard-src="videoStoryboardSrc"
:format="activeFormat"
:thumbnail="thumbnail"
:video-id="videoId"
:length-seconds="videoLengthSeconds"
:chapters="videoChapters"
:current-chapter-index="videoCurrentChapterIndex"
:title="videoTitle"
:theatre-possible="theatrePossible"
:use-theatre-mode="useTheatreMode"
class="videoPlayer"
:class="{ theatrePlayer: useTheatreMode }"
@ready="handleVideoReady"
@ended="handleVideoEnded"
@error="handleVideoError"
@store-caption-list="captionHybridList = $event"
@error="handlePlayerError"
@loaded="handleVideoLoaded"
@timeupdate="!hideChapters && videoChapters.length > 0 ? updateCurrentChapter : null"
@toggle-theatre-mode="useTheatreMode = !useTheatreMode"
v-on="!hideChapters && videoChapters.length > 0 ? { timeupdate: updateCurrentChapter } : {}"
/>
<div
v-if="!isLoading && isUpcoming"
v-if="!isLoading && (isUpcoming || errorMessage)"
class="videoPlayer"
>
<img
:src="thumbnail"
class="upcomingThumbnail"
class="videoThumbnail"
alt=""
>
<div
v-if="isUpcoming"
class="premiereDate"
>
<font-awesome-icon
@ -81,6 +79,25 @@
{{ $t("Video.Starting soon, please refresh the page to check again") }}
</p>
</div>
<div
v-else-if="errorMessage"
class="errorContainer"
>
<div
class="errorWrapper"
>
<font-awesome-icon
:icon="customErrorIcon || ['fas', 'exclamation-circle']"
aria-hidden="true"
class="errorIcon"
/>
<p
class="errorMessage"
>
{{ errorMessage }}
</p>
</div>
</div>
</div>
</div>
</div>
@ -149,7 +166,7 @@
:class="{ theatreWatchVideo: useTheatreMode }"
:channel-thumbnail="channelThumbnail"
:channel-name="channelName"
:video-player-ready="videoPlayerReady"
:video-player-ready="videoPlayerLoaded"
:force-state="commentsEnabled ? null : 'noComment'"
@timestamp-event="changeTimestamp"
/>

View File

@ -382,7 +382,6 @@ Settings:
أرقام. %i معرف الفيديو. يمكنك أيضا استخدام "\" أو "/" لإنشاء مجلدات فرعية.
Enter Fullscreen on Display Rotate: وضع ملء الشاشة عند تدوير الشاشة
Skip by Scrolling Over Video Player: تخطي بالتمرير فوق مشغل الفيديو
Allow DASH AV1 formats: السماح بتنسيقات DASH AV1
Privacy Settings:
Privacy Settings: 'إعدادات الخصوصية'
Remember History: 'تذّكر سجلّ المشاهدة'
@ -859,11 +858,6 @@ Video:
Loop Playlist: تكرار قائمة التشغيل
Starting soon, please refresh the page to check again: سيبدأ قريباً ، يرجى تحديث
الصفحة للتحقق مرة أخرى
Audio:
Best: الأفضل
High: عال
Medium: متوسط
Low: منخفض
audio only: الصوت فقط
video only: الفيديو فقط
Download Video: تحميل الفيديو
@ -876,7 +870,6 @@ Video:
Video has been saved: تم حفظ الفيديو
Save Video: احفظ الفيديو
Video has been removed from your saved list: تمت إزالة الفيديو من قائمتك المحفوظة
translated from English: مترجمة من الإنجليزية
Sponsor Block category:
music offtopic: موسيقى خارجة عن المألوف
interaction: تفاعل
@ -886,7 +879,6 @@ Video:
sponsor: الرعاة
filler: حشو
recap: الخلاصة
Skipped segment: تم تخطي المقطع
External Player:
Unsupported Actions:
looping playlists: تكرار قوائم التشغيل
@ -903,26 +895,6 @@ Video:
video: فيديو
OpenInTemplate: فتح في {externalPlayer}
Premieres on: العرض الأول بتاريخ
Stats:
video id: معرف الفيديو (يوتيوب)
player resolution: المعاينه
fps: معدل الإطارات
frame drop: إسقاط الإطار
buffered: مخزنة
out of: خارج عن
bandwidth: سرعة الاتصال
volume: الصوت
Video statistics are not available for legacy videos: إحصائيات الفيديو غير متوفرة
لمقاطع الفيديو القديمة
Video ID: معرف الفيديو
Resolution: الدقة
Bitrate: معدل البت
Player Dimensions: عدد اللاعبين
Volume: الصوت
Bandwidth: عرض النطاق الترددي
Buffered: مخزنة
Dropped / Total Frames: إسقاط / إجمالي الإطارات
Mimetype: نمط ميمي
Premieres in: العرض الأول في
Premieres: العرض الأولي
Scroll to Bottom: انتقل إلى الأسفل
@ -1073,9 +1045,6 @@ Tooltips:
على Mac) ثم انقر فوق الماوس للعودة بسرعة إلى معدل التشغيل الافتراضي (1x ما لم
يتم تغييره في الإعدادات).
Skip by Scrolling Over Video Player: استخدم عجلة التمرير لتخطي الفيديو بنمط MPV.
Allow DASH AV1 formats: قد تبدو تنسيقات DASH AV1 أفضل من تنسيقات DASH H.264. تتطلب
تنسيقات DASH AV1 مزيدا من الطاقة للتشغيل! وهي غير متوفرة في جميع مقاطع الفيديو
، وفي هذه الحالات سيستخدم المشغل تنسيقات DASH H.264 بدلا من ذلك.
Subscription Settings:
Fetch Feeds from RSS: عند تفعيلها، سوف يستخدم فريتيوب طريقة RSS بدلًا من طريقته
المعتادة لجلب صفحة اشتراكاتك. طريقة RSS أسرع وتتخطى حجب الآي بي IP، لكنها لا

View File

@ -277,7 +277,6 @@ Settings:
1440p: ''
4k: ''
8k: ''
Allow DASH AV1 formats: ''
Screenshot:
Enable: ''
Format Label: ''
@ -613,11 +612,6 @@ Video:
Download Video: ''
video only: ''
audio only: ''
Audio:
Low: ''
Medium: ''
High: ''
Best: ''
Published:
Jan: ''
Feb: ''
@ -651,9 +645,7 @@ Video:
Published on: ''
Streamed on: ''
Started streaming on: ''
translated from English: ''
Publicationtemplate: ''
Skipped segment: ''
Sponsor Block category:
sponsor: ''
intro: ''
@ -677,17 +669,6 @@ Video:
reversing playlists: ''
shuffling playlists: ''
looping playlists: ''
Stats:
Video statistics are not available for legacy videos: ''
Video ID: ''
Resolution: ''
Player Dimensions: ''
Bitrate: ''
Volume: ''
Bandwidth: ''
Buffered: ''
Dropped / Total Frames: ''
Mimetype: ''
#& Videos
Videos:
#& Sort By
@ -783,7 +764,6 @@ Tooltips:
Force Local Backend for Legacy Formats: ''
Proxy Videos Through Invidious: ''
Default Video Format: ''
Allow DASH AV1 formats: ''
Scroll Playback Rate Over Video Player: ''
Skip by Scrolling Over Video Player: ''
External Player Settings:

View File

@ -395,7 +395,6 @@ Settings:
Folder Button: Избор на папка
Enter Fullscreen on Display Rotate: Режим на цял екран при завъртане на дисплея
Skip by Scrolling Over Video Player: Превъртане над видео плейъра
Allow DASH AV1 formats: Разрешаване на форматите DASH AV1
Privacy Settings:
Privacy Settings: 'Настройки за поверителност'
Remember History: 'Запазване на историята'
@ -876,11 +875,6 @@ Video:
Published on: 'Публикувано на'
Publicationtemplate: 'Преди {number} {unit}'
#& Videos
Audio:
Best: Най-добро
High: Високо
Medium: Средно
Low: Ниско
audio only: само аудио
video only: само видео
Download Video: Сваляне на видео
@ -894,7 +888,6 @@ Video:
със запазени
Video has been saved: Видеото е запазено
Save Video: Запазване на видео
translated from English: преведено от английски
Sponsor Block category:
interaction: Взаимодействие
self-promotion: Самореклама
@ -904,7 +897,6 @@ Video:
music offtopic: Музика извън темата
recap: Резюме
filler: Запълване
Skipped segment: Пропуснат сегмент
External Player:
Unsupported Actions:
looping playlists: повтаряне на плейлисти
@ -920,26 +912,6 @@ Video:
playlist: плейлист
video: видео
OpenInTemplate: Отваряне във {externalPlayer}
Stats:
fps: Кадри в секунда
video id: Идентификатор на видеоклип (YouTube)
player resolution: Изглед
volume: Сила на звука
frame drop: Пропускане на кадър
bandwidth: Скорост на свързване
buffered: Буферирани
out of: от
Resolution: Резолюция
Video ID: Идентификатор на видеото
Player Dimensions: Размери на плейъра
Bitrate: Побитова скорост
Bandwidth: Пропускателна способност
Volume: Сила на звука
Dropped / Total Frames: Отпаднали / Общо кадри
Mimetype: MIME тип
Buffered: Буферирани
Video statistics are not available for legacy videos: Статистиката не е налична
за наследени видеа
Premieres on: Премиера на
Premieres in: Премиери в
Premieres: Премиерa
@ -1076,10 +1048,6 @@ Tooltips:
(1x, освен ако не е променена в настройките).
Skip by Scrolling Over Video Player: Използване колелцето на мишката за превъртане
на видео в стил MPV.
Allow DASH AV1 formats: Форматите DASH AV1 може да изглеждат по-добре от DASH
H.264. DASH AV1 форматите изискват повече енергия за възпроизвеждане! Те не
са налични за всички видеа, като в тези случаи плейърът ще използва DASH H.264
вместо тях.
General Settings:
Region for Trending: Регионът на набиращите популярност дава възможност да се
избере страната, за която това се отнася.

View File

@ -536,11 +536,6 @@ Video:
Published on: 'Publicat el'
Publicationtemplate: '{number} {unit} fa'
#& Videos
Audio:
High: Alta
Best: Millor
Low: Baixa
Medium: Mitjana
Started streaming on: Retransmissió iniciada el
Sponsor Block category:
interaction: interacció
@ -549,7 +544,6 @@ Video:
intro: introducció
outro: conclusió
self-promotion: autopromoció
Skipped segment: Segment saltat
External Player:
Unsupported Actions:
starting video at offset: començant el vídeo al punt donat
@ -574,7 +568,6 @@ Video:
Download Video: Descàrrega El Vídeo
video only: només vídeo
Streamed on: Retransmès en directe el
translated from English: traduït de l'anglès
Videos:
#& Sort By
Sort By:

View File

@ -281,7 +281,6 @@ Settings:
1440p: '١٤٤٠p'
4k: '٤k'
8k: '٨k'
Allow DASH AV1 formats: ''
Screenshot:
Enable: ''
Format Label: ''
@ -627,11 +626,6 @@ Video:
Download Video: 'داگرتنی ڤیدیۆ'
video only: 'تەنیا ڤیدیۆ'
audio only: 'تەنیا دەنگ'
Audio:
Low: 'نزم'
Medium: 'مامناوەند'
High: 'بەرز'
Best: 'باشترین'
Published:
Jan: ''
Feb: ''
@ -665,9 +659,7 @@ Video:
Published on: 'بڵاوکرایەوە لە'
Streamed on: ''
Started streaming on: ''
translated from English: ''
Publicationtemplate: ''
Skipped segment: ''
Sponsor Block category:
sponsor: ''
intro: ''
@ -691,17 +683,6 @@ Video:
reversing playlists: ''
shuffling playlists: ''
looping playlists: ''
Stats:
Video statistics are not available for legacy videos: ''
Video ID: ''
Resolution: ''
Player Dimensions: ''
Bitrate: ''
Volume: ''
Bandwidth: ''
Buffered: ''
Dropped / Total Frames: ''
Mimetype: ''
#& Videos
Unhide Channel: پیشاندانی کەناڵ
Hide Channel: شاردنەوەی کەناڵ
@ -799,7 +780,6 @@ Tooltips:
Force Local Backend for Legacy Formats: ''
Proxy Videos Through Invidious: ''
Default Video Format: ''
Allow DASH AV1 formats: ''
Scroll Playback Rate Over Video Player: ''
Skip by Scrolling Over Video Player: ''
External Player Settings:

View File

@ -395,7 +395,6 @@ Settings:
Folder Button: Vybrat složku
Enter Fullscreen on Display Rotate: Při otočení displeje přejít na celou obrazovku
Skip by Scrolling Over Video Player: Posouvat čas posuvem kolečka myši na přehrávači
Allow DASH AV1 formats: Povolit formáty DASH AV1
Privacy Settings:
Privacy Settings: 'Nastavení soukromí'
Remember History: 'Zapamatovat historii'
@ -834,11 +833,6 @@ Video:
Download Video: 'Stáhnout Video'
video only: 'pouze video'
audio only: 'pouze zvuk'
Audio:
Low: 'Nízká'
Medium: 'Střední'
High: 'Vysoká'
Best: 'Nejlepší'
Published:
Jan: 'Leden'
Feb: 'Únor'
@ -879,7 +873,6 @@ Video:
Save Video: Uložit video
Video has been removed from your saved list: Video bylo odstraněno z vašeho uloženého
seznamu
translated from English: přeloženo z angličtiny
Sponsor Block category:
music offtopic: Není hudba
interaction: Interakce
@ -889,7 +882,6 @@ Video:
sponsor: Sponzor
recap: Shrnutí
filler: Výplň
Skipped segment: Přeskočen segment
External Player:
Unsupported Actions:
opening specific video in a playlist (falling back to opening the video): Otevření
@ -906,18 +898,6 @@ Video:
video: video
OpenInTemplate: Otevřít v {externalPlayer}
Premieres on: Premiéra
Stats:
Mimetype: Typ int. média
Video statistics are not available for legacy videos: Statistiky videí nejsou
k dispozici pro starší videa
Video ID: ID videa
Resolution: Rozlišení
Player Dimensions: Rozměry přehrávače
Bitrate: Bitrate
Volume: Hlasitost
Bandwidth: Bandwidth
Buffered: V mezipaměti
Dropped / Total Frames: Vyřazené / Celkový počet snímků
Premieres in: Premiéra za
Premieres: Premiéra
Show Super Chat Comment: Zobrazit komentář Super Chat
@ -1054,9 +1034,6 @@ Tooltips:
není změněná v nastavení).
Skip by Scrolling Over Video Player: Pomocí rolovacího kolečka můžete video přeskakovat
ve stylu MPV.
Allow DASH AV1 formats: Formáty DASH AV1 mohou vypadat lépe než formáty DASH H.264,
vyžadují ale k přehrávání větší výkon! Nejsou k dispozici u všech videí, v těchto
případech přehrávač místo nich použije formáty DASH H.264.
Subscription Settings:
Fetch Feeds from RSS: 'Je-li povoleno, FreeTube použije RSS místo své výchozí
metody pro získání vašich odběrů. RSS je rychlejší a brání blokování IP, ale

View File

@ -284,7 +284,6 @@ Settings:
1440p: '1440p'
4k: '4k'
8k: '8k'
Allow DASH AV1 formats: ''
Screenshot:
Enable: 'Galluogi Sgrinlun'
Format Label: 'Fformat Sgrinluniau'
@ -631,11 +630,6 @@ Video:
Download Video: 'Lawrlwytho Fideo'
video only: 'fideo yn unig'
audio only: 'sain yn unig'
Audio:
Low: 'Isel'
Medium: 'Canolig'
High: 'Uwch'
Best: 'Gorau'
Published:
Jan: 'Ion'
Feb: 'Chw'
@ -669,9 +663,7 @@ Video:
Published on: ''
Streamed on: ''
Started streaming on: ''
translated from English: ''
Publicationtemplate: ''
Skipped segment: ''
Sponsor Block category:
sponsor: 'Noddwr'
intro: 'Cyflwyniad'
@ -695,17 +687,6 @@ Video:
reversing playlists: ''
shuffling playlists: ''
looping playlists: ''
Stats:
Video statistics are not available for legacy videos: ''
Video ID: 'ID fideo'
Resolution: 'Eglurdeb'
Player Dimensions: ''
Bitrate: 'Cyfradd didau'
Volume: 'Sain'
Bandwidth: 'Lled band'
Buffered: ''
Dropped / Total Frames: ''
Mimetype: 'Math mime'
#& Videos
Videos:
#& Sort By
@ -801,7 +782,6 @@ Tooltips:
Force Local Backend for Legacy Formats: ''
Proxy Videos Through Invidious: ''
Default Video Format: ''
Allow DASH AV1 formats: ''
Scroll Playback Rate Over Video Player: ''
Skip by Scrolling Over Video Player: ''
External Player Settings:

View File

@ -363,7 +363,6 @@ Settings:
Scroll Playback Rate Over Video Player: Scroll Afspilningshastighed i Videoafspiller
Scroll Volume Over Video Player: Scroll Lydstyrke i Videoafspiller
Skip by Scrolling Over Video Player: Spring Over ved at Scrolle Over Videoafspilleren
Allow DASH AV1 formats: Tillad DASH AV1-formater
Privacy Settings:
Privacy Settings: 'Privatlivsindstillinger'
Remember History: 'Husk Historik'
@ -803,28 +802,10 @@ Video:
Save Video: Gem Video
Started streaming on: Begyndte at sende
Streamed on: Sendt
Audio:
Best: Bedst
High: Høj
Medium: Middel
Low: Lav
audio only: kun lyd
video only: kun video
Download Video: Hent Video
Premieres on: Har premiere på
Stats:
Resolution: Skærmopløsning
Player Dimensions: Afspillerdimensioner
Bitrate: Bitrate
Volume: Lydstyrke
Bandwidth: Båndbredde
Buffered: Bufferet
Dropped / Total Frames: Tabte / Antal Billeder
Mimetype: Mimetype
Video statistics are not available for legacy videos: Videostatistikker er ikke
tilgængelige for gamle videoer
Video ID: Video ID
translated from English: oversat fra engelsk
Sponsor Block category:
intro: Intro
sponsor: Sponsor
@ -849,7 +830,6 @@ Video:
video: video
playlist: playliste
UnsupportedActionTemplate: '{externalPlayer} understøtter ikke: {action}'
Skipped segment: Sprunget over segment
Hide Channel: Skjul Kanal
Unhide Channel: Vis Kanal
'Live Chat is unavailable for this stream. It may have been disabled by the uploader.': Live

View File

@ -398,7 +398,6 @@ Settings:
Unterordner zu erstellen.
Enter Fullscreen on Display Rotate: Beim Drehen des Bildschirms zu Vollbild wechseln
Skip by Scrolling Over Video Player: Überspringen durch Scrollen über den Videoabspieler
Allow DASH AV1 formats: DASH AV1-Formate zulassen
Subscription Settings:
Subscription Settings: Abo-Einstellungen
Hide Videos on Watch: Videos bei Wiedergabe ausblenden
@ -854,11 +853,6 @@ Video:
Loop Playlist: Wiedergabeliste wiederholen
Starting soon, please refresh the page to check again: Es beginnt bald, bitte aktualisiere
die Seite, um es erneut zu überprüfen
Audio:
Best: Am besten
High: Hoch
Medium: Mittel
Low: Niedrig
audio only: nur Audio
video only: nur Video
Download Video: Video herunterladen
@ -872,7 +866,6 @@ Video:
Videos entfernt
Video has been saved: Video wurde gespeichert
Save Video: Video speichern
translated from English: aus dem Englischen übersetzt
Sponsor Block category:
music offtopic: Musik Offtopic
interaction: Interaktion
@ -882,7 +875,6 @@ Video:
sponsor: Sponsor
recap: Rekapitulation
filler: Füller
Skipped segment: Segment übersprungen
External Player:
OpenInTemplate: In {externalPlayer} öffnen
Unsupported Actions:
@ -899,26 +891,6 @@ Video:
playlist: Wiedergabeliste
video: Video
Premieres on: Premiere am
Stats:
volume: Lautstärke
fps: BpS
frame drop: Bildverlust
bandwidth: Verbindungsgeschwindigkeit
out of: aus
player resolution: Ansichtsfenster
video id: Video-ID (YouTube)
buffered: Gepuffert
Video ID: Video-ID
Resolution: Auflösung
Player Dimensions: Abspieler-Größe
Bitrate: Bitrate
Volume: Lautstärke
Bandwidth: Bandbreite
Buffered: Gepuffert
Dropped / Total Frames: Entfallene / gesamte Einzelbilder
Mimetype: MIME-Typ
Video statistics are not available for legacy videos: Videostatistiken sind für
ältere Videos nicht verfügbar
Premieres in: Premieren in
Premieres: Premiere
Show Super Chat Comment: Super-Chat-Kommentar anzeigen
@ -1132,10 +1104,6 @@ Tooltips:
(1x, sofern sie nicht in den Einstellungen geändert wurde).
Skip by Scrolling Over Video Player: Verwende das Scrollrad, um durch das Video
zu springen, MPV-Stil.
Allow DASH AV1 formats: DASH AV1-Formate können besser aussehen als DASH H.264-Formate.
Die DASH AV1-Formate benötigen mehr Leistung für die Wiedergabe! Sie sind nicht
bei allen Videos verfügbar. In diesen Fällen verwendet der Abspieler stattdessen
die DASH H.264-Formate.
External Player Settings:
Custom External Player Arguments: Alle benutzerdefinierten Befehlszeilenargumente,
getrennt durch Semikolon (';'), die an den externen Abspieler übergeben werden

View File

@ -303,7 +303,6 @@ Settings:
Βίντεο
Enter Fullscreen on Display Rotate: Μετάβαση στην Πλήρη Οθόνη κατά την Περιστροφή
Οθόνης
Allow DASH AV1 formats: Να επιτρέπονται οι μορφές DASH AV1
Privacy Settings:
Privacy Settings: 'Ρυθμίσεις απορρήτου'
Remember History: 'Διατήρηση ιστορικού'
@ -778,11 +777,6 @@ Video:
Published on: 'Δημοσιεύθηκε στις'
Publicationtemplate: 'δημοσιεύθηκε πριν από {number} {unit}'
#& Videos
Audio:
Best: Καλύτερο
High: Υψηλή
Medium: Μεσαία
Low: Χαμηλή
Starting soon, please refresh the page to check again: Έναρξη σύντομα, παρακαλούμε
κάντε ανανέωση της σελίδας για επανέλεγχο
audio only: μόνο ήχος
@ -798,7 +792,6 @@ Video:
λίστα σας
Video has been saved: Το βίντεο έχει αποθηκευτεί
Save Video: Αποθήκευση βίντεο
translated from English: μεταφράστηκε από τα Αγγλικά
Sponsor Block category:
intro: Εισαγωγή
interaction: Αλληλεπίδραση
@ -825,26 +818,6 @@ Video:
OpeningTemplate: Άνοιγμα {videoOrPlaylist} σε {externalPlayer}...
UnsupportedActionTemplate: 'Το {externalPlayer} δεν υποστηρίζει: {action}'
Premieres on: Πρεμιέρες στις
Stats:
video id: Αναγνωριστικό του βίντεο (YouTube)
player resolution: Θύρα προβολής
volume: Ένταση ήχου
fps: FPS
out of: από
frame drop: Πτώση καρέ
bandwidth: Ταχύτητα σύνδεσης
Mimetype: Τύπος αρχείου
Video statistics are not available for legacy videos: Τα στατιστικά βίντεο δεν
είναι διαθέσιμα για βίντεο παλαιού τύπου
Video ID: Αναγνωριστικό βίντεο
Resolution: Ανάλυση
Player Dimensions: Διαστάσεις αναπαραγωγής βίντεο
Bitrate: Ρυθμός μεταβίβασης δεδομένων
Volume: Ένταση
Bandwidth: Εύρος ζώνης
Buffered: Φορτωμένο
Dropped / Total Frames: Πτωμένα / Συνολικά Καρέ
Skipped segment: Τμήμα που παραλείφθηκε
Show Super Chat Comment: Εμφάνιση Σχολίου Super Chat
Scroll to Bottom: Κύλιση προς τα Κάτω
Premieres: Πρεμιέρες
@ -994,10 +967,6 @@ Tooltips:
ρυθμό αναπαραγωγής (1x εκτός αν έχει αλλάξει στις ρυθμίσεις).
Skip by Scrolling Over Video Player: Χρησιμοποιήστε τον τροχό κύλισης για να παρακάμψετε
το βίντεο, στυλ MPV.
Allow DASH AV1 formats: Οι μορφές DASH AV1 μπορεί να φαίνονται καλύτερες από τις
μορφές DASH H.264. Οι μορφές DASH AV1 απαιτούν περισσότερη ισχύ για την αναπαραγωγή!
Δεν είναι διαθέσιμα σε όλα τα βίντεο, σε αυτές τις περιπτώσεις το πρόγραμμα
αναπαραγωγής θα χρησιμοποιήσει τις μορφές DASH H.264.
General Settings:
Region for Trending: Η περιοχή των τάσεων σας επιτρέπει να επιλέξετε τα δημοφιλή
βίντεο της χώρας που θέλετε να εμφανίζονται.

View File

@ -384,7 +384,6 @@ Settings:
1440p: 1440p
4k: 4k
8k: 8k
Allow DASH AV1 formats: Allow DASH AV1 formats
Screenshot:
Enable: Enable Screenshot
Format Label: Screenshot Format
@ -782,11 +781,6 @@ Video:
Download Video: Download Video
video only: video only
audio only: audio only
Audio:
Low: Low
Medium: Medium
High: High
Best: Best
Published:
Jan: Jan
Feb: Feb
@ -820,9 +814,7 @@ Video:
Published on: Published on
Streamed on: Streamed on
Started streaming on: Started streaming on
translated from English: translated from English
Publicationtemplate: '{number} {unit} ago'
Skipped segment: Skipped segment
Sponsor Block category:
sponsor: Sponsor
intro: Intro
@ -846,17 +838,29 @@ Video:
reversing playlists: reversing playlists
shuffling playlists: shuffling playlists
looping playlists: looping playlists
Stats:
Video statistics are not available for legacy videos: Video statistics are not available for legacy videos
Video ID: Video ID
Resolution: Resolution
Player Dimensions: Player Dimensions
Bitrate: Bitrate
Volume: Volume
Bandwidth: Bandwidth
Buffered: Buffered
Dropped / Total Frames: Dropped / Total Frames
Mimetype: Mimetype
Player:
TranslatedCaptionTemplate: '{language} (translated from "{originalLanguage}")'
Theatre Mode: Theatre Mode
Exit Theatre Mode: Exit Theatre Mode
Full Window: Full Window
Exit Full Window: Exit Full Window
Take Screenshot: Take Screenshot
Show Stats: Show Stats
Hide Stats: Hide Stats
Stats:
Stats: Stats
Video ID: 'Video ID: {videoId}'
Media Formats: 'Media Formats: {formats}'
Resolution: 'Resolution: {width}x{height}@{frameRate}'
Player Dimensions: 'Player Dimensions: {width}x{height}'
Bitrate: 'Bitrate: {bitrate} kbps'
Volume: 'Volume: {volumePercentage}%'
Bandwidth: 'Bandwidth: {bandwidth} kbps'
Buffered: 'Buffered: {bufferedPercentage}%'
Dropped Frames / Total Frames: 'Dropped Frames: {droppedFrames} / Total Frames: {totalFrames}'
CodecAudio: 'Codec: {audioCodec} ({audioItag})'
CodecsVideoAudio: 'Codecs: {videoCodec} ({videoItag}) / {audioCodec} ({audioItag})'
Skipped segment: 'Skipped {segmentCategory} segment'
#& Videos
Videos:
#& Sort By
@ -896,6 +900,8 @@ Change Format:
this video
Audio formats are not available for this video: Audio formats are not available
for this video
Legacy formats are not available for this video: Legacy formats are not available
for this video
Share:
Share Video: Share Video
Share Channel: Share Channel
@ -979,9 +985,6 @@ Tooltips:
Default Video Format: Set the formats used when a video plays. DASH formats can
play higher qualities. Legacy formats are limited to a max of 720p but use less
bandwidth. Audio formats are audio only streams.
Allow DASH AV1 formats: DASH AV1 formats may look better than DASH H.264 formats.
DASH AV1 formats require more power to playback! They are not available on all videos,
in those cases the player will use the DASH H.264 formats instead.
Scroll Playback Rate Over Video Player: While the cursor is over the video, press and
hold the Control key (Command Key on Mac) and scroll the mouse wheel forwards or backwards to control
the playback rate. Press and hold the Control key (Command Key on Mac) and left click the mouse

View File

@ -387,7 +387,6 @@ Settings:
Ask Path: Ask for Save Folder
File Name Label: Filename pattern
Skip by Scrolling Over Video Player: Skip by scrolling over video player
Allow DASH AV1 formats: Allow DASH AV1 formats
External Player Settings:
External Player Settings: External Player Settings
External Player: External Player
@ -850,11 +849,6 @@ Video:
#& Videos
Started streaming on: Started streaming on
Streamed on: Streamed on
Audio:
Best: Best
High: High
Medium: Medium
Low: Low
audio only: audio only
video only: video only
Download Video: Download Video
@ -866,7 +860,6 @@ Video:
list
Video has been saved: Video has been saved
Save Video: Save Video
translated from English: translated from English
Sponsor Block category:
music offtopic: Music offtopic
interaction: Interaction
@ -876,7 +869,6 @@ Video:
sponsor: Sponsor
recap: Recap
filler: Filler
Skipped segment: Skipped segment
External Player:
OpenInTemplate: Open in {externalPlayer}
video: video
@ -893,26 +885,6 @@ Video:
shuffling playlists: shuffling playlists
looping playlists: looping playlists
Premieres on: Premieres on
Stats:
video id: Video ID (YouTube)
player resolution: Viewport
volume: Volume
frame drop: Frame Drop
buffered: Buffered
fps: FPS
bandwidth: Connection Speed
out of: out of
Player Dimensions: Player dimensions
Bitrate: Bitrate
Volume: Volume
Bandwidth: Bandwidth
Buffered: Buffered
Dropped / Total Frames: Dropped / Total frames
Mimetype: Media type
Resolution: Resolution
Video statistics are not available for legacy videos: Video statistics are not
available for legacy videos
Video ID: Video ID
Premieres in: Premieres in
Premieres: Premieres
Show Super Chat Comment: Show Super Chat comment
@ -924,6 +896,29 @@ Video:
Hide Channel: Hide channel
Unhide Channel: Show channel
More Options: More options
Player:
TranslatedCaptionTemplate: '{language} (translated from {originalLanguage})'
Theatre Mode: Theatre Mode
Exit Theatre Mode: Exit Theatre Mode
Full Window: Full Window
Exit Full Window: Exit Full Window
Take Screenshot: Take Screenshot
Show Stats: Show Stats
Hide Stats: Hide Stats
Stats:
Stats: Stats
Video ID: 'Video ID: {videoId}'
Media Formats: 'Media formats: {formats}'
Resolution: 'Resolution: {width}x{height}@{frameRate}'
Player Dimensions: 'Player dimensions: {width}x{height}'
Bitrate: 'Bitrate: {bitrate} kbps'
Volume: 'Volume: {volumePercentage}%'
Bandwidth: 'Bandwidth: {bandwidth} kbps'
Buffered: 'Buffered: {bufferedPercentage}%'
Dropped Frames / Total Frames: 'Dropped frames: {droppedFrames} / Total frames: {totalFrames}'
CodecAudio: 'Codec: {audioCodec} ({audioItag})'
CodecsVideoAudio: 'Codecs: {videoCodec} ({videoItag}) / {audioCodec} ({audioItag})'
Skipped segment: 'Skipped {segmentCategory} segment'
Videos:
#& Sort By
Sort By:
@ -1046,9 +1041,6 @@ Tooltips:
rate (1x unless it has been changed in the settings).
Skip by Scrolling Over Video Player: Use the scroll wheel to skip through the
video, MPV style.
Allow DASH AV1 formats: DASH AV1 formats may look better than DASH H.264 formats.
DASH AV1 formats require more power to playback! They are not available on all
videos, in those cases the player will use the DASH H.264 formats instead.
General Settings:
Region for Trending: The region of trends allows you to pick which countrys trending
videos you want to have displayed.

View File

@ -540,29 +540,11 @@ Video:
Reverse Playlist: Lista de reproducción invertida
Shuffle Playlist: Lista de reproducción aleatoria
Loop Playlist: Lista de reproducción en bucle
translated from English: traducido del inglés
Stats:
Mimetype: Tipo de medio
Resolution: Resolución
Player Dimensions: Tamaño del reproductor
Bitrate: Tasa de bits
Volume: Volumen
Bandwidth: Ancho de banda
Video statistics are not available for legacy videos: Estadísticas no disponibles
para videos heredados
Video ID: ID del video
Buffered: Amplificado
Dropped / Total Frames: Caídos / Fotogramas totales
Video has been removed from your saved list: El video se ha eliminado de su lista
de guardado
Video has been saved: Video guardado
Starting soon, please refresh the page to check again: Empezará pronto, por favor
actualice la página para volver a revisar
Audio:
Best: Máxima
Low: Baja
Medium: Media
High: Alta
External Player:
Unsupported Actions:
reversing playlists: revirtiendo listas
@ -595,7 +577,6 @@ Video:
Copy Invidious Channel Link: Copiar link del canal en Invidious
Copy YouTube Channel Link: Copiar link del canal en YouTube
Premieres on: En estreno
Skipped segment: Omitida esta parte
Download Video: Descargar video
Videos:
#& Sort By

View File

@ -397,7 +397,6 @@ Settings:
Enter Fullscreen on Display Rotate: Entrar en pantalla completa al girar la pantalla
Skip by Scrolling Over Video Player: Omitir al desplazarse sobre el reproductor
de vídeo
Allow DASH AV1 formats: Permitir formatos DASH AV1
Privacy Settings:
Privacy Settings: 'Ajustes de Privacidad'
Remember History: 'Recordar historial'
@ -880,11 +879,6 @@ Video:
Loop Playlist: Reproducción en bucle
Starting soon, please refresh the page to check again: Comenzará en breve. Por favor,
recarga la página para comprobarlo
Audio:
Best: Máxima
High: Alta
Medium: Media
Low: Baja
audio only: audio únicamente
video only: vídeo únicamente
Download Video: Descargar vídeo
@ -898,7 +892,6 @@ Video:
de guardados
Video has been saved: El vídeo ha sido guardado
Save Video: Guardar el vídeo
translated from English: traducido del inglés
Sponsor Block category:
music offtopic: No relacionado con la música
interaction: Interacción
@ -908,7 +901,6 @@ Video:
sponsor: Patrocinador
recap: Recapitulación
filler: Relleno
Skipped segment: Segmento saltado
External Player:
playlist: lista de reproducción
video: vídeo
@ -925,26 +917,6 @@ Video:
UnsupportedActionTemplate: '{externalPlayer} no soporta: {action}'
OpeningTemplate: Abriendo {videoOrPlaylist} en {externalPlayer}...
Premieres on: Se estrena el
Stats:
bandwidth: Velocidad de conexión
volume: Volumen
video id: ID del vídeo (Youtube)
player resolution: Ventana
fps: FPS
frame drop: Pérdida de fotogramas
buffered: En buffer
out of: sin
Video statistics are not available for legacy videos: Las estadísticas de vídeo
no están disponibles para los vídeos heredados
Bitrate: Tasa de bits
Volume: Volumen
Mimetype: Tipo de medio
Resolution: Resolución
Player Dimensions: Dimensiones del reproductor
Bandwidth: Ancho de banda
Video ID: ID de vídeo
Buffered: En búfer
Dropped / Total Frames: Fotogramas Perdidos / Fotogramas Totales
Premieres in: Estrenos en
Premieres: Estrenos
Show Super Chat Comment: Mostrar los comentarios del Super Chat
@ -1101,10 +1073,6 @@ Tooltips:
ajustes).
Skip by Scrolling Over Video Player: Use la rueda de desplazamiento para saltar
el vídeo, estilo MPV.
Allow DASH AV1 formats: Los formatos DASH AV1 pueden verse mejor que los formatos
DASH H.264. ¡Los formatos DASH AV1 requieren más potencia para reproducirse!
No están disponibles en todos los videos, en esos casos el reproductor usará
los formatos DASH H.264 en su lugar.
General Settings:
Region for Trending: La región de las tendencias permite ver los vídeos más populares
en un país determinado.

View File

@ -274,7 +274,6 @@ Settings:
Scroll Volume Over Video Player: Barra de volumen en el reproductor
Skip by Scrolling Over Video Player: Saltar Deslizando sobre el Reproductor de
Video
Allow DASH AV1 formats: Permitir formatos DASH AV1
Scroll Playback Rate Over Video Player: Acelerar video con la rueda del mouse
Fast-Forward / Rewind Interval: Período de Avance Rápido / Retroceso
Video Playback Rate Interval: Intervalo entre velocidades del video
@ -448,10 +447,6 @@ Channel:
Tags:
Search for: Buscar por «{tag}»
Details: Detalles
Video:
translated from English: traducido del inglés
Stats:
Mimetype: Tipo de medio
Yes: 'Sí'
No: 'No'
A new blog is now available, {blogTitle}. Click to view more: 'Un nuevo blog está

View File

@ -388,7 +388,6 @@ Settings:
%s 2-numbriline videosekund. %t 3-numbriline video millisekund. %i video tunnus.
Alamkaustade loomiseks võid kasutada ka „\“ või „/“.
Skip by Scrolling Over Video Player: Jäta vahele, kerides üle videopleieri
Allow DASH AV1 formats: Luba DASH AV1 vormingud
Enter Fullscreen on Display Rotate: Ekraani pööramisel ava täisekraanivaade
Privacy Settings:
Privacy Settings: 'Privaatsuse seadistused'
@ -817,14 +816,8 @@ Video:
videote loendist
Video has been saved: Video on salvestatud
Save Video: Salvesta video
translated from English: tõlgitud inglise keelest
Started streaming on: Voogedastus algas
Streamed on: Voogedastatud
Audio:
High: Kõrge kvaliteet
Medium: Keskmine kvaliteet
Low: Madal kvaliteet
Best: Parim kvaliteet
audio only: vaid helivoog
video only: vaid videovoog
Download Video: Laadi video alla
@ -837,7 +830,6 @@ Video:
sponsor: Sponsor
filler: Täitevideo
recap: Kokkuvõte
Skipped segment: Vahelejäetud lõik
External Player:
UnsupportedActionTemplate: 'Rakenduses {externalPlayer} puudub tugi: {action}'
OpeningTemplate: Avan {videoOrPlaylist} {externalPlayer} rakendusega...
@ -854,26 +846,6 @@ Video:
setting a playback rate: taasesituskiiruse määramine
starting video at offset: video esitamine ajanihkega
Premieres on: Esilinastub
Stats:
video id: YouTube video tunnus
player resolution: Vaate suurus
volume: Helivaljus
fps: FPS
frame drop: Vahelejäetud kaadreid
bandwidth: Võrguühenduse kiirus
buffered: Puhverdatud
out of: /
Bandwidth: Ribalaius
Bitrate: Bitikiirus
Volume: Helivaljus
Dropped / Total Frames: Vahele jäetud kaadreid / kaadreid kokku
Player Dimensions: Meediaesitaja mõõdud
Buffered: Puhverdatud
Video ID: Video tunnus
Mimetype: Meedia MIME-tüüp
Video statistics are not available for legacy videos: Vana tüüpi videote puhul
pole statistika saataval
Resolution: Resolutsioon
Premieres: Esilinastus
Show Super Chat Comment: Näita Super Chat'i kommentaare
Scroll to Bottom: Keri alla
@ -1039,10 +1011,6 @@ Tooltips:
edasi ja tagasi. Tavakiiruse taastamiseks (kui sa seda seadistustest pole muutnud,
siis on see 1x) hoia all Ctrl klahvi (Mac'is ⌘ klahvi) ja klõpsi hiire vasakut
nuppu.
Allow DASH AV1 formats: DASH AV1 vormingu puhul pilt võib tunduda paremad kui
DASH H.264 puhul. DASH AV1 vormingu dekodeerimine kasutab esitamise ajal rohkem
energiat! See vorming ei ole saadaval kõikide videote puhul, mispuhul kasutab
videoesitaja selle asemel DASH H.264 vormingut.
Skip by Scrolling Over Video Player: MPV-stiilis video läbilappamiseks kasuta
hiire ratast.
Distraction Free Settings:

View File

@ -393,7 +393,6 @@ Settings:
Video Playback Rate Interval: Bideo Erreprodukzio-tasa tartea
Skip by Scrolling Over Video Player: Saltatu bideo-erreproduzitzailean korrituz
Enter Fullscreen on Display Rotate: Sartu pantaila osoko pantaila biratu pantailan
Allow DASH AV1 formats: Baimendu DASH AV1 formatuak
Privacy Settings:
Privacy Settings: 'Pribatutasunari buruzko ezarpenak'
Remember History: 'Historikoa oroitu'
@ -796,11 +795,6 @@ Video:
Download Video: 'Bideoa deskargatu'
video only: 'Bideoa soilik'
audio only: 'Audioa soilik'
Audio:
Low: 'Eskasa'
Medium: 'Erdi-mailakoa'
High: 'Altua'
Best: 'Onena'
Published:
Jan: 'Urtarrila'
Feb: 'Otsaila'
@ -834,7 +828,6 @@ Video:
Published on: 'Noiz argitaratua'
Streamed on: 'Noiz zuzenean emana'
Started streaming on: 'Noiz hasi zen zuzenekoa'
translated from English: 'Ingelesetik itzulia'
Publicationtemplate: 'Duela {number} {unit}'
#& Videos
External Player:
@ -852,18 +845,6 @@ Video:
OpeningTemplate: '{videoOrPlaylist} irekitzen {externalPlayer}-an...'
UnsupportedActionTemplate: '{externalPlayer}-k ez du onartzen: {action}'
playlist: erreprodukzio zerrenda
Stats:
Video ID: Bideoaren identifikatzailea
Bitrate: biten tasa
Volume: Bolumena
Bandwidth: Banda zabalera
Buffered: Bufferera igota
Video statistics are not available for legacy videos: Bideoen estatistikak ez
daude eskuragarri legacy bideoentzat
Resolution: Bereizmena
Player Dimensions: Erreproduzitzailearen neurriak
Dropped / Total Frames: Bidalitako / Guztira Frame-ak
Mimetype: MIME mota
Sponsor Block category:
music offtopic: Gaiaz kanpoko musika
interaction: Elkarrekintza
@ -873,7 +854,6 @@ Video:
recap: Laburpen
filler: Betegarria
intro: Sarrera
Skipped segment: Saltatu egin da segmentua
Premieres on: Estreinaldiak
Hide Channel: Kanala ezkutatu
Unhide Channel: Kanala erakutsi
@ -1005,10 +985,6 @@ Tooltips:
aldaketarik egin ez bada).
Skip by Scrolling Over Video Player: Erabili korritze-gurpila bideoa saltatzeko,
MPV estiloa.
Allow DASH AV1 formats: DASH AV1 formatuak DASH H.264 formatuak baino itxura hobea
izan dezake. DASH AV1 formatuek potentzia gehiago behar dute erreproduzitzeko!
Ez daude bideo guztietan eskuragarri, kasu horietan erreproduzitzaileak DASH
H.264 formatuak erabiliko ditu ordez.
Subscription Settings:
Fetch Feeds from RSS: 'Posible denean, Freetube-k bere lehenetsitako metodoa erabili
beharrean RSS-ak baliatuko ditu zure harpidetzen jariora konektatzeko. RSS arinagoa

View File

@ -273,7 +273,6 @@ Settings:
Folder Label: پوشه اسکرین شات
Folder Button: پوشه را انتخاب کنید
Skip by Scrolling Over Video Player: با پیمایش روی پخش‌کننده ویدیو از آن بگذرید
Allow DASH AV1 formats: فرمت‌های DASH AV1 را مجاز کنید
External Player Settings:
External Player Settings: 'تنظیمات پخش کننده خارجی'
External Player: 'پخش کننده خارجی'
@ -564,12 +563,10 @@ Video:
Ago: پیش
Upcoming: اولین نمایش در
In less than a minute: در کمتر از یک دقیقه
translated from English: ترجمه شده از انگلیسی
Copy Invidious Link: لینک Invidious را کپی کنید
Play Previous Video: پخش ویدیوی قبلی
Autoplay: پخش خودکار
Started streaming on: پخش جریانی را شروع کرد
Skipped segment: بخش رد شد
'Chat is disabled or the Live Stream has ended.': چت غیرفعال است یا پخش زنده به
پایان رسیده است.
Copy YouTube Channel Link: لینک کانال یوتیوب را کپی کنید
@ -590,11 +587,6 @@ Video:
Live Now: زنده هم اکنون
Save Video: ذخیره ویدیو
Open in Invidious: در Invidious باز کنید
Audio:
Medium: متوسط
Best: بهترین
High: عالی
Low: کم
Video has been removed from your saved list: ویدیو از لیست ذخیره شده شما حذف شده
است
Download Video: دانلود ویدیو
@ -618,18 +610,6 @@ Video:
audio only: فقط صدا
Publicationtemplate: '{number} {unit} پیش'
Video has been saved: ویدیو ذخیره شده است
Stats:
Dropped / Total Frames: حذف شده / مجموع فریم ها
Video ID: شناسه ویدیو
Player Dimensions: ابعاد پخش کننده
Bitrate: میزان بیت
Volume: درجه صدا
Bandwidth: پهنای باند
Buffered: بافر شده
Video statistics are not available for legacy videos: آمار ویدیویی برای ویدیوهای
قدیمی موجود نیست
Resolution: کیفیت
Mimetype: نوع مایم
'Live Chat is currently not supported with the Invidious API. A direct connection to YouTube is required.': گفتگوی
زنده در حال حاضر با Invidious API پشتیبانی نمی شود. اتصال مستقیم به YouTube مورد
نیاز است.
@ -670,10 +650,6 @@ Tooltips:
Player Settings:
Skip by Scrolling Over Video Player: از چرخ اسکرول برای رد شدن از ویدیو، سبک MPV
استفاده کنید.
Allow DASH AV1 formats: فرمت‌های DASH AV1 ممکن است بهتر از فرمت‌های DASH H.264
به نظر برسند. فرمت های DASH AV1 برای پخش به قدرت بیشتری نیاز دارند! آنها در
همه ویدیوها در دسترس نیستند، در این موارد پخش کننده به جای آن از فرمت های DASH
H.264 استفاده می کند.
Scroll Playback Rate Over Video Player: در حالی که مکان نما روی ویدیو است، کلید
کنترل (کلید فرمان در مک) را فشار داده و نگه دارید و چرخ ماوس را به جلو یا عقب
ببرید تا سرعت پخش را کنترل کنید. کلید کنترل (کلید فرمان در مک) را فشار داده

View File

@ -349,7 +349,6 @@ Settings:
"\" tai "/" luodaksesi alikansioita.
Enter Fullscreen on Display Rotate: Siirry koko näytön tilaan näyttöä kiertäessä
Skip by Scrolling Over Video Player: Ohita vierittämällä videosoittimen yli
Allow DASH AV1 formats: Salli DASH AV1 -formaatit
Subscription Settings:
Subscription Settings: 'Tilausasetukset'
Hide Videos on Watch: 'Piilota katsotut videot'
@ -758,11 +757,6 @@ Video:
Loop Playlist: Kierrätä soittolistaa
Starting soon, please refresh the page to check again: Hetki pieni, päivitä sivu
uudelleen
Audio:
Best: Paras
High: Korkea
Medium: Keskitaso
Low: Alhainen
audio only: vain ääni
video only: vain video
Download Video: Lataa video
@ -796,31 +790,10 @@ Video:
sponsor: Sponsori
recap: Kertaus
filler: Täyte
Skipped segment: Ylihypätty osio
translated from English: käännetty englanninkielestä
Video has been removed from your saved list: Video poistettiin tallennettujen videoiden
luettelostasi
Video has been saved: Video on tallennettu
Save Video: Tallenna video
Stats:
video id: Videon tunniste (YouTube)
player resolution: Näkymäikkuna
bandwidth: Yhteyden nopeus
buffered: Puskuroitu
volume: Äänenvoimakkuus
fps: Kuvanopeus
out of: /
Video ID: Videotunnus
Bitrate: Tiedonsiirtonopeus
Bandwidth: Kaistanleveys
Mimetype: Internet-mediatyyppi
Video statistics are not available for legacy videos: Vanhojen videoiden videotilastot
eivät ole saatavilla
Player Dimensions: Soittimen mitat
Volume: Äänenvoimakkuus
Buffered: Puskuroitu
Resolution: Resoluutio
Dropped / Total Frames: Pudotettu / Yhteensä
Premieres on: Julkaistaan
Premieres: Ensilähetykset
Show Super Chat Comment: Näytä Super Chat -kommentti
@ -1013,10 +986,6 @@ Tooltips:
painettuna ja paina hiiren vasenta näppäintä.
Skip by Scrolling Over Video Player: Käytä vieritysrullaa videon selaamiseen,
MPV-tyyliin.
Allow DASH AV1 formats: DASH AV1 formaatit saattavat näyttää paremmalta kuin DASH
H.264 formaatit. DASH AV1 formaatit vaativat enemmän tehoa toistamiseen! Ne
eivät ole käytettävissä kaikissa videoissa ja näissä tapauksissa soitin käyttää
sen sijaan DASH H.264 formaatteja.
External Player Settings:
Custom External Player Arguments: Kaikki ne omavalintaiset komentorivin määreet,
puolipisteillä eroteltuina (';'), jotka haluat siirtää eteenpäin ulkoiselle

View File

@ -411,7 +411,6 @@ Settings:
Folder Label: Dossier de capture d'écran
Enter Fullscreen on Display Rotate: Entrer en plein écran sur l'affichage Rotation
Skip by Scrolling Over Video Player: Sauter en faisant défiler le lecteur vidéo
Allow DASH AV1 formats: Autoriser les formats DASH AV1
Subscription Settings:
Subscription Settings: 'Paramètres des abonnements'
Hide Videos on Watch: 'Masquer les vidéos visionnées'
@ -870,11 +869,6 @@ Video:
Loop Playlist: Liste de lecture en boucle
Starting soon, please refresh the page to check again: Débute prochainement, veuillez
actualiser la page pour vérifier à nouveau
Audio:
Best: Meilleure
Medium: Normale
Low: Basse
High: Haute
audio only: audio uniquement
video only: vidéo uniquement
Download Video: Télécharger la vidéo
@ -888,7 +882,6 @@ Video:
enregistrée
Video has been saved: La vidéo a été enregistrée
Save Video: Enregistrer la vidéo
translated from English: traduit de l'anglais
Sponsor Block category:
music offtopic: Musique hors sujet
interaction: Interaction
@ -898,7 +891,6 @@ Video:
intro: Intro
filler: Bouche-trou
recap: Récap
Skipped segment: Segment ignoré
External Player:
playlist: liste de lecture
video: vidéo
@ -915,26 +907,6 @@ Video:
UnsupportedActionTemplate: '{externalPlayer} non pris en charge : {action}'
OpeningTemplate: Ouverture de {videoOrPlaylist} en {externalPlayer}…
OpenInTemplate: Ouvrir avec {externalPlayer}
Stats:
video id: "Identifiant de la vidéo (YouTube)"
player resolution: "Résolution du lecteur"
volume: "Volume"
fps: "IPS"
frame drop: "Perte d'image"
bandwidth: "Vitesse de connexion"
buffered: "En tampon"
out of: "sur"
Player Dimensions: Dimensions du lecteur
Bitrate: Débit binaire
Volume: Volume
Mimetype: Type de médias
Video statistics are not available for legacy videos: Les statistiques vidéo ne
sont pas disponibles pour les anciennes vidéos
Resolution: Résolution
Bandwidth: Bande passante
Video ID: Identifiant vidéo
Buffered: En mémoire tampon
Dropped / Total Frames: Images perdues / Nombre total d'images
Premieres on: Avant-première le
Premieres in: Première dans
Premieres: Avant-première
@ -1146,10 +1118,6 @@ Tooltips:
de lecture par défaut (1x, sauf si elle a été modifiée dans les paramètres).
Skip by Scrolling Over Video Player: Utilisez la molette de défilement pour passer
d'une vidéo à l'autre, en style MPV.
Allow DASH AV1 formats: Les formats DASH AV1 peuvent être plus beaux que les formats
DASH H.264. Les formats DASH AV1 nécessitent plus de puissance pour être lus !
Ils ne sont pas disponibles sur toutes les vidéos, dans ce cas le lecteur utilisera
les formats DASH H.264 à la place.
General Settings:
Invidious Instance: L'instance Invidious à laquelle FreeTube se connectera pour
les appels API.

View File

@ -288,7 +288,6 @@ Settings:
Max Video Playback Rate: Velocidade máxima da reprodución do vídeo
Enter Fullscreen on Display Rotate: Poñase a pantalla enteira o xirala pantalla
Skip by Scrolling Over Video Player: Saltar desprazándose polo reprodutor de vídeo
Allow DASH AV1 formats: Permitilos formatos DASH AV1
Privacy Settings:
Privacy Settings: 'Axustes de privacidade'
Remember History: 'Lembrar histórico'
@ -665,11 +664,6 @@ Video:
Download Video: 'Descargar vídeo'
video only: 'Só vídeo'
audio only: 'Só audio'
Audio:
Low: 'Baixa'
Medium: 'Media'
High: 'Alta'
Best: 'Máxima'
Published:
Jan: 'Xan'
Feb: 'Feb'
@ -729,23 +723,9 @@ Video:
sponsor: Patrocinador
recap: Recapitulación
filler: Recheo
Skipped segment: Segmento omitido
translated from English: traducido do inglés
Video has been removed from your saved list: Eliminouse este vídeo da lista de gardados
Video has been saved: Gardouse o vídeo
Save Video: Gardar vídeo
Stats:
Player Dimensions: Dimensións do reproductor
Video ID: Identificador do video
Buffered: No bufer
Mimetype: Tipo de medio
Video statistics are not available for legacy videos: As estadísticas dos vídeo
non se atopan dispoñibles para os vídeos antigos
Bitrate: Taxa dos bits
Volume: Volume
Resolution: Resolución
Bandwidth: Ancho da banda
Dropped / Total Frames: Fotogramas Perdidos / Fotogramas Totales
Premieres on: Estrease o
Premieres: Estreos
Show Super Chat Comment: Mostralos comentarios do Super Chat
@ -867,10 +847,6 @@ Tooltips:
que o modificase na configuración).
Skip by Scrolling Over Video Player: Usala roda de desprazamento para saltalo
vídeo, estilo MPV.
Allow DASH AV1 formats: Os formatos DASH AV1 poden parecer mellor que os formatos
DASH H.264. Os formatos DASH AV1 requiren máis potencia para reproducir. Non
están dispoñibles en todolos vídeos, neses casos o reprodutor utilizará os formatos
DASH H.264.
Subscription Settings:
Fetch Feeds from RSS: 'Cando está activado, FreeTube usará RSS no canto do método
predeterminao para obter as subscricións. RSS é máis rápido e impide o bloqueo

View File

@ -289,7 +289,6 @@ Settings:
ב־3 ספרות. %i מזהה הסרטון. אפשר להשתמש גם ב־„/” או ב־„\” כדי ליצור תת־תיקיות.
Enter Fullscreen on Display Rotate: מעבר למסך מלא עם סיבוב התצוגה
Skip by Scrolling Over Video Player: אפשר לדלג על ידי גלילה על נגן הווידאו
Allow DASH AV1 formats: לאפשר תצורות DASH AV1
Privacy Settings:
Privacy Settings: 'הגדרות פרטיות'
Remember History: 'לזכור את היסטוריית הצפייה'
@ -723,11 +722,6 @@ Video:
Published on: 'פורסם'
Publicationtemplate: 'לפני {number} {unit}'
#& Videos
Audio:
Best: איכות הכי טובה
High: איכות גבוהה
Medium: איכות בינונית
Low: איכות נמוכה
audio only: שמע בלבד
video only: סרטון בלבד
Download Video: להוריד סרטון
@ -740,7 +734,6 @@ Video:
Video has been removed from your saved list: הסרטון הוסר מרשימת השמורים שלך
Video has been saved: סרטון נשמר
Save Video: שמירת סרטון
translated from English: תורגם מאנגלית
Premieres on: שידור הבכורה ב־
Sponsor Block category:
outro: סיום
@ -766,26 +759,6 @@ Video:
looping playlists: לולאה על רשימות נגינה
opening specific video in a playlist (falling back to opening the video): פתיחת
סרטון מסוים ברשימת נגינה (ייסוג לפתיחת הסרטון)
Skipped segment: קטע שדילגת עליו
Stats:
video id: מזהה סרטון (YouTube)
bandwidth: מהירות החיבור
out of: מתוך
volume: עוצמת שמע
buffered: בזיכרון
frame drop: השמטת תמוניות
fps: תמוניות לשנייה
Video statistics are not available for legacy videos: סטטיסטיקת וידאו אינה זמינה
לסרטונים ישנים
Video ID: מזהה וידאו
Resolution: רזולוציה
Player Dimensions: ממדי נגן
Bitrate: קצב סיביות
Volume: עצמת שמע
Bandwidth: רוחב פס
Buffered: שמור בזיכרון
Dropped / Total Frames: תמוניות שהושמטו / סה״כ
Mimetype: טיפוס MIME
Premieres in: בכורה בעוד
Premieres: בכורות
Scroll to Bottom: גלילה לתחתית
@ -919,9 +892,6 @@ Tooltips:
בהגדרות).
Skip by Scrolling Over Video Player: ניתן להשתמש בגלגלת כדי לדלג בתוך הסרטון,
כמו ב־MPV.
Allow DASH AV1 formats: תסדירי DASH AV1 עשויים להיראות טוב יותר מתסדירי DASH H.264.
תסדירי DASH AV1 דורשים יותר חשמל כדי לנגן! הם אינם זמינים בכל הסרטונים, במקרים
האלה הנגן ישתמש בתסדירי DASH H.264 במקום.
Subscription Settings:
Fetch Feeds from RSS: כאשר אפשרות זו פעילה. FreeTube ישתמש ב־RSS במקום בשיטת ברירת
המחדל לאיסוף הזנת המינויים שלך. RSS היא שיטה מהירה יותר ומונעת חסימת IP אבל

View File

@ -385,7 +385,6 @@ Settings:
Enter Fullscreen on Display Rotate: Koristi cjeloekranski prikaz pri okretanju
ekrana
Skip by Scrolling Over Video Player: Preskoči pomicanjem preko video playera
Allow DASH AV1 formats: Dozvoli DASH AV1 formate
Privacy Settings:
Privacy Settings: 'Postavke privatnosti'
Remember History: 'Zapamti povijest'
@ -869,11 +868,6 @@ Video:
Loop Playlist: Ponavljaj zbirku
Starting soon, please refresh the page to check again: Uskoro počinje. Aktualiziraj
stranicu za ponovnu provjeru
Audio:
Best: Najbolja
High: Visoka
Medium: Srednja
Low: Niska
audio only: samo audiosnimku
video only: samo video
Download Video: Preuzmi video
@ -887,7 +881,6 @@ Video:
spremljenih
Video has been saved: Video je spremljen
Save Video: Spremi video
translated from English: prevedeno iz engleskog
Sponsor Block category:
music offtopic: Druga vrsta glazbe
interaction: Interakcija
@ -897,7 +890,6 @@ Video:
sponsor: Sponzor
recap: Rekapitulacija
filler: Dodatni materijal
Skipped segment: Preskočeni segment
External Player:
Unsupported Actions:
starting video at offset: pokretanje videa pri odmaku
@ -914,26 +906,6 @@ Video:
video: video
OpenInTemplate: Otvori u {externalPlayer}
Premieres on: Premijera
Stats:
fps: Kadrova u sekundi
player resolution: Rezolucija prikaza
video id: Video ID (YouTube)
volume: Glasnoća
frame drop: Ispuštanje kadrova
bandwidth: Brzina veze
buffered: Učitano u memoriju
out of: od
Video statistics are not available for legacy videos: Statistika videa nije dostupna
za stara videa
Video ID: Video ID
Resolution: Razlučivost
Player Dimensions: Dimenzije playera
Bitrate: Brzina prijenosa
Volume: Direktorij
Bandwidth: Propusnost
Buffered: Učitano u memoriju
Mimetype: Mimetype
Dropped / Total Frames: Ispušteni/ukupni kadrovi
Premieres in: Premijera u
Premieres: Premijere
Show Super Chat Comment: Prikaži Super Chat komentar
@ -1075,10 +1047,6 @@ Tooltips:
brzinu reprodukcije (jednostruka brzina, ukoliko nije promijenjena u postavkama).
Skip by Scrolling Over Video Player: Koristi kotačić za pregledavanje videa, MPV
stil.
Allow DASH AV1 formats: DASH AV1 formati mogu izgledati bolje od DASH H.264 formata.
DASH AV1 formati zahtijevaju više kapaciteta za reprodukciju! Nisu dostupni
pri svim videima. U tim će slučajevima player umjesto njih koristiti DASH H.264
formate.
General Settings:
Invidious Instance: Invidious primjerak na koji će se FreeTube povezati za pozive
API-a.

View File

@ -406,7 +406,6 @@ Settings:
Video Playback Rate Interval: Videó lejátszási sebesség időköze
Enter Fullscreen on Display Rotate: Teljes képernyős mód a kijelzőn forgatáshoz
Skip by Scrolling Over Video Player: Kihagyás a Videolejátszó felett görgetve
Allow DASH AV1 formats: DASH AV1 formátumok engedélyezése
Privacy Settings:
Privacy Settings: 'Adatvédelmi beállítások'
Remember History: 'Előzmények megjegyzése'
@ -888,11 +887,6 @@ Video:
Published on: 'Megjelent'
Publicationtemplate: '{number} {unit} ezelőtt'
#& Videos
Audio:
Best: Legjobb
High: Magas
Medium: Közepes
Low: Alacsony
audio only: csak hang
video only: csak videó
Download Video: Videó letöltése
@ -905,7 +899,6 @@ Video:
Video has been removed from your saved list: A videót eltávolítottuk a mentett listáról
Video has been saved: A videó mentve
Save Video: Videó mentése
translated from English: angolról fordítva
Sponsor Block category:
music offtopic: Témán kívüli zene
interaction: Kölcsönhatás
@ -915,7 +908,6 @@ Video:
sponsor: Szponzor
filler: Kitöltő
recap: Összegzés
Skipped segment: Szegmens kihagyva
External Player:
Unsupported Actions:
looping playlists: lejátszási lista folyamatos lejátszása
@ -934,18 +926,6 @@ Video:
video: videó
OpenInTemplate: '{externalPlayer} megnyításaban'
Premieres on: 'Első előadás dátuma'
Stats:
Player Dimensions: Lejátszó méretei
Video ID: Videóazonosító
Video statistics are not available for legacy videos: Az örökölt videókhoz videóstatisztika
nem érhető el
Resolution: Felbontás
Mimetype: MIME-típus
Volume: Hangerő
Bandwidth: Sávszélesség
Buffered: Pufferelt
Dropped / Total Frames: Elvetve/Összes képkocka
Bitrate: Átviteli sebesség
Premieres: Első előadások
Show Super Chat Comment: Haladó csevegési megjegyzés megjelenítése
Scroll to Bottom: Görgetés legalulra
@ -1113,10 +1093,6 @@ Tooltips:
(1x, hacsak nem módosították a beállításokban).
Skip by Scrolling Over Video Player: MPV módban a görgetőkerék használatával kihagyhatja
a videót.
Allow DASH AV1 formats: A DASH AV1 formátumok jobban nézhetnek ki, mint a DASH
H.264 formátumok. A DASH AV1 formátumok több energiát igényelnek a lejátszáshoz!
Nem minden videónál érhetők el, ilyenkor a lejátszó a DASH H.264 formátumot
használja helyette.
External Player Settings:
Custom External Player Executable: Alapértelmezés szerint a FreeTube feltételezi,
hogy a kiválasztott külső lejátszó megtalálható a PATH (ÚTVONAL) környezeti

View File

@ -260,7 +260,6 @@ Settings:
Ask Path: Tanya Lokasi Penyimpanan
Quality Label: Kualitas Tangkapan Layar
File Name Label: Pola Nama Berkas
Allow DASH AV1 formats: Izinkan format DASH AV1
Privacy Settings:
Privacy Settings: 'Pengaturan Privasi'
Remember History: 'Ingat Riwayat'
@ -609,11 +608,6 @@ Video:
Published on: 'Dipublikasi pada'
Publicationtemplate: '{number} {unit} yang lalu'
#& Videos
Audio:
Best: Terbaik
High: Tinggi
Medium: Sedang
Low: Rendah
audio only: hanya audio
video only: hanya video
Download Video: Unduh Video
@ -629,7 +623,6 @@ Video:
Anda
Video has been saved: Video telah disimpan
Save Video: Simpan Video
translated from English: diterjemahkan dari Bahasa Inggris
Sponsor Block category:
interaction: Interaksi
music offtopic: Musik Non-Topik
@ -637,7 +630,6 @@ Video:
outro: Outro
intro: Intro
sponsor: Sponsor
Skipped segment: Segmen yang dilewati
External Player:
Unsupported Actions:
starting video at offset: memulai video pada offset
@ -655,24 +647,6 @@ Video:
video: video
OpenInTemplate: Buka di {externalPlayer}
Premieres on: Pemutaran Perdana pada
Stats:
bandwidth: Kecepatan Koneksi
volume: Volume
fps: FPS
video id: ID Video (YouTube)
frame drop: Frame Drop
buffered: Buffered
player resolution: Area pandang
out of: keluar dari
Bandwidth: Bandwidth
Video statistics are not available for legacy videos: Statistik video tidak tersedia
untuk video legacy
Video ID: ID Video
Resolution: Resolusi
Volume: Volume
Mimetype: Tipe Mime
Player Dimensions: Ukuran Pemutar
Bitrate: Laju Bit
Videos:
#& Sort By
Sort By:

View File

@ -396,7 +396,6 @@ Settings:
File Name Label: Mynstur skráaheita
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ð
Privacy Settings:
Privacy Settings: 'Stillingar gagnaleyndar'
Remember History: 'Muna áhorfsferil'
@ -796,11 +795,6 @@ Video:
Download Video: 'Sækja myndskeið'
video only: 'einungis myndmerki'
audio only: 'einungis hljóð'
Audio:
Low: 'Lág'
Medium: 'Miðlungs'
High: 'Há'
Best: 'Besta'
Published:
Jan: 'Jan'
Feb: 'Feb'
@ -837,7 +831,6 @@ Video:
Started streaming on: 'Byrjaði streymi'
Publicationtemplate: 'Fyrir {number} {unit} síðan'
#& Videos
translated from English: þýtt úr ensku
Sponsor Block category:
music offtopic: Tónlist óskyld efni
interaction: Gagnvirkni
@ -847,7 +840,6 @@ Video:
outro: Afkynning
recap: Upprifjun
filler: Uppfylling
Skipped segment: Búti sleppt
External Player:
Unsupported Actions:
looping playlists: endurtaka spilunarlista
@ -864,26 +856,6 @@ Video:
video: myndskeið
OpenInTemplate: Opna í {externalPlayer}
Premieres on: Frumsýnt
Stats:
player resolution: Myndgluggi
fps: r/sek
bandwidth: Hraði tengingar
buffered: Í biðminni
out of: af
frame drop: Rammatap
video id: Auðkenni myndskeiðs (YouTube)
volume: Hljóðstyrkur
Video ID: Auðkenni myndmerkis
Resolution: Upplausn
Player Dimensions: Stærðir spilara
Bandwidth: Bandbreidd
Buffered: Biðminni
Dropped / Total Frames: Sleppt / Fjöldi ramma
Mimetype: MIME-tegund
Video statistics are not available for legacy videos: Tölfræði myndskeiða er ekki
í boði fyrir eldri gerðir myndskeiða
Bitrate: Bitahraði
Volume: Hljóðstyrkur
Premieres in: Frumsýnt eftir
Premieres: Frumsýnt
Show Super Chat Comment: Birta athugasemd Super Chat
@ -1011,9 +983,6 @@ Tooltips:
breytt í stillingunum).
Skip by Scrolling Over Video Player: Nota skrunhjólið til að fletta í gegnum myndskeið,
svipað og í MPV.
Allow DASH AV1 formats: DASH AV1 snið geta litið betur út en DASH H.264 snið.
DASH AV1 snið krefjast hins vegar meira afls í afspilun! Það er ekki til taks
í öllum myndskeiðum, þá mun spilarinn nota DASH H.264 snið í staðinn.
Subscription Settings:
Fetch Feeds from RSS: 'Þegar þetta er virkt, mun FreeTube nota RSS í stað sjálfgefinnar
aðferðar við að safna streymi áskriftarinnar þinnar. RSS er hraðvirkara og kemur

View File

@ -395,7 +395,6 @@ Settings:
del video 3 cifre. %i ID video. Puoi anche usare \ o / per creare sottocartelle.
Enter Fullscreen on Display Rotate: Entra a schermo intero su Ruota schermo
Skip by Scrolling Over Video Player: Salta tramite scorrimento sul lettore video
Allow DASH AV1 formats: Consenti formati DASH AV1
Privacy Settings:
Privacy Settings: 'Impostazioni della privacy'
Remember History: 'Salva la cronologia'
@ -839,11 +838,6 @@ Video:
Autoplay: Riproduzione automatica
Starting soon, please refresh the page to check again: La riproduzione partirà tra
breve, aggiorna la pagina per ricontrollare
Audio:
Best: Migliore
High: Alto
Medium: Medio
Low: Basso
audio only: solo audio
video only: solo video
Download Video: Download video
@ -881,29 +875,7 @@ Video:
sponsor: Sponsor
recap: Ricapitolazione
filler: Riempitivo
Skipped segment: Segmento saltato
translated from English: tradotto dall'inglese
Premieres on: Première il
Stats:
volume: Volume
fps: FPS
frame drop: Perdita di immagine
buffered: Bufferizzato
bandwidth: Velocità di connessione
out of: per
video id: ID video (YouTube)
player resolution: Finestra di visualizzazione
Video statistics are not available for legacy videos: Le statistiche sui video
non sono disponibili per i video obsoleti
Video ID: ID video
Resolution: Risoluzione
Player Dimensions: Dimensioni del lettore
Bitrate: Velocità di trasmissione
Volume: Volume
Bandwidth: Larghezza di banda
Buffered: Memoria buffer
Dropped / Total Frames: Frame persi / Frame totali
Mimetype: Tipo di media
Premieres in: Anteprima in
Premieres: Première
Scroll to Bottom: Scorri fino in fondo
@ -1101,10 +1073,6 @@ Tooltips:
nelle Impostazioni).
Skip by Scrolling Over Video Player: Usa la rotella di scorrimento per saltare
il video, in stile MPV.
Allow DASH AV1 formats: I formati DASH AV1 possono avere un aspetto migliore dei
formati DASH H.264. I formati DASH AV1 richiedono più potenza per la riproduzione!
Non sono disponibili su tutti i video, in questo caso il lettore userà invece
i formati DASH H.264.
Subscription Settings:
Fetch Feeds from RSS: Se abilitato, FreeTube userà gli RSS invece del metodo standard
per leggere le iscrizioni. Gli RSS sono più veloci e impediscono il blocco dell'IP,

View File

@ -279,7 +279,6 @@ Settings:
Folder Button: フォルダーの選択
Enter Fullscreen on Display Rotate: 横画面時にフルスクリーンにする
Skip by Scrolling Over Video Player: 動画プレーヤーでスクロールしてスキップ可能にする
Allow DASH AV1 formats: DASH AV1形式を許可
Subscription Settings:
Subscription Settings: '登録チャンネルの設定'
Hide Videos on Watch: '視聴済み動画の非表示'
@ -648,11 +647,6 @@ Video:
Shuffle Playlist: 再生リストのシャッフル
Loop Playlist: 再生リストのループ
Starting soon, please refresh the page to check again: すぐに再生されます、ページを再読み込みしてお待ちください
Audio:
Best: 最適
High:
Medium:
Low:
audio only: '音声のみ'
video only: '映像のみ'
Download Video: '動画のダウンロード'
@ -665,7 +659,6 @@ Video:
Video has been removed from your saved list: 動画を保存一覧から削除しました
Video has been saved: 動画を保存しました
Save Video: 動画の保存
translated from English: 英語から翻訳
Sponsor Block category:
sponsor: スポンサー
music offtopic: 音楽以外
@ -675,7 +668,6 @@ Video:
intro: イントロ(冒頭)
recap: 要約
filler: フィラー(穴埋め)
Skipped segment: スキップされたセグメント
External Player:
OpeningTemplate: '{externalPlayer} で {videoOrPlaylist} を開く...'
Unsupported Actions:
@ -692,25 +684,6 @@ Video:
video: 動画
OpenInTemplate: '{externalPlayer} で開く'
Premieres on: プレミア公開
Stats:
player resolution: 表示領域
fps: FPS
frame drop: コマ落ち
buffered: バッファー
video id: Video ID (YouTube)
volume: 音量
bandwidth: 接続速度
out of: のうち
Mimetype: メディアタイプ
Video ID: ビデオ ID
Resolution: 解像度
Bitrate: ビットレート
Volume: 音量
Buffered: バッファー
Player Dimensions: プレーヤーのサイズ
Video statistics are not available for legacy videos: 従来のビデオでは、ビデオ統計を使用できません
Bandwidth: 帯域幅
Dropped / Total Frames: ドロップ率 / 総フレーム数
Premieres in: 配信開始まで
Premieres: プレミア
Show Super Chat Comment: Super Chat のコメント表示
@ -866,8 +839,6 @@ Tooltips:
Scroll Playback Rate Over Video Player: カーソルが動画上にあるとき、Ctrl キーMac では Command キーを押したまま、マウスホイールを前後にスクロールして再生速度を調整します。Control
キーMac では Command キー)を押したままマウスを左クリックすると、すぐにデフォルトの再生速度(設定を変更していない場合は 1 xに戻ります。
Skip by Scrolling Over Video Player: スクロール ホイールを使用して、ビデオ、MPV スタイルをスキップします。
Allow DASH AV1 formats: DASH H.264形式よりもDASH AV1形式の方がきれいに見える可能性がありますが、再生にはより多くの処理能力が必要となります。DASH
AV1形式を使用できない場合、プレイヤーはDASH H.264形式を自動で使用します。
General Settings:
Invidious Instance: FreeTube が使用する Invidious API の接続先サーバーです。
Preferred API Backend: FreeTube が youtube からデータを取得する方法を選択します。「内部 API」とはアプリから取得する方法です。「Invidious

View File

@ -269,7 +269,6 @@ Settings:
File Name Tooltip: 아래 변수를 사용할 수 있습니다. %Y 년 4자리. %M 월 2자리. %D 일 2자리. %H 시간 2자리.
%N 분 2자리. %S 초 2자리. %T 밀리초 3자리. %s 비디오초. %t 비디오 밀리초 3자리. %i 비디오 ID. "\" 또는
"/" 를 사용하여 하위 폴더를 만들 수도 있습니다.
Allow DASH AV1 formats: DASH AV1 포맷 허용
Skip by Scrolling Over Video Player: 비디오 플레이어를 스크롤하여 건너뛰기
Enter Fullscreen on Display Rotate: 화면 회전 시 전체화면 활성화하기
Privacy Settings:
@ -552,11 +551,6 @@ Video:
Download Video: '동영상 다운로드'
video only: '비디오만'
audio only: '오디오만'
Audio:
Low: '낮음'
Medium: '중간'
High: '높음'
Best: '최고'
Published:
Jan: '1월'
Feb: '2월'
@ -595,18 +589,6 @@ Video:
Video has been saved: 동영상이 저장되었습니다
Video has been removed from your saved list: 저장된 목록에서 동영상이 제거되었습니다
Save Video: 비디오 저장
Stats:
Mimetype: 미디어 타입
Video statistics are not available for legacy videos: 레거시 비디오에 대한 비디오 통계를 사용할
수 없습니다
Player Dimensions: 플레이어 치수
Bandwidth: 대역폭
Video ID: 비디오 ID
Resolution: 해상도
Bitrate: 비트 전송률
Volume: 음량
Buffered: 버퍼링된
Dropped / Total Frames: 손실된 / 총 프레임 수
Premieres on: 개봉일
External Player:
Unsupported Actions:
@ -632,8 +614,6 @@ Video:
outro: 결말부
self-promotion: 자기 홍보
interaction: 상호 작용
translated from English: 영어에서 번역됨
Skipped segment: 건너뛴 세그먼트
Premieres: 프리미어
Upcoming: 공개 예정
Show Super Chat Comment: 슈퍼채팅 댓글 보이기
@ -733,8 +713,6 @@ Tooltips:
Scroll Playback Rate Over Video Player: 커서가 비디오 위에 있는 동안 Control 키( Mac의 경우 Command
키)를 길게 누르고 마우스 휠을 앞뒤로 스크롤하여 재생 속도를 제어합니다. Control 키 (Mac의 경우 Command 키)를 길게
누르고 마우스 왼쪽 버튼을 클릭하여 기본 재생 속도(설정에서 변경되지 않은 경우 1배)로 빠르게 돌아갑니다.
Allow DASH AV1 formats: DASH AV1 포맷은 DASH H.264 포맷보다 화질이 좋을 수 있으나, 영상 재생을 위해 더
높은 성능을 요구합니다. 모든 영상에서 사용 가능한 것은 아니며, 사용이 불가능할 경우 DASH H.264 포맷을 사용합니다.
Skip by Scrolling Over Video Player: MPV 방식으로 마우스 스크롤을 이용해 영상을 스킵합니다.
Subscription Settings:
Fetch Feeds from RSS: '활성화되면 FreeTube는 구독 피드를 가져오는 기본 방법 대신 RSS를 사용합니다. RSS는 더

View File

@ -294,7 +294,6 @@ Settings:
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ą
Allow DASH AV1 formats: Leisti DASH AV1 formatus
External Player Settings:
External Player Settings: 'Išorinio grotuvo nustatymai'
External Player: 'Išorinis grotuvas'
@ -608,11 +607,6 @@ Video:
Download Video: 'Atsisiųsti vaizdo įrašą'
video only: 'tik video'
audio only: 'tik audio'
Audio:
Low: 'Žemiausia'
Medium: 'Vidutinė'
High: 'Aukščiausia'
Best: 'Pati geriausia'
Published:
Jan: 'Sau'
Feb: 'Vas'
@ -646,9 +640,7 @@ Video:
Published on: 'Publikuota'
Streamed on: 'Transliuota'
Started streaming on: 'Transliaciją pradėjo'
translated from English: 'išversta iš anglų kalbos'
Publicationtemplate: 'prieš {number} {unit}'
Skipped segment: 'Praleistas segmentas'
Sponsor Block category:
sponsor: 'Rėmėjas'
intro: 'Įžanga'
@ -675,26 +667,6 @@ Video:
looping playlists: 'ciklu sukami grojaraščiai'
#& Videos
Premieres on: Premjera
Stats:
video id: Vaizdo įrašo ID (YouTube)
player resolution: Peržiūros sritis
fps: Kadrai per sekundę (FPS)
frame drop: Praleisti kadrai
bandwidth: Ryšio greitis
buffered: Užkrauta atmintyje
volume: Garsas
out of:
Video ID: Vaizdo įrašo ID
Resolution: Rezoliucija
Bitrate: Bitų sparta
Bandwidth: Pralaidumas
Volume: Apimtis
Player Dimensions: Grotuvo matmenys
Video statistics are not available for legacy videos: Vaizdo įrašų statistika
nepateikiama seniems vaizdo įrašams
Dropped / Total Frames: Pamesti / Iš viso kadrų
Mimetype: Mimetipas
Buffered: Buferizuota
Premieres: Premjera
Videos:
#& Sort By

View File

@ -279,7 +279,6 @@ Settings:
1440p: '1440p'
4k: '4k'
8k: '8k'
Allow DASH AV1 formats: 'Atļaut DASH AV1 formātus'
Screenshot:
Enable: 'Iespējot ekrānšāviņu'
Format Label: 'Ekrānšāviņa formāti'
@ -628,11 +627,6 @@ Video:
Download Video: ''
video only: ''
audio only: ''
Audio:
Low: ''
Medium: ''
High: ''
Best: ''
Published:
Jan: ''
Feb: ''
@ -666,9 +660,7 @@ Video:
Published on: ''
Streamed on: ''
Started streaming on: ''
translated from English: ''
Publicationtemplate: ''
Skipped segment: ''
Sponsor Block category:
sponsor: ''
intro: ''
@ -692,17 +684,6 @@ Video:
reversing playlists: ''
shuffling playlists: ''
looping playlists: ''
Stats:
Video statistics are not available for legacy videos: ''
Video ID: ''
Resolution: ''
Player Dimensions: ''
Bitrate: ''
Volume: ''
Bandwidth: ''
Buffered: ''
Dropped / Total Frames: ''
Mimetype: ''
#& Videos
Videos:
#& Sort By
@ -798,7 +779,6 @@ Tooltips:
Force Local Backend for Legacy Formats: ''
Proxy Videos Through Invidious: ''
Default Video Format: ''
Allow DASH AV1 formats: ''
Scroll Playback Rate Over Video Player: ''
Skip by Scrolling Over Video Player: ''
External Player Settings:

View File

@ -276,7 +276,6 @@ Settings:
Video Playback Rate Interval: Intervall for videoavspillingshastighet
Enter Fullscreen on Display Rotate: Fullskjermsvisning når skjermen roteres
Skip by Scrolling Over Video Player: Hopp over ved å rulle over videoavspiller
Allow DASH AV1 formats: Tillat DASH AV1-formater
Privacy Settings:
Privacy Settings: 'Personvernsinnstillinger'
Remember History: 'Husk historikk'
@ -628,11 +627,6 @@ Video:
Published on: 'Publisert'
Publicationtemplate: '{number} {unit} siden'
#& Videos
Audio:
High: Høy
Medium: Middels
Low: Lav
Best: Beste
audio only: Bare lyd
video only: Bare video
Download Video: Last ned video
@ -654,7 +648,6 @@ Video:
Open Channel in YouTube: Åpne kanal i YouTube
Play Previous Video: Spill av forrige video
Play Next Video: Spill av neste video
translated from English: oversatt fra engelsk
Sponsor Block category:
interaction: samhandling
outro: utgang
@ -664,7 +657,6 @@ Video:
self-promotion: egenpromotering
recap: Oppsummering
filler: Fyllstoff
Skipped segment: Overhoppet del
External Player:
Unsupported Actions:
shuffling playlists: omstokking av spillelister
@ -680,18 +672,6 @@ Video:
playlist: spilleliste
video: video
OpenInTemplate: Åpne i {externalPlayer}
Stats:
Bitrate: Bitrate
Volume: Lydstyrke
Bandwidth: Båndbredde
Resolution: Oppløsning
Player Dimensions: Avspillerdimensjoner
Mimetype: Media-type
Buffered: Mellomlagret
Video ID: Video-ID
Video statistics are not available for legacy videos: Videostatistikk er ikke
tilgjengelig for gammeldagse videoer
Dropped / Total Frames: Tapte/totalt antall rammer
Show Super Chat Comment: Vis supersludringskommentar
Scroll to Bottom: Rull til bunnen
Premieres on: Har première
@ -881,9 +861,6 @@ Tooltips:
å kontrollere avspillingshastigheten. Trykk og hold Ctrl-tasten (⌘ på Mac) og
venstreklikk på musen for å gå tilbake til fovalgt avspillingshastighet (1x
med minde det har blitt endret i innstillingene).
Allow DASH AV1 formats: DASH AV1-formater kan ha bedre kvalitet enn DASH H.264
-formater. DASH AV1-formater krever dog mer regnekraft for avspilling. Ikke
tilgjengelig for alle videoer, og i sådant fall bruker avspilleren DASH H.264-formater.
External Player Settings:
Custom External Player Arguments: Alle egendefinerte kommandolinjeargumenter,
semikoloninndelt («;») du ønsker å sende til den eksterne avspilleren.

View File

@ -388,7 +388,6 @@ Settings:
video; %i ID van de video. U kunt ook "\" of "/" gebruiken om deelmappen aan
te maken.'
Skip by Scrolling Over Video Player: Overslaan door over de videospeler te scrollen
Allow DASH AV1 formats: DASH-AV1-bestandstypes toestaan
Enter Fullscreen on Display Rotate: Volledig scherm bij draaien van scherm
Privacy Settings:
Privacy Settings: 'Privacy-instellingen'
@ -825,11 +824,6 @@ Video:
Loop Playlist: Playlist herhalen
Starting soon, please refresh the page to check again: Start binnenkort, vernieuw
de pagina om opnieuw te controleren
Audio:
Best: Beste
High: Hoog
Medium: Gemiddeld
Low: Laag
audio only: alleen audio
video only: alleen video
Download Video: Video downloaden
@ -843,7 +837,6 @@ Video:
opgeslagen video's
Video has been saved: Video is opgeslagen
Save Video: Video opslaan
translated from English: vertaald uit het Engels
Sponsor Block category:
music offtopic: Niet-muziek
interaction: Interactie
@ -853,7 +846,6 @@ Video:
sponsor: Sponsor
recap: Samenvatting
filler: Opvulling
Skipped segment: Segment overgeslagen
External Player:
Unsupported Actions:
shuffling playlists: afspeellijsten shufflen
@ -869,26 +861,6 @@ Video:
playlist: afspeellijst
video: video
OpenInTemplate: Openen in {externalPlayer}
Stats:
player resolution: Venster
volume: Volume
video id: Video-ID (YouTube)
fps: FPS
frame drop: Frame verlies
bandwidth: Verbindingssnelheid
buffered: Gebufferd
out of: van de
Buffered: Gebufferd
Dropped / Total Frames: Frames verloren/totaal
Mimetype: MIME-type
Video statistics are not available for legacy videos: Videogegevens zijn niet
beschikbaar voor oudere video's
Video ID: Video-ID
Resolution: Resolutie
Bandwidth: Bandbreedte
Bitrate: Bitrate
Volume: Volume
Player Dimensions: Spelerafmetingen
Premieres on: Gaat in première op
Premieres: Premières
Scroll to Bottom: Helemaal naar onderen scrollen
@ -1074,10 +1046,6 @@ Tooltips:
om de afspeelsnelheid te besturen. Houd de Control-toets (Command-toets op Mac)
ingedrukt en klik met de linker muisknop om snel terug te schakelen naar de
standaard afspeelsnelheid (1x tenzij aangepast in de instellingen).
Allow DASH AV1 formats: Video's in DASH AV1-formaat kunnen er beter uitzien dan
die in DASH H.264-formaat. DASH AV1 verbruikt op oudere apparaten meer energie!
Dit formaat is niet beschikbaar voor alle video's, in welk geval het DASH H.264-formaat
wordt gebruikt.
Skip by Scrolling Over Video Player: Gebruik het scroll-wieltje om door de video
te spoelen, zoals bij MPV.
Subscription Settings:

View File

@ -592,11 +592,6 @@ Video:
Download Video: 'Last ned video'
video only: 'berre video'
audio only: 'berre lyd'
Audio:
Low: 'Låg'
Medium: 'Middels'
High: 'Høg'
Best: 'Beste'
Published:
Jan: 'Jan'
Feb: 'Feb'
@ -632,7 +627,6 @@ Video:
Started streaming on: 'Begynte å straume på'
Publicationtemplate: '{number} {unit} sidan'
#& Videos
translated from English: omsett frå engelsk
Sponsor Block category:
outro: Avslutting
interaction: Samhandling
@ -642,7 +636,6 @@ Video:
self-promotion: Eigenpromotering
recap: Oppsummering
filler: Fyllstoff
Skipped segment: Overhoppa del
External Player:
video: video
playlist: speleliste
@ -659,18 +652,6 @@ Video:
opening specific video in a playlist (falling back to opening the video): opner
valt video i ei speleliste (faller tilbake til å opne videoen)
Premieres on: Har premiere
Stats:
Volume: Lydstyrke
Bandwidth: Bandbreidde
Player Dimensions: Avspelarstorleik
Bitrate: Bithastigheit
Resolution: Oppløysing
Buffered: Hurtiglagra
Video ID: Video-ID
Mimetype: Medietype
Video statistics are not available for legacy videos: Videostatestikk er ikkje
tilgjengeleg for utdaterte videoar
Dropped / Total Frames: Redusert/total mengd bilete
Show Super Chat Comment: Vis super-chat-kommentar
Premieres: Premiere
Scroll to Bottom: Rull til botn

View File

@ -88,7 +88,6 @@ Settings:
1440p: '୧୪୪p'
4k: '୪k'
8k: '୮k'
Allow DASH AV1 formats: DASH AV1 ଫର୍ମାଟ୍‍କୁ ଅନୁମତି ଦେବା
External Player Settings:
External Player Settings: 'ବାହ୍ୟ ଚାଳକ ସେଟିଂ'
External Player: 'ବାହ୍ୟ ଚାଳକ'

View File

@ -394,7 +394,6 @@ Settings:
orientacji ekranu
Skip by Scrolling Over Video Player: Przewijaj film kółkiem myszy na obszarze
odtwarzacza
Allow DASH AV1 formats: Zezwól na format AV1 DASH
Subscription Settings:
Subscription Settings: 'Ustawienia subskrypcji'
Hide Videos on Watch: 'Ukrywaj filmy po obejrzeniu'
@ -843,11 +842,6 @@ Video:
Loop Playlist: Zapętl playlistę
Starting soon, please refresh the page to check again: Wkrótce się zacznie. Proszę
odświeżyć stronę, aby ponownie sprawdzić
Audio:
Best: Najlepsza
High: Wysoka
Medium: Średnia
Low: Niska
audio only: tylko audio
video only: tylko wideo
Download Video: Pobierz film
@ -861,7 +855,6 @@ Video:
zapisanych
Video has been saved: Film został zapisany
Save Video: Zapisz film
translated from English: przetłumaczone z angielskiego
Sponsor Block category:
music offtopic: niemuzyczny
interaction: o interakcji
@ -871,7 +864,6 @@ Video:
sponsor: sponsorowany
filler: z wypełniaczem
recap: z podsumowaniem
Skipped segment: Pominięto segment
External Player:
Unsupported Actions:
reversing playlists: odwracania playlist
@ -888,26 +880,6 @@ Video:
video: filmu
OpenInTemplate: Otwórz w {externalPlayer}
Premieres on: Premiera
Stats:
buffered: Zbuforowano
out of: z
video id: ID filmu (YouTube)
player resolution: Odtwarzacz
volume: Głośność
bandwidth: Prędkość połączenia
fps: FPS
frame drop: Pominięte klatki
Video ID: ID filmu
Resolution: Rozdzielczość
Player Dimensions: Wymiary odtwarzacza
Bitrate: Szybkość transmisji
Volume: Głośność
Bandwidth: Przepustowość
Buffered: Zbuforowano
Mimetype: Typ MIME
Video statistics are not available for legacy videos: Statystyki filmu nie są
dostępne dla starych formatów
Dropped / Total Frames: Opuszczone klatki / klatki ogółem
Premieres in: Premiera za
Premieres: Premiery
Show Super Chat Comment: Pokazuj komentarze z „Superczatu”
@ -1125,10 +1097,6 @@ Tooltips:
wartości (1x, chyba że została zmieniona w ustawieniach).
Skip by Scrolling Over Video Player: Użyj kółka myszy, by przewijać film tak jak
w MPV.
Allow DASH AV1 formats: Film w formacie AV1 DASH może wyglądać lepiej, niż w formacie
H.264 DASH. Dekodowanie formatu AV1 DASH wymaga większej mocy obliczeniowej.
W filmach, dla których ten format nie jest dostępny, zostanie użyty format H.264
DASH.
External Player Settings:
Ignore Warnings: Nie pokazuj ostrzeżeń o nieobsługiwanych akcjach przez zewnętrzny
odtwarzacz (n.p. odwracanie playlist, itp.).

View File

@ -391,7 +391,6 @@ Settings:
Enter Fullscreen on Display Rotate: Entrar em tela cheia ao girar a tela para
o modo paisagem
Skip by Scrolling Over Video Player: Pular vídeo ao rolar sobre o player
Allow DASH AV1 formats: Permitir formatos DASH AV1
Subscription Settings:
Subscription Settings: 'Configurações de inscrições'
Hide Videos on Watch: 'Ocultar vídeos após assisti-los'
@ -826,11 +825,6 @@ Video:
#& Videos
Started streaming on: Transmissão iniciada em
Streamed on: Transmitido em
Audio:
Best: Máxima
Medium: Média
Low: Baixa
High: Alta
audio only: somente áudio
video only: somente vídeo
Download Video: Baixar vídeo
@ -850,7 +844,6 @@ Video:
vídeos salvos
Video has been saved: O vídeo foi salvo
Save Video: Salvar vídeo
translated from English: traduzido do Inglês
Sponsor Block category:
music offtopic: Música fora do contexto
interaction: Interação
@ -860,7 +853,6 @@ Video:
sponsor: Patrocinador
filler: Preenchimento
recap: Recapitulação
Skipped segment: Segmentos pulados
External Player:
Unsupported Actions:
shuffling playlists: Playlists aleatórias
@ -877,26 +869,6 @@ Video:
OpenInTemplate: Abrir em {externalPlayer}
video: vídeo
Premieres on: Estreia em
Stats:
video id: ID do vídeo (YouTube)
volume: Volume
fps: FPS
frame drop: Frame Drop
bandwidth: Velocidade de conexão
buffered: Buffered
out of: de
player resolution: Janela de exibição
Mimetype: Mimetype
Video statistics are not available for legacy videos: As estatísticas de vídeo
não estão disponíveis para vídeos mais antigos
Video ID: ID do vídeo
Player Dimensions: Dimensões do player
Bitrate: Taxa de bits
Volume: Volume
Bandwidth: Largura de banda
Resolution: Resolução
Buffered: Em buffer
Dropped / Total Frames: Quadros perdidos / Total de quadros
Premieres in: Estréias em
Premieres: Estreia
Scroll to Bottom: Ir para o final
@ -1102,10 +1074,6 @@ Tooltips:
sido alterada nas configurações).
Skip by Scrolling Over Video Player: Use a roda de rolagem para pular o vídeo,
estilo MPV.
Allow DASH AV1 formats: Os formatos DASH AV1 podem ter melhor aspecto do que os
formatos DASH H.264. Os formatos DASH AV1 requerem mais potência para reprodução!
Eles não estão disponíveis em todos os vídeos, e nesses casos o player usará
os formatos DASH H.264.
General Settings:
Region for Trending: A região de tendências permite que você escolha os vídeos
em alta do país que deseja exibir.

View File

@ -381,7 +381,6 @@ Settings:
por cima do reprodutor
Enter Fullscreen on Display Rotate: Ativar modo de ecrã completo ao rodar o ecrã
Skip by Scrolling Over Video Player: Ignorar ao deslocar por cima do reprodutor
Allow DASH AV1 formats: Permitir formatos DASH AV1
Privacy Settings:
Privacy Settings: Configurações de privacidade
Remember History: Memorizar histórico
@ -776,11 +775,6 @@ Video:
Download Video: Descarregar vídeo
video only: apenas vídeo
audio only: apenas áudio
Audio:
Low: Baixa
Medium: Média
High: Alta
Best: Melhor
Published:
Jan: jan
Feb: fev
@ -821,7 +815,6 @@ Video:
Reverse Playlist: Inverter lista de reprodução
Shuffle Playlist: Baralhar lista de reprodução
Loop Playlist: Repetir lista de reprodução
translated from English: traduzido do inglês
External Player:
Unsupported Actions:
looping playlists: repetir lista de reprodução
@ -846,19 +839,6 @@ Video:
sponsor: Patrocinador
recap: Recapitular
filler: Preenchimento
Skipped segment: Secção ignorada
Stats:
Mimetype: Tipo mime
Video statistics are not available for legacy videos: As estatísticas de vídeo
não estão disponíveis para vídeos mais antigos
Resolution: Resolução
Video ID: ID do vídeo
Volume: Volume
Bandwidth: Largura de banda
Buffered: Em memória
Bitrate: Taxa de dados
Dropped / Total Frames: Fotogramas perdidos/total de fotogramas
Player Dimensions: Dimensões do reprodutor
Premieres on: Estreia a
Premieres: Estreias
Show Super Chat Comment: Mostrar comentário do Super Chat
@ -986,10 +966,6 @@ Tooltips:
padrão (1 a não ser que tenha sido alterada nas configurações).
Skip by Scrolling Over Video Player: Utilizar roda do rato para ignorar vídeo,
estilo MPV.
Allow DASH AV1 formats: Os formatos DASH AV1 podem parecer melhores do que os
formatos DASH H.264. Os formatos DASH AV1 requerem mais potência para reprodução!
Eles não estão disponíveis em todos os vídeos e, nesses casos, o reprodutor
usará os formatos DASH H.264.
Subscription Settings:
Fetch Feeds from RSS: Se ativa, FreeTube irá obter as subscrições através de RSS
em vez do método normal. O formato RSS é mais rápido e não é bloqueado pelo

View File

@ -391,7 +391,6 @@ Settings:
Ask Path: Perguntar onde guardar
Enter Fullscreen on Display Rotate: Ativar modo de ecrã completo ao rodar o ecrã
Skip by Scrolling Over Video Player: Ignorar ao deslocar por cima do reprodutor
Allow DASH AV1 formats: Permitir formatos DASH AV1
Privacy Settings:
Privacy Settings: 'Configurações de privacidade'
Remember History: 'Memorizar histórico'
@ -901,15 +900,8 @@ Video:
sponsor: Patrocinador
recap: Recapitular
filler: Preenchimento
Skipped segment: Secção ignorada
translated from English: traduzido do inglês
Started streaming on: Emissão iniciada em
Streamed on: Emitida a
Audio:
Best: Melhor
High: Alta
Medium: Média
Low: Baixa
audio only: apenas áudio
video only: apenas vídeo
Download Video: Descarregar vídeo
@ -921,26 +913,6 @@ Video:
Video has been saved: O vídeo foi guardado
Save Video: Guardar vídeo
Premieres on: Estreia a
Stats:
video id: Video ID (YouTube)
volume: Volume
fps: FPS
frame drop: Fotogramas ignorados
bandwidth: Velocidade da conexão
out of: de
player resolution: Janela de visualização
buffered: Buffered
Mimetype: Tipo mime
Video ID: ID do vídeo
Player Dimensions: Dimensões do reprodutor
Bitrate: Taxa de dados
Volume: Volume
Video statistics are not available for legacy videos: As estatísticas de vídeo
não estão disponíveis para vídeos mais antigos
Resolution: Resolução
Bandwidth: Largura de banda
Buffered: Em memória
Dropped / Total Frames: Fotogramas perdidos/total de fotogramas
Premieres in: Estreia em
Premieres: Estreias
Scroll to Bottom: Deslocamento para baixo
@ -1108,10 +1080,6 @@ Tooltips:
padrão (1 a não ser que tenha sido alterada nas configurações).
Skip by Scrolling Over Video Player: Utilizar roda do rato para ignorar vídeo,
estilo MPV.
Allow DASH AV1 formats: Os formatos DASH AV1 podem parecer melhores do que os
formatos DASH H.264. Os formatos DASH AV1 requerem mais potência para reprodução!
Eles não estão disponíveis em todos os vídeos e, nesses casos, o reprodutor
usará os formatos DASH H.264.
General Settings:
Region for Trending: A região permite-lhe escolher de que país virão os vídeos
na secção de tendências.

View File

@ -350,7 +350,6 @@ Settings:
de scroll
Enter Fullscreen on Display Rotate: Intrați pe ecran complet pe afișaj Rotire
Skip by Scrolling Over Video Player: Omiteți derulând peste player-ul video
Allow DASH AV1 formats: Permiteți formatele DASH AV1
Privacy Settings:
Privacy Settings: 'Setări de confidențialitate'
Remember History: 'Reține istoric'
@ -774,15 +773,8 @@ Video:
sponsor: Sponsor
recap: Recapitulare
filler: Filler
Skipped segment: Segment omis
translated from English: tradus din engleză
Started streaming on: A început să transmită pe
Streamed on: Difuzat pe
Audio:
Best: Cea mai bună
Medium: Medie
Low: Scăzută
High: Înaltă
audio only: numai audio
video only: numai video
Download Video: Descărcați video
@ -794,26 +786,6 @@ Video:
ta de salvări
Video has been saved: Videoclipul a fost salvat
Save Video: Salvați video
Stats:
video id: Identificator videoclip (YouTube)
player resolution: Fereastră de vizualizare
volume: Sonor
fps: CPS
frame drop: Aruncare cadre
bandwidth: Viteză conexiune
out of: din
buffered: Preîncărcat
Video statistics are not available for legacy videos: Statisticile videoclipurilor
nu sunt disponibile pentru videoclipurile vechi
Video ID: Video ID
Resolution: Rezoluție
Player Dimensions: Dimensiunile player-ului
Bitrate: Rată de biți
Volume: Volum
Bandwidth: Lățime de bandă
Buffered: Încărcat
Dropped / Total Frames: Cadre pierdute / totale
Mimetype: Mimetype
Premieres on: Premieră pe
Premieres in: Are premiera în
Scroll to Bottom: Derulați până jos
@ -983,10 +955,6 @@ Tooltips:
(tasta Command pe Mac) și faceți clic cu butonul stâng al mouse-ului pentru
a reveni rapid la rata de redare implicită (1x, cu excepția cazului în care
aceasta a fost modificată în setări).
Allow DASH AV1 formats: Formatele DASH AV1 pot arăta mai bine decât formatele
DASH H.264. Formatele DASH AV1 necesită mai multă putere pentru redare! Nu sunt
disponibile pe toate videoclipurile, în acele cazuri playerul va folosi în schimb
formatele DASH H.264.
Skip by Scrolling Over Video Player: Utilizați rotița de derulare pentru a trece
prin videoclip, stil MPV.
General Settings:

View File

@ -366,7 +366,6 @@ Settings:
Enter Fullscreen on Display Rotate: Входить в полноэкранный режим при повороте
дисплея
Skip by Scrolling Over Video Player: Пропустить, прокручивая видеопроигрыватель
Allow DASH AV1 formats: Разрешить форматы DASH AV1
Subscription Settings:
Subscription Settings: 'Подписки'
Hide Videos on Watch: 'Скрывать видео после просмотра'
@ -803,11 +802,6 @@ Video:
Loop Playlist: Повторять подборку
Starting soon, please refresh the page to check again: Скоро начнется, обновите
страницу, чтобы проверить ещё раз
Audio:
Best: Лучшее
High: Высокое
Medium: Среднее
Low: Низкое
audio only: только звук
video only: только видео
Download Video: Скачать видео
@ -820,7 +814,6 @@ Video:
Video has been removed from your saved list: Видео было удалено из списка сохраненных
Video has been saved: Видео было добавлено в сохраненные
Save Video: Добавить видео в сохранённые
translated from English: переведён с английского
Sponsor Block category:
music offtopic: Сегмент без музыки
interaction: Напоминание
@ -830,7 +823,6 @@ Video:
sponsor: Спонсор
recap: Краткое содержание
filler: Отвлечение
Skipped segment: Пропущенный сегмент
External Player:
Unsupported Actions:
looping playlists: повторение подборок
@ -846,26 +838,6 @@ Video:
playlist: подборка
video: видео
OpenInTemplate: Открыть в {externalPlayer}
Stats:
frame drop: Пропущенные кадры
video id: ID видео (YouTube)
player resolution: Область просмотра
volume: Громкость
bandwidth: Скорость соединения
buffered: Буферизовано
out of: из
fps: Кадровая частота
Video statistics are not available for legacy videos: Статистика видео недоступна
для устаревших видео
Video ID: Идентификатор видео
Resolution: Разрешение
Player Dimensions: Размеры проигрывателя
Bitrate: Битрейт
Volume: Громкость
Bandwidth: Пропускная способность
Dropped / Total Frames: Пропущено / Всего кадров
Mimetype: MIME-типы
Buffered: Буферизовано
Premieres on: Премьеры
Premieres in: Премьеры в
Premieres: Премьеры
@ -1077,10 +1049,6 @@ Tooltips:
не была изменена в настройках).
Skip by Scrolling Over Video Player: Используйте колесо прокрутки, чтобы пропустить
видео в стиле MPV.
Allow DASH AV1 formats: Форматы DASH AV1 могут выглядеть лучше, чем форматы DASH
H.264. Форматы DASH AV1 требуют большей производительности для воспроизведения!
Они доступны не для всех видео. Если они будут недоступны, тогда проигрыватель
будет использовать форматы DASH H.264.
External Player Settings:
Custom External Player Arguments: Любые пользовательские аргументы командной строки,
разделенные точкой с запятой (';'), которые вы хотите передать внешнему проигрывателю.

View File

@ -511,11 +511,6 @@ Video:
a znova skontrolujte
Started streaming on: Vysielanie začaté o
Streamed on: Odvysielané dňa
Audio:
Medium: Stredná
Low: Nízka
High: Vysoká
Best: Najlepšia
audio only: len zvuk
video only: len video
Download Video: Stiahnuť video
@ -538,17 +533,6 @@ Video:
outro: Záver
intro: Úvod
sponsor: Sponzor
Skipped segment: Preskočený segment
translated from English: preložené z angličtiny
Stats:
fps: Obrázky za sekundu
frame drop: Vyhodené obrázky
volume: Hlasitosť
player resolution: Výrez
out of: z
bandwidth: Rýchlosť pripojenia
video id: ID videa (YouTube)
buffered: Prednačítané
External Player:
OpenInTemplate: Otvoriť v {externalPlayer}
Unsupported Actions:

View File

@ -273,7 +273,6 @@ Settings:
File Name Label: Vzorec imena datoteke
Enter Fullscreen on Display Rotate: Pri vrtenju zaslona vstopite v celozaslonski
način
Allow DASH AV1 formats: Dovoli oblike DASH AV1
Next Video Interval: Interval do naslednjega videa
Display Play Button In Video Player: Prikaz gumba za predvajanje v video predvajalniku
Fast-Forward / Rewind Interval: Interval za hitro previjanje naprej/nazaj
@ -613,11 +612,6 @@ Video:
Published on: 'Objavljeno dne'
Publicationtemplate: '{number} {unit} nazaj'
#& Videos
Audio:
Best: Najvišja
High: Visoka
Medium: Srednja
Low: Nizka
audio only: Samo avdio
video only: Samo video
Download Video: Prenesi videoposnetek
@ -631,9 +625,6 @@ Video:
seznama
Video has been saved: Videoposnetek je bil shranjen
Save Video: Shrani videoposnetek
Stats:
Bandwidth: Pasovna širina
translated from English: prevedeno iz angleščine
Videos:
#& Sort By
Sort By:

View File

@ -278,7 +278,6 @@ Settings:
1440p: ''
4k: ''
8k: ''
Allow DASH AV1 formats: ''
Screenshot:
Enable: ''
Format Label: ''
@ -614,11 +613,6 @@ Video:
Download Video: ''
video only: ''
audio only: ''
Audio:
Low: ''
Medium: ''
High: ''
Best: ''
Published:
Jan: ''
Feb: ''
@ -652,9 +646,7 @@ Video:
Published on: ''
Streamed on: ''
Started streaming on: ''
translated from English: ''
Publicationtemplate: ''
Skipped segment: ''
Sponsor Block category:
sponsor: ''
intro: ''
@ -678,17 +670,6 @@ Video:
reversing playlists: ''
shuffling playlists: ''
looping playlists: ''
Stats:
Video statistics are not available for legacy videos: ''
Video ID: ''
Resolution: ''
Player Dimensions: ''
Bitrate: ''
Volume: ''
Bandwidth: ''
Buffered: ''
Dropped / Total Frames: ''
Mimetype: ''
#& Videos
Videos:
#& Sort By
@ -784,7 +765,6 @@ Tooltips:
Force Local Backend for Legacy Formats: ''
Proxy Videos Through Invidious: ''
Default Video Format: ''
Allow DASH AV1 formats: ''
Scroll Playback Rate Over Video Player: ''
Skip by Scrolling Over Video Player: ''
External Player Settings:

View File

@ -394,7 +394,6 @@ Settings:
Scroll Volume Over Video Player: Превуци за јачину звука преко плејера видео снимка
Skip by Scrolling Over Video Player: Прескочи превлачењем преко плејера видео
снимка
Allow DASH AV1 formats: Дозволи DASH AV1 формате
Scroll Playback Rate Over Video Player: Превуци за брзину репродукције преко плејера
видео снимка
Fast-Forward / Rewind Interval: Интервал брзог премотавања унапред/уназад
@ -821,18 +820,6 @@ Video:
Ago: Пре
Aug: Авг.
Upcoming: Предстојеће
Stats:
Video statistics are not available for legacy videos: Статистика видео снимака
није доступна за застареле видео снимке
Buffered: Баферовано
Bitrate: Брзина кадра
Volume: Волумен (партиција)
Mimetype: Mimetype
Resolution: Резолуција
Dropped / Total Frames: Испуштено / Укупно кадрова
Bandwidth: Проток
Player Dimensions: Димензије плејера
Video ID: ID видео снимка
Sponsor Block category:
interaction: Интеракција
filler: Попуњавање
@ -842,7 +829,6 @@ Video:
sponsor: Спонзор
recap: Рекапитулација
intro: Уводна анимација
translated from English: преведено са енглеског
External Player:
Unsupported Actions:
opening playlists: отварање плејлиста
@ -861,13 +847,7 @@ Video:
Live chat is enabled. Chat messages will appear here once sent.: Ћаскање уживо је
омогућено. Поруке ћаскања ће се појавити овде када буду послате.
Streamed on: Стримовано
Audio:
Medium: Средње
High: Високо
Best: Најбоље
Low: Ниско
video only: само видео снимак
Skipped segment: Прескочен сегмент
Pause on Current Video: Паузирај на тренутном видео снимку
Premieres on: Премијера на
audio only: само аудио снимак (звук)
@ -939,10 +919,6 @@ Tooltips:
чији их оригинални наслови садрже у целом FreeTube-у, искључујући само историју,
ваше плејлисте и видео снимке унутар плејлиста.
Player Settings:
Allow DASH AV1 formats: DASH AV1 формати могу изгледати боље од DASH H.264 формата.
DASH AV1 формати захтевају више снаге за репродукцију! Они нису доступни на
свим видео снимцима, у тим случајевима плејер ће уместо њих користити DASH H.264
формате.
Default Video Format: Подесите формате који се користе када се видео снимак пушта.
DASH формати могу да пуштају виши квалитет. Застарели формати су ограничени
на максимално 720p, али користе мање протока. Аудио формати су само звучни снимци.

View File

@ -310,7 +310,6 @@ Settings:
Skip by Scrolling Over Video Player: Hoppa över genom att skrolla över videospelaren
Max Video Playback Rate: Maximal uppspelningshastighet
Video Playback Rate Interval: Uppspelningshastighetsintervall
Allow DASH AV1 formats: Tillåt DASH AV1-format
Scroll Playback Rate Over Video Player: Skrolla uppspelningshastighet över videospelaren
Enter Fullscreen on Display Rotate: Fullskärm vid skärmrotation
Privacy Settings:
@ -766,11 +765,6 @@ Video:
Published on: 'Publicerad den'
Publicationtemplate: 'för {number} {unit} sedan'
#& Videos
Audio:
Best: Högsta
High: Hög
Medium: Medium
Low: Låg
audio only: endast ljud
video only: endast video
Download Video: Ladda ner video
@ -793,8 +787,6 @@ Video:
sponsor: sponsor
recap: Sammanfattning
filler: Utfyllnad
Skipped segment: Skippat segment
translated from English: översatt från Engelska
External Player:
Unsupported Actions:
shuffling playlists: blandar spellistor
@ -810,18 +802,6 @@ Video:
playlist: spellista
video: video
OpenInTemplate: Öppna i {externalPlayer}
Stats:
Video statistics are not available for legacy videos: Videostatstik är inte tillgänglig
för föråldrade videor
Dropped / Total Frames: Missade / Totalt antal bildrutor
Bitrate: Bithastighet
Volume: Volym
Resolution: Upplösning
Player Dimensions: Spelardimensioner
Video ID: Video-ID
Bandwidth: Bandbredd
Mimetype: Mimetyp
Buffered: Buffrad
Premieres on: Har premiär den
Premieres: Premiärer
Upcoming: Kommande
@ -951,9 +931,6 @@ Tooltips:
landsbegränsningar.
Skip by Scrolling Over Video Player: Använd skrollhjulet för att snappspola igenom
videon, MPV-stil.
Allow DASH AV1 formats: DASH AV1-format kan se bättre ut än DASH H.264-format.
DASH AV1-format kräver mer kraft för uppspelning! Det är inte tillgängligt för
alla videor, i de fall kommer spelaren använde DASh H.264-format istället.
Scroll Playback Rate Over Video Player: När muspekaren är över videon, håll nere
CTRL (Kommandotangenten på Mac) och skrolla upp och ner för att ändra uppspelningshastigheten.
Håll nere CTRL (Kommandotangenten på Mac) och vänsterklicka för att återställa

View File

@ -396,7 +396,6 @@ Settings:
veya "/" kullanabilirsiniz.
Enter Fullscreen on Display Rotate: Ekran Döndürüldüğünde Tam Ekrana Geç
Skip by Scrolling Over Video Player: Video Oynatıcı Üzerinde Kaydırarak Atla
Allow DASH AV1 formats: DASH AV1 biçimlerine izin ver
Privacy Settings:
Privacy Settings: 'Gizlilik Ayarları'
Remember History: 'Geçmişi Hatırla'
@ -886,11 +885,6 @@ Video:
Published on: 'Yayımlanma tarihi'
Publicationtemplate: '{number} {unit} önce'
#& Videos
Audio:
Best: En iyi
High: Yüksek
Medium: Orta
Low: Düşük
audio only: yalnızca ses
video only: yalnızca video
Download Video: Video İndir
@ -903,7 +897,6 @@ Video:
Video has been removed from your saved list: Video, kaydedilen listenizden kaldırıldı
Video has been saved: Video kaydedildi
Save Video: Videoyu Kaydet
translated from English: İngilizceden çevrildi
Sponsor Block category:
music offtopic: Müzik Konu Dışı
interaction: Etkileşim
@ -913,7 +906,6 @@ Video:
sponsor: Sponsor
recap: Özet
filler: Dolgu
Skipped segment: Atlanan bölüm
External Player:
Unsupported Actions:
looping playlists: oynatma listelerini döngüye alma
@ -930,26 +922,6 @@ Video:
video: video
OpenInTemplate: '{externalPlayer} içinde aç'
Premieres on: İlk gösterim tarihi
Stats:
volume: Ses Seviyesi
out of: /
player resolution: Görüntü Penceresi
fps: FPS
frame drop: Çerçeve Kaybı
video id: Video Kimliği (YouTube)
bandwidth: Bağlantı Hızı
buffered: Arabelleğe Alınan
Video ID: Video Kimliği
Resolution: Çözünürlük
Player Dimensions: Oynatıcı Boyutları
Bitrate: Bit Hızı
Volume: Ses Seviyesi
Bandwidth: Bant Genişliği
Buffered: Arabelleğe Alınan
Dropped / Total Frames: Düşürülen / Toplam Çerçeve Sayısı
Mimetype: MIME Türü
Video statistics are not available for legacy videos: Video istatistikleri eski
videolar için kullanılabilir değil
Premieres in: İlk gösterim
Premieres: İlk gösterim
Scroll to Bottom: Aşağıya Kaydır
@ -1096,9 +1068,6 @@ Tooltips:
için Ctrl tuşunu (Mac'te Komut tuşu) basılı tutun ve fareye sol tıklayın.
Skip by Scrolling Over Video Player: MPV'deki gibi videoda atlamak için kaydırma
tekerleğini kullanın.
Allow DASH AV1 formats: DASH AV1 biçimleri, DASH H.264 biçimlerinden daha iyi
görünebilir. DASH AV1 biçimleri oynatmak daha fazla güç gerektirir! Tüm videolarda
bulunmazlar, bu durumlarda oynatıcı bunun yerine DASH H.264 biçimlerini kullanacaktır.
General Settings:
Invidious Instance: FreeTube'un API çağrıları için bağlanacağı Invidious örneği.
Thumbnail Preference: FreeTube'daki tüm önizleme görselleri, öntanımlı önizleme

View File

@ -322,7 +322,6 @@ Settings:
Enter Fullscreen on Display Rotate: Переходити в повноекранний режим за обертання
екрана
Skip by Scrolling Over Video Player: Пропустити гортанням відеопрогравача
Allow DASH AV1 formats: Дозволити формат DASH AV1
Privacy Settings:
Privacy Settings: 'Налаштування приватності'
Remember History: 'Збрігати історію'
@ -689,11 +688,6 @@ Video:
Download Video: 'Завантажити відео'
video only: 'лише відео'
audio only: 'лише звук'
Audio:
Low: 'Низька'
Medium: 'Середня'
High: 'Висока'
Best: 'Найкраща'
Published:
Jan: 'Ян'
Feb: 'Лют'
@ -733,7 +727,6 @@ Video:
Video has been removed from your saved list: Відео вилучено зі списку збережених
Video has been saved: Відео збережено
Save Video: Зберегти відео
translated from English: перекладено з англійської
Sponsor Block category:
music offtopic: Музика поза темою
interaction: Взаємодія
@ -743,7 +736,6 @@ Video:
sponsor: Спонсор
recap: Підсумок
filler: Заповнювач
Skipped segment: Пропущений відтинок
External Player:
Unsupported Actions:
looping playlists: зациклювання добірок
@ -760,26 +752,6 @@ Video:
video: відео
OpenInTemplate: Відкрити у {externalPlayer}
Premieres on: Прем'єри
Stats:
player resolution: Вікно перегляду
fps: Кадрів/с
volume: Обсяг
bandwidth: Швидкість з'єднання
buffered: Буферизовано
out of: з
video id: ID відео (YouTube)
frame drop: Пропущені кадри
Resolution: Роздільність
Volume: Обсяг
Bandwidth: Пропускна здатність
Dropped / Total Frames: Пропущені / Усього кадрів
Mimetype: Тип MIME
Bitrate: Бітрейт
Video ID: ID відео
Player Dimensions: Розміри програвача
Buffered: Буферизовано
Video statistics are not available for legacy videos: Статистика відео недоступна
для застарілих відео
Premieres in: Прем'єри в
Premieres: Прем'єри
Scroll to Bottom: Прокрутити до кінця
@ -906,10 +878,6 @@ Tooltips:
в налаштуваннях).
Skip by Scrolling Over Video Player: Використовувати колесо прокрутки для прокручування
відео в стилі MPV.
Allow DASH AV1 formats: Формати DASH AV1 можуть виглядати краще, ніж формати DASH
H.264. Формати DASH AV1 вимагають більше енергії для відтворення! Вони доступні
не для всіх відео, у таких випадках програвач буде використовувати формати DASH
H.264.
Subscription Settings:
Fetch Feeds from RSS: 'Якщо ввімкнено, FreeTube використовуватиме RSS замість
стандартного способу захоплення каналу підписки. RSS швидше і запобігає блокуванню

View File

@ -382,7 +382,6 @@ Settings:
Video Playback Rate Interval: Khoảng cách tốc độ phát
Enter Fullscreen on Display Rotate: Bật toàn màn hình khi xoay
Skip by Scrolling Over Video Player: Tua video bằng con lăn chuột
Allow DASH AV1 formats: Cho phép định dạng DASH AV1
Subscription Settings:
Subscription Settings: 'Cài đặt đăng ký'
Hide Videos on Watch: 'Ẩn video khi đã xem'
@ -806,11 +805,6 @@ Video:
Video has been marked as watched: Video đánh dấu đã xem
Remove From History: Xóa khỏi lịch sử
Mark As Watched: Đánh dấu đã xem
Audio:
Best: Tốt nhất
High: Cao
Medium: Trung bình
Low: Thấp
audio only: Chỉ âm thanh
video only: Chỉ video
Download Video: Tải video
@ -824,7 +818,6 @@ Video:
Loop Playlist: Lặp lại Playlist
Open Channel in YouTube: Mở kênh này trên YouTube
Copy YouTube Channel Link: Sao chép liên kết của kênh
Skipped segment: Phân đoạn đã bỏ qua
Sponsor Block category:
sponsor: Nhà tài trợ
intro: Giới thiệu
@ -834,22 +827,9 @@ Video:
outro: Kết thúc
recap: Tóm tắt
filler: Bộ lọc
Stats:
Resolution: Độ phân giải
Player Dimensions: Khối lượng phát
Bandwidth: Băng thông
Buffered: Đệm
Video ID: Video
Video statistics are not available for legacy videos: Số liệu thống kê video không
có sẵn cho các video tiếp nôi
Mimetype: Mimetype
Dropped / Total Frames: Bị drop / tống số khung hình
Bitrate: Tốc độ Bitrate
Volume: Volume
Premieres on: Công chiếu vào lúc
Streamed on: Phát trực tiếp vào lúc
Started streaming on: Bắt đầu.phát trực tiếp vào lúc
translated from English: Được dịch từ tiếng Anh
External Player:
playlist: danh sách phát
Unsupported Actions:
@ -1083,10 +1063,6 @@ Tooltips:
được thay đổi trong cài đặt).
Skip by Scrolling Over Video Player: Sử dụng con lăn chuột để bỏ qua video, kiểu
MPV.
Allow DASH AV1 formats: Định dạng DASH AV1 có thể trông đẹp hơn định dạng DASH
H.264. Định dạng DASH AV1 yêu cầu nhiều năng lượng hơn để phát lại! Chúng không
có sẵn trên tất cả các video, trong những trường hợp đó trình phát sẽ sử dụng
định dạng DASH H.264 thay thế.
External Player Settings:
Custom External Player Arguments: Bất kỳ tham số dòng lệnh tùy chỉnh nào, được
phân tách bằng dấu chấm phẩy (';'), bạn muốn được chuyển đến trình phát bên

View File

@ -353,7 +353,6 @@ Settings:
Folder Label: 截屏文件夹
Enter Fullscreen on Display Rotate: 屏幕旋转时进入全屏
Skip by Scrolling Over Video Player: 从视频播放器一侧滚动到另一侧来跳过视频
Allow DASH AV1 formats: 允许 DASH AV1 格式
Subscription Settings:
Subscription Settings: '订阅设置'
Hide Videos on Watch: '观看时隐藏视频'
@ -736,11 +735,6 @@ Video:
Shuffle Playlist: 随机播放列表
Loop Playlist: 循环播放列表
Starting soon, please refresh the page to check again: 即将开始,请刷新页面再次检查
Audio:
Best: 最佳
High:
Medium:
Low:
audio only: 仅音频
video only: 仅视频
Download Video: 下载视频
@ -753,25 +747,6 @@ Video:
Video has been removed from your saved list: 视频已从你的播放列表移除
Video has been saved: 视频已保存
Save Video: 保存视频到播放列表
Stats:
video id: 视频 ID (YouTube)
player resolution: 视区
volume: 音量
fps: 每秒帧数
out of: 中的
frame drop: 掉帧
bandwidth: 连接速度
buffered: 缓冲
Video ID: 视频 ID
Resolution: 分辨率
Player Dimensions: 播放器尺寸
Bitrate: 比特率
Volume: 音量
Buffered: 已缓冲
Dropped / Total Frames: 丢弃帧/总帧数
Mimetype: 互联网媒体类型
Bandwidth: 带宽
Video statistics are not available for legacy videos: 视频统计数据对于 legacy 视频不可用
External Player:
OpenInTemplate: 在 {externalPlayer} 中打开
video: 视频
@ -797,8 +772,6 @@ Video:
sponsor: 赞助者
recap: 回顾
filler: 过滤器
translated from English: 从英语翻译而来
Skipped segment: 跳过片段
Premieres in: 首映于
Premieres: 首映
Scroll to Bottom: 滚动到底部
@ -970,8 +943,6 @@ Tooltips:
Scroll Playback Rate Over Video Player: 当光标位于视频上方时,按住 Control 键(Mac 上的 Command
键),前后滚动鼠标滚轮,控制播放速度。按住 Control 键(Mac 上的 Command 键),左键点击鼠标快速返回到默认播放速率(1x除非在设置中改变了数值)。
Skip by Scrolling Over Video Player: 使用滚轮跳过视频MPV 风格。
Allow DASH AV1 formats: DASH AV1 格式画质也许比 DASH H.264 格式要好。 但请注意 DASH AV1 格式耗电更多!不是所有视频都有
DASH AV1 格式,如果没有的话,播放器会使用 DASH H.264 格式。
General Settings:
Invidious Instance: FreeTube 要连接到哪个 Invidious 实例进行 API 调用。
Thumbnail Preference: FreeTube中所有缩略图都会被替换为影片画面而非默认缩略图。

View File

@ -355,7 +355,6 @@ Settings:
或 "/" 來建立子資料夾。
Enter Fullscreen on Display Rotate: 在顯示旋轉時進入全螢幕
Skip by Scrolling Over Video Player: 捲動影片播放器跳過
Allow DASH AV1 formats: 允許 DASH AV1 格式
Subscription Settings:
Subscription Settings: '訂閱設定'
Hide Videos on Watch: '觀看時隱藏影片'
@ -746,11 +745,6 @@ Video:
Shuffle Playlist: 隨機播放清單
Loop Playlist: 循環播放清單
Starting soon, please refresh the page to check again: 影片即將開始,請重新整理頁面以再次檢查是否有更新
Audio:
Best: 最佳
High:
Medium:
Low:
audio only: 僅音訊
video only: 僅影片
Download Video: 下載影片
@ -763,7 +757,6 @@ Video:
Video has been removed from your saved list: 影片已從您的播放清單移除
Video has been saved: 影片已儲存
Save Video: 儲存影片至播放清單
translated from English: 從英文翻譯
Sponsor Block category:
music offtopic: 音樂離題
interaction: 互動
@ -773,7 +766,6 @@ Video:
sponsor: 贊助商
recap: 回顧
filler: 填充
Skipped segment: 已跳過的片段
External Player:
Unsupported Actions:
looping playlists: 循環播放清單
@ -789,25 +781,6 @@ Video:
video: 視訊
OpenInTemplate: 在 {externalPlayer} 中開啟
Premieres on: 首映日期
Stats:
buffered: 已緩衝
out of: 中的
video id: Video ID (YouTube)
volume: 音量
player resolution: 視野
fps: FPS
frame drop: 丟棄畫面
bandwidth: 連線速度
Resolution: 解析度
Player Dimensions: 播放器大小
Bitrate: 位元率
Volume: 音量
Bandwidth: 頻寬
Buffered: 已緩衝
Dropped / Total Frames: 丟棄/總畫面數
Video statistics are not available for legacy videos: 影片統計資料不適用於舊版影片
Video ID: 影片 ID
Mimetype: 多媒體類型
Premieres in: 首映於
Premieres: 首映
Show Super Chat Comment: 顯示超級聊天留言
@ -980,8 +953,6 @@ Tooltips:
Scroll Playback Rate Over Video Player: 當游標停在影片上時,按住 Ctrl 鍵Mac 的話則是 Command 鍵),然後向前或向後滾動滑鼠滾輪來控制播放速度。按住
Ctrl 鍵Mac 的話則是 Command 鍵並點擊滑鼠左鍵以快速回到預設的播放速度1x除非在設定中更改
Skip by Scrolling Over Video Player: 使用滾輪跳過影片MPV 風格。
Allow DASH AV1 formats: DASH AV1 格式可能會看起來比 DASH H.264 格式更好。DASH AV1 格式需要更大的功率來播放!且並非所有影片都提供,在這種情況下,播放程式會使用
DASH H.264 格式代替。
General Settings:
Invidious Instance: FreeTube 將連線到 Invidious 站台進行 API 呼叫。
Thumbnail Preference: FreeTube 中所有縮圖都會被替換為影片畫面而非預設縮圖。

521
yarn.lock
View File

@ -1049,13 +1049,6 @@
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.4":
version "7.17.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.14.0":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e"
@ -1063,6 +1056,13 @@
dependencies:
regenerator-runtime "^0.14.0"
"@babel/runtime@^7.8.4":
version "7.17.9"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.9.tgz#d19fbf802d01a8cb6cf053a64e472d42c434ba72"
integrity sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/template@^7.18.6", "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.24.0":
version "7.24.0"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50"
@ -1545,13 +1545,6 @@
localforage "^1.9.0"
util "^0.12.4"
"@silvermine/videojs-quality-selector@^1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@silvermine/videojs-quality-selector/-/videojs-quality-selector-1.3.1.tgz#23307dd3d5be442f7aa127c01820f16a3d9476a3"
integrity sha512-uo6gs2HVG2TD0bpZAl0AT6RkDXzk9PnAxtmmW5zXexa2uJvkdFT64QvJoMlEUd2FUUwqYqqAuWGFDJdBh5+KcQ==
dependencies:
underscore "1.13.1"
"@sinclair/typebox@^0.27.8":
version "0.27.8"
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
@ -1877,38 +1870,6 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
"@videojs/http-streaming@2.16.2":
version "2.16.2"
resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-2.16.2.tgz#a9be925b4e368a41dbd67d49c4f566715169b84b"
integrity sha512-etPTUdCFu7gUWc+1XcbiPr+lrhOcBu3rV5OL1M+3PDW89zskScAkkcdqYzP4pFodBPye/ydamQoTDScOnElw5A==
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/vhs-utils" "3.0.5"
aes-decrypter "3.1.3"
global "^4.4.0"
m3u8-parser "4.8.0"
mpd-parser "^0.22.1"
mux.js "6.0.1"
video.js "^6 || ^7"
"@videojs/vhs-utils@3.0.5", "@videojs/vhs-utils@^3.0.4", "@videojs/vhs-utils@^3.0.5":
version "3.0.5"
resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz#665ba70d78258ba1ab977364e2fe9f4d4799c46c"
integrity sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==
dependencies:
"@babel/runtime" "^7.12.5"
global "^4.4.0"
url-toolkit "^2.2.1"
"@videojs/xhr@2.6.0":
version "2.6.0"
resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.6.0.tgz#cd897e0ad54faf497961bcce3fa16dc15a26bb80"
integrity sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==
dependencies:
"@babel/runtime" "^7.5.5"
global "~4.4.0"
is-function "^1.0.1"
"@vue/compiler-sfc@2.7.16":
version "2.7.16"
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz#ff81711a0fac9c68683d8bb00b63f857de77dc83"
@ -2072,11 +2033,6 @@
resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e"
integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==
"@xmldom/xmldom@^0.8.3":
version "0.8.6"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440"
integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg==
"@xmldom/xmldom@^0.8.8":
version "0.8.10"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99"
@ -2115,16 +2071,6 @@ acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0, acorn@^8.8.2, acorn@^8.9.0:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
aes-decrypter@3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-3.1.3.tgz#65ff5f2175324d80c41083b0e135d1464b12ac35"
integrity sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/vhs-utils" "^3.0.5"
global "^4.4.0"
pkcs7 "^1.0.4"
agent-base@6:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@ -2151,7 +2097,7 @@ ajv-keywords@^5.1.0:
dependencies:
fast-deep-equal "^3.1.3"
ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
ajv@^6.10.0, ajv@^6.12.0, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
@ -2336,14 +2282,7 @@ arraybuffer.prototype.slice@^1.0.2:
is-array-buffer "^3.0.2"
is-shared-array-buffer "^1.0.2"
asn1@~0.2.3:
version "0.2.6"
resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
dependencies:
safer-buffer "~2.1.0"
assert-plus@1.0.0, assert-plus@^1.0.0:
assert-plus@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
@ -2385,16 +2324,6 @@ available-typed-arrays@^1.0.5:
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
aws4@^1.8.0:
version "1.11.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
babel-loader@^9.1.3:
version "9.1.3"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.3.tgz#3d0e01b4e69760cc694ee306fe16d358aa1c6f9a"
@ -2447,13 +2376,6 @@ batch@0.6.1:
resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
dependencies:
tweetnacl "^0.14.3"
big-integer@^1.6.44:
version "1.6.51"
resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
@ -2721,11 +2643,6 @@ caniuse-lite@^1.0.30001587:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz#93a3ee17a35aa6a9f0c6ef1b2ab49507d1ab9079"
integrity sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@^2.4.1, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@ -2864,7 +2781,7 @@ colorette@^2.0.10, colorette@^2.0.14:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@ -3193,13 +3110,6 @@ csstype@^3.1.0:
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
dependencies:
assert-plus "^1.0.0"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -3425,11 +3335,6 @@ dom-serializer@^2.0.0:
domhandler "^5.0.2"
entities "^4.2.0"
dom-walk@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
@ -3490,14 +3395,6 @@ eastasianwidth@^0.2.0:
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
dependencies:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -3582,6 +3479,11 @@ electron@^29.3.0:
"@types/node" "^20.9.0"
extract-zip "^2.0.1"
eme-encryption-scheme-polyfill@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/eme-encryption-scheme-polyfill/-/eme-encryption-scheme-polyfill-2.1.1.tgz#91c823ed584e8ec5a9f03a6a676def8f80c57a4c"
integrity sha512-njD17wcUrbqCj0ArpLu5zWXtaiupHb/2fIUQGdInf83GlI+Q6mmqaPGLdrke4savKAu15J/z1Tg/ivDgl14g0g==
emoji-regex@^10.0.0:
version "10.2.1"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.2.1.tgz#a41c330d957191efd3d9dfe6e1e8e1e9ab048b3f"
@ -4194,11 +4096,6 @@ ext-name@^5.0.0:
ext-list "^2.0.0"
sort-keys-length "^1.0.0"
extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
extract-zip@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
@ -4210,11 +4107,6 @@ extract-zip@^2.0.1:
optionalDependencies:
"@types/yauzl" "^2.9.1"
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
@ -4397,11 +4289,6 @@ foreground-child@^3.1.0:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
form-data@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
@ -4411,15 +4298,6 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
form-data@~2.3.2:
version "2.3.3"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.6"
mime-types "^2.1.12"
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@ -4585,13 +4463,6 @@ get-tsconfig@^4.7.0:
dependencies:
resolve-pkg-maps "^1.0.0"
getpass@^0.1.1:
version "0.1.7"
resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
dependencies:
assert-plus "^1.0.0"
glob-parent@^5.1.2, glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@ -4673,14 +4544,6 @@ global-prefix@^3.0.0:
kind-of "^6.0.2"
which "^1.3.1"
global@^4.3.1, global@^4.3.2, global@^4.4.0, global@~4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
dependencies:
min-document "^2.19.0"
process "^0.11.10"
globals@^11.1.0:
version "11.12.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@ -4773,19 +4636,6 @@ handle-thing@^2.0.0:
resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
har-schema@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
har-validator@~5.1.3:
version "5.1.5"
resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
dependencies:
ajv "^6.12.3"
har-schema "^2.0.0"
has-bigints@^1.0.1, has-bigints@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
@ -4980,15 +4830,6 @@ http-proxy@^1.18.1:
follow-redirects "^1.0.0"
requires-port "^1.0.0"
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
dependencies:
assert-plus "^1.0.0"
jsprim "^1.2.2"
sshpk "^1.7.0"
http2-wrapper@^1.0.0-beta.5.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
@ -5088,11 +4929,6 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
individual@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
@ -5260,11 +5096,6 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
is-function@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
is-generator-function@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72"
@ -5410,11 +5241,6 @@ is-typed-array@^1.1.3, is-typed-array@^1.1.9:
for-each "^0.3.3"
has-tostringtag "^1.0.0"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@ -5466,11 +5292,6 @@ isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
jackspeak@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
@ -5540,11 +5361,6 @@ js-yaml@^4.0.0, js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
jsesc@^2.5.1:
version "2.5.2"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
@ -5592,17 +5408,12 @@ json-schema-traverse@^1.0.0:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
json-schema@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
json-stringify-safe@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
@ -5645,21 +5456,6 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
dependencies:
assert-plus "1.0.0"
extsprintf "1.3.0"
json-schema "0.4.0"
verror "1.10.0"
keycode@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff"
integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==
keyv@^4.0.0:
version "4.5.2"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56"
@ -5902,15 +5698,6 @@ lru-cache@^6.0.0:
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a"
integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==
m3u8-parser@4.8.0:
version "4.8.0"
resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.8.0.tgz#4a2d591fdf6f2579d12a327081198df8af83083d"
integrity sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/vhs-utils" "^3.0.5"
global "^4.4.0"
marked@^12.0.1:
version "12.0.1"
resolved "https://registry.yarnpkg.com/marked/-/marked-12.0.1.tgz#8ab1eb15560c7cbe3b011074845d7ca6c4d392b0"
@ -6000,7 +5787,7 @@ mime-db@1.52.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
@ -6037,13 +5824,6 @@ mimic-response@^3.1.0:
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
dependencies:
dom-walk "^0.1.0"
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@ -6123,16 +5903,6 @@ modify-filename@^1.1.0:
resolved "https://registry.yarnpkg.com/modify-filename/-/modify-filename-1.1.0.tgz#9a2dec83806fbb2d975f22beec859ca26b393aa1"
integrity sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=
mpd-parser@0.22.1, mpd-parser@^0.22.1:
version "0.22.1"
resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-0.22.1.tgz#bc2bf7d3e56368e4b0121035b055675401871521"
integrity sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/vhs-utils" "^3.0.5"
"@xmldom/xmldom" "^0.8.3"
global "^4.4.0"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@ -6156,14 +5926,6 @@ multicast-dns@^7.2.5:
dns-packet "^5.2.2"
thunky "^1.0.2"
mux.js@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-6.0.1.tgz#65ce0f7a961d56c006829d024d772902d28c7755"
integrity sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==
dependencies:
"@babel/runtime" "^7.11.2"
global "^4.4.0"
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
@ -6268,11 +6030,6 @@ nth-check@^2.0.1, nth-check@^2.1.1:
dependencies:
boolbase "^1.0.0"
oauth-sign@~0.9.0:
version "0.9.0"
resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
object-inspect@^1.12.0, object-inspect@^1.9.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
@ -6608,11 +6365,6 @@ pend@~1.2.0:
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
picocolors@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
@ -6638,13 +6390,6 @@ pify@^3.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pkcs7@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb"
integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==
dependencies:
"@babel/runtime" "^7.5.5"
pkg-dir@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
@ -7016,11 +6761,6 @@ pseudomap@^1.0.2:
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@ -7029,7 +6769,7 @@ pump@^3.0.0:
end-of-stream "^1.1.0"
once "^1.3.1"
punycode@^2.1.0, punycode@^2.1.1:
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
@ -7048,11 +6788,6 @@ qs@6.11.0:
dependencies:
side-channel "^1.0.4"
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@ -7286,32 +7021,6 @@ renderkid@^3.0.0:
lodash "^4.17.21"
strip-ansi "^6.0.1"
request@^2.88.2:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
dependencies:
aws-sign2 "~0.7.0"
aws4 "^1.8.0"
caseless "~0.12.0"
combined-stream "~1.0.6"
extend "~3.0.2"
forever-agent "~0.6.1"
form-data "~2.3.2"
har-validator "~5.1.3"
http-signature "~1.2.0"
is-typedarray "~1.0.0"
isstream "~0.1.2"
json-stringify-safe "~5.0.1"
mime-types "~2.1.19"
oauth-sign "~0.9.0"
performance-now "^2.1.0"
qs "~6.5.2"
safe-buffer "^5.1.2"
tough-cookie "~2.5.0"
tunnel-agent "^0.6.0"
uuid "^3.3.2"
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
@ -7430,13 +7139,6 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
rust-result@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
dependencies:
individual "^2.0.0"
safe-array-concat@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
@ -7452,18 +7154,11 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-json-parse@4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
dependencies:
rust-result "^1.0.0"
safe-regex-test@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
@ -7473,7 +7168,7 @@ safe-regex-test@^1.0.0:
get-intrinsic "^1.1.3"
is-regex "^1.1.4"
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@ -7645,6 +7340,13 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
shaka-player@^4.7.13:
version "4.7.13"
resolved "https://registry.yarnpkg.com/shaka-player/-/shaka-player-4.7.13.tgz#bdfb5b7a1b439d3163f11666a99fb6c2396258d0"
integrity sha512-PTU0lTEx1C8LdyNdZSSTea3Wf1/WT4KJzp6o07CofZqq8fzrGDiWElbir+LQIH1CTZpicO1otJQ24xjPgXz9kg==
dependencies:
eme-encryption-scheme-polyfill "^2.1.1"
shallow-clone@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
@ -7840,21 +7542,6 @@ sprintf-js@^1.1.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
sshpk@^1.7.0:
version "1.17.0"
resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
bcrypt-pbkdf "^1.0.0"
dashdash "^1.12.0"
ecc-jsbn "~0.1.1"
getpass "^0.1.1"
jsbn "~0.1.0"
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
stat-mode@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-1.0.0.tgz#68b55cb61ea639ff57136f36b216a291800d1465"
@ -7870,7 +7557,16 @@ statuses@2.0.1:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -7956,7 +7652,14 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -8285,14 +7988,6 @@ toidentifier@1.0.1:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
dependencies:
psl "^1.1.28"
punycode "^2.1.1"
tree-kill@1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
@ -8320,18 +8015,6 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.5.0, tslib@^2.6
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae"
integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
dependencies:
safe-buffer "^5.0.1"
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
type-check@^0.4.0, type-check@~0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
@ -8421,11 +8104,6 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
underscore@1.13.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.1.tgz#0c1c6bd2df54b6b69f2314066d65b6cde6fcf9d1"
integrity sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==
undici-types@~5.26.4:
version "5.26.5"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
@ -8514,11 +8192,6 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
url-toolkit@^2.2.1:
version "2.2.5"
resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.5.tgz#58406b18e12c58803e14624df5e374f638b0f607"
integrity sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==
utf8-byte-length@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
@ -8558,11 +8231,6 @@ utils-merge@1.0.1:
resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
uuid@^8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
@ -8581,15 +8249,6 @@ vary@~1.1.2:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
verror@1.10.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
dependencies:
assert-plus "^1.0.0"
core-util-is "1.0.2"
extsprintf "^1.2.0"
verror@^1.10.0:
version "1.10.1"
resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.1.tgz#4bf09eeccf4563b109ed4b3d458380c972b0cdeb"
@ -8599,85 +8258,6 @@ verror@^1.10.0:
core-util-is "1.0.2"
extsprintf "^1.2.0"
video.js@7.21.5, "video.js@^6 || ^7", "video.js@^6 || ^7 || ^8", video.js@^7.0.0, "video.js@^7.2.0 || ^6.6.0":
version "7.21.5"
resolved "https://registry.yarnpkg.com/video.js/-/video.js-7.21.5.tgz#36fcbbdeded757089a10bbb78f49c360a2d0c9d4"
integrity sha512-WRq86tXZKrThA9mK+IR+v4tIQVVvnb5LhvL71fD2AX7TxVOPdaeK1X/wyuUruBqWaOG3w2sZXoMY6HF2Jlo9qA==
dependencies:
"@babel/runtime" "^7.12.5"
"@videojs/http-streaming" "2.16.2"
"@videojs/vhs-utils" "^3.0.4"
"@videojs/xhr" "2.6.0"
aes-decrypter "3.1.3"
global "^4.4.0"
keycode "^2.2.0"
m3u8-parser "4.8.0"
mpd-parser "0.22.1"
mux.js "6.0.1"
safe-json-parse "4.0.0"
videojs-font "3.2.0"
videojs-vtt.js "^0.15.5"
videojs-contrib-quality-levels@^2.0.4:
version "2.2.1"
resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.2.1.tgz#46bd7e1db25e6e45824dadf933b08f0c6ec724a1"
integrity sha512-cnF6OGGgoC/2nUrbdz54nzPm3BpEZQzMTpyekiX6AXs8imATX2sHbrUz97xXVSHITldk/+d7ZAUrdQYJJTyuug==
dependencies:
global "^4.3.2"
video.js "^6 || ^7 || ^8"
videojs-contrib-quality-levels@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-3.0.0.tgz#bc66f1333b763754b4425455bee4ef6e5ba53984"
integrity sha512-sNx38EYUx+Q+gmup1gVTv9P9/sPs28rM7gZOx1sedaHoKxEdYB+ysOGfHj6MSELBMNGMj6ZspdrpSiWguGvGxA==
dependencies:
global "^4.4.0"
videojs-font@3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232"
integrity sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==
videojs-http-source-selector@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/videojs-http-source-selector/-/videojs-http-source-selector-1.1.6.tgz#073aadbea0106ba6c98d6b611094dbf8554ffa1f"
integrity sha512-6b5MmKTT2cVnrjtdNj4z1VO91udbXkZkTYA6LlD8WN2aHlG2rqFTmtMab4NK4nlkkkbRnm3c2q2IddL3jffLmg==
dependencies:
global "^4.3.2"
video.js "^7.0.0"
videojs-contrib-quality-levels "^2.0.4"
videojs-mobile-ui@^0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/videojs-mobile-ui/-/videojs-mobile-ui-0.8.0.tgz#40a1c6f9302071b9bbe95937c934114600916ac5"
integrity sha512-Jd+u/ctjUkbZlT1cAA0umTu0LQwSZSFG+02cJxShuwq27B6rfrRALETK/gsuTc7U27lB9fbwcF7HBMaNxW62nA==
dependencies:
global "^4.4.0"
videojs-overlay@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/videojs-overlay/-/videojs-overlay-3.1.0.tgz#d57505d375eca952feeb36e5b33e0a130e3dc9e0"
integrity sha512-P863Z4ghWgf7Z4A4uzmHlqIixRb8v5220JuQ4pfb/uorbWSBCt5D+czrp/eTxXXLtSmrSUKn596QswVYZuMzPg==
dependencies:
global "^4.3.2"
video.js "^6 || ^7 || ^8"
videojs-vtt-thumbnails-freetube@0.0.15:
version "0.0.15"
resolved "https://registry.yarnpkg.com/videojs-vtt-thumbnails-freetube/-/videojs-vtt-thumbnails-freetube-0.0.15.tgz#5bbc1f98c4d4cffd5b3538e8caab36aca94c86cf"
integrity sha512-aRjG6fvsuWCpcFcdhqRbI5HUWw1l7boHRJZoQki+z74uDbys/u8OVo6S/oJgpmog//iToQEKqHjSEisFdVDQlA==
dependencies:
global "^4.4.0"
request "^2.88.2"
video.js "^7.2.0 || ^6.6.0"
videojs-vtt.js@^0.15.5:
version "0.15.5"
resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz#567776eaf2a7a928d88b148a8b401ade2406f2ca"
integrity sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==
dependencies:
global "^4.3.1"
vue-devtools@^5.1.4:
version "5.1.4"
resolved "https://registry.yarnpkg.com/vue-devtools/-/vue-devtools-5.1.4.tgz#265a7458ade2affb291739176964256b597fa302"
@ -8953,7 +8533,16 @@ wildcard@^2.0.0:
resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==