Repo created
This commit is contained in:
parent
f3a6b3a320
commit
f954c78789
614 changed files with 135712 additions and 2 deletions
134
_scripts/patchShaka.mjs
Normal file
134
_scripts/patchShaka.mjs
Normal file
|
|
@ -0,0 +1,134 @@
|
|||
// 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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue