mirror of
https://github.com/FreeTubeApp/FreeTube
synced 2024-11-23 10:21:59 +01:00
b3ff837468
* Migrate video player from video.js to shaka-player * Fix syntax error introduced during cleanup * Fix typo Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> * Show bitrate in stats for Invidious legacy formats * Sort legacy formats by bitrate instead of qualityLabel * Use Invidious' newly added isPostLiveDvr property * Invidious correctly returns the ratelimit for DASH manifests now * Properly hide unsupported screenshot functionality outside of Electron * Sort captions in data initialiser * Update shaka-player to version 4.8.1 * Use textTrackLabelFormat configuration option * Switch to manifestPreprocessorTXml * Add support for VR videos that use equirectangular projection * The AV1 video streams work okay for vr, so allow list them too * Use woff2 (169 KB) Material Icons font instead of otf (390 KB) * Use material icons for custom player elements * Fix legacy formats exception * Update shaka-player to version 4.8.3 * Sort default quality values the same as in the player * Cleanup representations search in live subtitle fix * Slightly speed up sortCaptions * Fix setPositionState error when playback rate is 0 * Update shaka-player to version 4.8.4 * Fix playback rate changes getting overridden * Fix current chapter index not updating * Fix next video not automatically playing * Fix volume changes not propagating to the mute button * Reduce work done during UI config updates * Fix UI customizations not applying after UI config changes * Update shaka-player to version 4.8.5 * Replace non-reactive workaround with a Vue 3 friendly one * Fix error when all sponsorblock segments are set to do nothing * Add some guards to hopefully reduce errors during fast naviagtions * Make SponsorBlock failure non-fatal * Update shaka-player to version 4.8.6 * Update shaka-player to version 4.8.8 * Update shaka-player to version 4.9.0 * Update shaka-player to version 4.9.1 * Minor performance improvements * Update shaka-player to version 4.9.6 * Update shaka-player to version 4.9.9 * Fix sponsor block markers not showing up * Add some basic error messages for expired urls and ratelimits * Add some basic error messages for 403s * Cleanup code comments * Migrate player to composition API for better performance * Use reactive for stats instead of ref, as it never gets reassigned * Update shaka-player to version 4.10.0 * Fix i18n import in custom player components * Add chapter markers * Move shaka-player CSS import into the Vue file * Bump mpd_version from 5 to 7 * Apply suggestions from code review Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com> * Fix seeking with the arrow keys * Update shaka-player to version 4.10.3 * Truncate long video titles to the screen width in the full screen overlay * Fix mouse scroll handlers firing multiple times * Cleanup unneeded code * Update shaka-player to version 4.10.6 * Various small optimisations * Move skipped sponsorblock segement messages to the top right corner * Support prefers-reduced-transparency in overlays * Fix stylelint errors * Update shaka-player to version 4.10.7 * Update shaka-player to version 4.10.8 * Only use variants that are predicted to play smoothly * Only set preferredDecodingAttributes for DASH playback * Implement a custom audio track selector instead of using shaka-player's * Move skipped sponsorblock segement messages to the bottom right corner * Fix scrolling over the big play pause button not working * Update shaka-player to version 4.10.9 * Fix some type issues * Add support for secondary audio tracks * Downgrade shaka-player to fix subtitle alignment * Actually downgrade shaka-player * Fix Invidious API error * Update outdated comment * Fix multiple audio track detection for Invidious * Fix duplicate qualities with the Invidious API * Use vp9 streams if the Invidious instance is running a new enough version * When an error occurs with the thumbnails just log it * Include the video ID in the error logs * Gracefully handle the internet connection disappearing during playback * Show a message while buffering if it was caused by the internet connection disappearing * Fix the text color and RTL handling * Cleanup the Invidious DASH manifest in builds without the local API * Fix quality selection when switching from audio to DASH Unfortunately shaka-player will still override the quality selections with its ABR bug. * Update shaka-player to version 4.10.10 * Fix position and alignment for auto-generated subtitles * Update shaka-player to version 4.10.11 * Use the HLS manifests for live streams The live DASH manifests are currently unusable on both API backends as they return 403s after 1 minute of playback. Unfortunately this means we lose the ability to seek and use the audio formats for live streams. * Update shaka-player to version 4.10.12 --------- Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com>
136 lines
4.5 KiB
JavaScript
136 lines
4.5 KiB
JavaScript
// 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 downloading 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 removeRobotoFont() {
|
|
let cssFileHandle
|
|
try {
|
|
cssFileHandle = openSync(`${SHAKA_DIST_DIR}/controls.css`, 'r+')
|
|
|
|
let cssContents = readFileSync(cssFileHandle, 'utf-8')
|
|
|
|
const beforeReplacement = cssContents.length
|
|
cssContents = cssContents.replace(/@font-face\{font-family:Roboto;[^}]+\}/, '')
|
|
|
|
if (cssContents.length !== beforeReplacement) {
|
|
ftruncateSync(cssFileHandle)
|
|
writeSync(cssFileHandle, cssContents, 0, 'utf-8')
|
|
|
|
console.log('Removed shaka-player Roboto font, so it uses ours')
|
|
}
|
|
} finally {
|
|
if (typeof cssFileHandle !== 'undefined') {
|
|
closeSync(cssFileHandle)
|
|
}
|
|
}
|
|
}
|
|
|
|
async function replaceAndDownloadMaterialIconsFont() {
|
|
let cssFileHandle
|
|
try {
|
|
cssFileHandle = openSync(`${SHAKA_DIST_DIR}/controls.css`, 'r+')
|
|
|
|
let cssContents = readFileSync(cssFileHandle, 'utf-8')
|
|
|
|
const fontFaceRegex = /@font-face{font-family:'Material Icons Round'[^}]+format\('opentype'\)}/
|
|
|
|
if (fontFaceRegex.test(cssContents)) {
|
|
const cssResponse = await fetch('https://fonts.googleapis.com/icon?family=Material+Icons+Round', {
|
|
headers: {
|
|
// Without the user-agent it returns the otf file instead of the woff2 one
|
|
'user-agent': 'Firefox/125.0'
|
|
}
|
|
})
|
|
|
|
const text = await cssResponse.text()
|
|
|
|
let newFontCSS = text.match(/(@font-face\s*{[^}]+})/)[1].replaceAll('\n', '')
|
|
|
|
|
|
const urlMatch = newFontCSS.match(/https:\/\/fonts\.gstatic\.com\/s\/materialiconsround\/(?<version>[^\/]+)\/[^.]+\.(?<extension>[\w]+)/)
|
|
|
|
const url = urlMatch[0]
|
|
const { version, extension } = urlMatch.groups
|
|
|
|
const fontResponse = await fetch(url)
|
|
const fontContent = new Uint8Array(await fontResponse.arrayBuffer())
|
|
|
|
const filename = `shaka-materialiconsround-${version}.${extension}`
|
|
writeFileSync(`${SHAKA_DIST_DIR}/${filename}`, fontContent)
|
|
|
|
newFontCSS = newFontCSS.replace(url, `./${filename}`)
|
|
|
|
cssContents = cssContents.replace(fontFaceRegex, newFontCSS)
|
|
|
|
ftruncateSync(cssFileHandle)
|
|
writeSync(cssFileHandle, cssContents, 0, 'utf-8')
|
|
|
|
console.log('Changed shaka-player Material Icons Rounded font to use the smaller woff2 format instead of otf')
|
|
console.log('Downloaded shaka-player Material Icons Rounded font')
|
|
}
|
|
} catch (e) {
|
|
console.error(e)
|
|
} finally {
|
|
if (typeof cssFileHandle !== 'undefined') {
|
|
closeSync(cssFileHandle)
|
|
}
|
|
}
|
|
}
|
|
|
|
fixTypes()
|
|
await removeRobotoFont()
|
|
await replaceAndDownloadMaterialIconsFont()
|