Channel Fixes and finish quality change logic

This commit is contained in:
Preston 2021-04-30 17:18:45 -04:00
parent a4416638b7
commit 689479eb21
10 changed files with 322 additions and 91 deletions

280
package-lock.json generated
View File

@ -3989,28 +3989,60 @@
} }
}, },
"@videojs/http-streaming": { "@videojs/http-streaming": {
"version": "2.2.4", "version": "2.7.1",
"resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.2.4.tgz", "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.7.1.tgz",
"integrity": "sha512-gzT46RpAEegOhMId/zZ6uXCVGDMPOv8qmoTykBuvd6/4lVM3lZ1ZJCq0kytAkisDuDKipy93gP46oZEtonlc/Q==", "integrity": "sha512-e7I5zHtTklNlBXhWnl2Nla+8hqjXzKXauAVK8cmcN0b6keqwW3WQDfAAnAzzAGf3CvxDUVudRcWGQqtNrXYjmQ==",
"requires": { "requires": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.12.5",
"@videojs/vhs-utils": "^2.2.1", "@videojs/vhs-utils": "^3.0.0",
"aes-decrypter": "3.1.0", "aes-decrypter": "3.1.2",
"global": "^4.3.2", "global": "^4.4.0",
"m3u8-parser": "4.5.0", "m3u8-parser": "4.6.0",
"mpd-parser": "0.14.0", "mpd-parser": "0.16.0",
"mux.js": "5.6.7", "mux.js": "5.11.0",
"video.js": "^6 || ^7" "video.js": "^6 || ^7"
},
"dependencies": {
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"requires": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
}
} }
}, },
"@videojs/vhs-utils": { "@videojs/vhs-utils": {
"version": "2.3.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-2.3.0.tgz", "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.0.tgz",
"integrity": "sha512-ThSmm91S7tuIJ757ON50K4y7S/bvKN4+B0tu303gCOxaG57PoP1UvPfMQZ90XGhxwNgngexVojOqbBHhTvXVHQ==", "integrity": "sha512-HPgiaVB8/g7DooYFQ20uTinq4eNRHmIXGHHttK/Xwyvn19MfIpg9BfMNr9ywCvgHh0IUGrxt6P8AcmMO4xvxIA==",
"requires": { "requires": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.12.5",
"global": "^4.3.2", "global": "^4.4.0",
"url-toolkit": "^2.1.6" "url-toolkit": "^2.2.1"
},
"dependencies": {
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"requires": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
}
} }
}, },
"@videojs/xhr": { "@videojs/xhr": {
@ -4350,14 +4382,30 @@
"dev": true "dev": true
}, },
"aes-decrypter": { "aes-decrypter": {
"version": "3.1.0", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.0.tgz", "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.2.tgz",
"integrity": "sha512-wL1NFwP2yNrJG4InpXYFhhYe9TfonnDyhyxMq2+K9/qt+SrZzUieOpviN6pkDly7GawTqw5feehk0rn5iYo00g==", "integrity": "sha512-42nRwfQuPRj9R1zqZBdoxnaAmnIFyDi0MNyTVhjdFOd8fifXKKRfwIHIZ6AMn1or4x5WONzjwRTbTWcsIQ0O4A==",
"requires": { "requires": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.12.5",
"@videojs/vhs-utils": "^2.2.1", "@videojs/vhs-utils": "^3.0.0",
"global": "^4.3.2", "global": "^4.4.0",
"pkcs7": "^1.0.4" "pkcs7": "^1.0.4"
},
"dependencies": {
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"requires": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
}
} }
}, },
"agent-base": { "agent-base": {
@ -8459,6 +8507,11 @@
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true "dev": true
}, },
"estree-walker": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
"integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
},
"esutils": { "esutils": {
"version": "2.0.3", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
@ -12335,13 +12388,29 @@
} }
}, },
"m3u8-parser": { "m3u8-parser": {
"version": "4.5.0", "version": "4.6.0",
"resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.5.0.tgz", "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.6.0.tgz",
"integrity": "sha512-RGm/1WVCX3o1bSWbJGmJUu4zTbtJy8lImtgHM4CESFvJRXYztr1j6SW/q9/ghYOrUjgH7radsIar+z1Leln0sA==", "integrity": "sha512-dKhhpMcPqDM/KzULVrNyDZ/z766peQjwUghDTcl6TE7DQKAt/vm74/IMUAxpO34f6LDpM+OH/dYGQwW1eM4yWw==",
"requires": { "requires": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.12.5",
"@videojs/vhs-utils": "^2.2.1", "@videojs/vhs-utils": "^3.0.0",
"global": "^4.3.2" "global": "^4.4.0"
},
"dependencies": {
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"requires": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
}
} }
}, },
"m3u8stream": { "m3u8stream": {
@ -12365,6 +12434,14 @@
} }
} }
}, },
"magic-string": {
"version": "0.25.7",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
"integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
"requires": {
"sourcemap-codec": "^1.4.4"
}
},
"makeerror": { "makeerror": {
"version": "1.0.11", "version": "1.0.11",
"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
@ -12644,14 +12721,35 @@
"integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE="
}, },
"mpd-parser": { "mpd-parser": {
"version": "0.14.0", "version": "0.16.0",
"resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.14.0.tgz", "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.16.0.tgz",
"integrity": "sha512-HqXQS3WLofcnYFcxv5oWdlciddUaEnN3NasXLVQ793mdnZRrinjz2Yk1DsUYPDYOUWf6ZBBqbFhaJT5LiT2ouA==", "integrity": "sha512-/pOFsDbOxXFAla47rYMdIypBZVtsQ9q3OHNuKtW2CJMaCGtNDtUcLS+B2TToYmB20rgi3XIgkyc2EsIvIAS4NA==",
"requires": { "requires": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.12.5",
"@videojs/vhs-utils": "^2.2.1", "@videojs/vhs-utils": "^3.0.0",
"global": "^4.3.2", "global": "^4.4.0",
"xmldom": "^0.1.27" "xmldom": "^0.5.0"
},
"dependencies": {
"global": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
"integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
"requires": {
"min-document": "^2.19.0",
"process": "^0.11.10"
}
},
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
},
"xmldom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz",
"integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA=="
}
} }
}, },
"ms": { "ms": {
@ -12676,9 +12774,12 @@
"dev": true "dev": true
}, },
"mux.js": { "mux.js": {
"version": "5.6.7", "version": "5.11.0",
"resolved": "https://registry.npmjs.org/mux.js/-/mux.js-5.6.7.tgz", "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-5.11.0.tgz",
"integrity": "sha512-YSr6B8MUgE4S18MptbY2XM+JKGbw9JDkgs7YkuE/T2fpDKjOhZfb/nD6vmsVxvLYOExWNaQn1UGBp6PGsnTtew==" "integrity": "sha512-Q/iLfohHh5Pp6lW7EFtcxNuaCNJ3Ruywfy46pWLsY+yIxR1kXXImYY1wOhg8jLdBMs1kRaZqsiB4Zncsiw0a2Q==",
"requires": {
"@babel/runtime": "^7.11.2"
}
}, },
"nan": { "nan": {
"version": "2.14.2", "version": "2.14.2",
@ -13902,23 +14003,37 @@
} }
}, },
"plist": { "plist": {
"version": "3.0.1", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.2.tgz",
"integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", "integrity": "sha512-MSrkwZBdQ6YapHy87/8hDU8MnIcyxBKjeF+McXnr5A9MtffPewTs7G3hlpodT5TacyfIyFTaJEhh3GGcmasTgQ==",
"dev": true, "dev": true,
"optional": true, "optional": true,
"requires": { "requires": {
"base64-js": "^1.2.3", "base64-js": "^1.5.1",
"xmlbuilder": "^9.0.7", "xmlbuilder": "^9.0.7",
"xmldom": "0.1.x" "xmldom": "^0.5.0"
}, },
"dependencies": { "dependencies": {
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"optional": true
},
"xmlbuilder": { "xmlbuilder": {
"version": "9.0.7", "version": "9.0.7",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
"dev": true, "dev": true,
"optional": true "optional": true
},
"xmldom": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz",
"integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==",
"dev": true,
"optional": true
} }
} }
}, },
@ -14780,6 +14895,23 @@
"sprintf-js": "^1.1.2" "sprintf-js": "^1.1.2"
} }
}, },
"rollup-plugin-replace": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz",
"integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==",
"requires": {
"magic-string": "^0.25.2",
"rollup-pluginutils": "^2.6.0"
}
},
"rollup-pluginutils": {
"version": "2.8.2",
"resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
"integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
"requires": {
"estree-walker": "^0.6.1"
}
},
"rss-parser": { "rss-parser": {
"version": "3.12.0", "version": "3.12.0",
"resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz", "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
@ -15575,6 +15707,11 @@
"integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
"dev": true "dev": true
}, },
"sourcemap-codec": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
},
"spdx-correct": { "spdx-correct": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
@ -16754,9 +16891,9 @@
} }
}, },
"url-toolkit": { "url-toolkit": {
"version": "2.2.1", "version": "2.2.2",
"resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.1.tgz", "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.2.tgz",
"integrity": "sha512-8+DzgrtDZYZGhHaAop5WGVghMdCfOLGbhcArsJD0qDll71FXa7EeKxi2hilPIscn2nwMz4PRjML32Sz4JTN0Xw==" "integrity": "sha512-l25w6Sy+Iy3/IbogunxhWwljPaDnqpiKvrQRoLBm6DfISco7NyRIS7Zf6+Oxhy1T8kHxWdwLND7ZZba6NjXMug=="
}, },
"use": { "use": {
"version": "3.1.1", "version": "3.1.1",
@ -16860,18 +16997,19 @@
} }
}, },
"video.js": { "video.js": {
"version": "7.10.2", "version": "7.12.1",
"resolved": "https://registry.npmjs.org/video.js/-/video.js-7.10.2.tgz", "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.12.1.tgz",
"integrity": "sha512-kJTTrqcQn2MhPzWR8zQs6W3HPJWpowO/ZGZcKt2dcJeJdJT0dEDLYtiFdjV37SylCmu66V0flRnV8cipbthveQ==", "integrity": "sha512-0Owl7q4Zbm6YHX94P9WVqQ2vnpfeNyOtTNwuTEEoKovZogoqV2McOUmsQGM4Edtg4vGTiP74Fv6HVa1V6FeRfg==",
"requires": { "requires": {
"@babel/runtime": "^7.9.2", "@babel/runtime": "^7.9.2",
"@videojs/http-streaming": "2.2.4", "@videojs/http-streaming": "2.7.1",
"@videojs/xhr": "2.5.1", "@videojs/xhr": "2.5.1",
"global": "4.3.2", "global": "4.3.2",
"keycode": "^2.2.0", "keycode": "^2.2.0",
"rollup-plugin-replace": "^2.2.0",
"safe-json-parse": "4.0.0", "safe-json-parse": "4.0.0",
"videojs-font": "3.2.0", "videojs-font": "3.2.0",
"videojs-vtt.js": "^0.15.2" "videojs-vtt.js": "^0.15.3"
} }
}, },
"videojs-abloop": { "videojs-abloop": {
@ -16880,9 +17018,9 @@
"integrity": "sha512-6/hvtB5gNQUr5FJ969UhXVg5H+3wxhOzh9AVftlezOXlhzzaWfNfiOJYqNKo01Gc/eSQOvfttrOX7jH+aHpwrw==" "integrity": "sha512-6/hvtB5gNQUr5FJ969UhXVg5H+3wxhOzh9AVftlezOXlhzzaWfNfiOJYqNKo01Gc/eSQOvfttrOX7jH+aHpwrw=="
}, },
"videojs-contrib-quality-levels": { "videojs-contrib-quality-levels": {
"version": "2.0.9", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.0.9.tgz", "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.1.0.tgz",
"integrity": "sha512-HJeaJJQdSufi9Y5T7jlyyhkeq+mWPCog86q6ypoTi66boBMMJTo2abiOSHS9KaOGAJjH72gfvrjVY5FRdjlxYA==", "integrity": "sha512-dqGQGbL9AFhucxki7Zh0c3kIhH0PAPcHEh6jUdRyaFCVeOuqnJrOYs/3wNtsokDdBdRf2Du2annpu4Z2XaSZRg==",
"requires": { "requires": {
"global": "^4.3.2", "global": "^4.3.2",
"video.js": "^6 || ^7" "video.js": "^6 || ^7"
@ -16901,6 +17039,17 @@
"global": "^4.3.2", "global": "^4.3.2",
"video.js": "^7.0.0", "video.js": "^7.0.0",
"videojs-contrib-quality-levels": "^2.0.4" "videojs-contrib-quality-levels": "^2.0.4"
},
"dependencies": {
"videojs-contrib-quality-levels": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.1.0.tgz",
"integrity": "sha512-dqGQGbL9AFhucxki7Zh0c3kIhH0PAPcHEh6jUdRyaFCVeOuqnJrOYs/3wNtsokDdBdRf2Du2annpu4Z2XaSZRg==",
"requires": {
"global": "^4.3.2",
"video.js": "^6 || ^7"
}
}
} }
}, },
"videojs-ie8": { "videojs-ie8": {
@ -17027,9 +17176,9 @@
} }
}, },
"videojs-vtt.js": { "videojs-vtt.js": {
"version": "0.15.2", "version": "0.15.3",
"resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.2.tgz", "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.3.tgz",
"integrity": "sha512-kEo4hNMvu+6KhPvVYPKwESruwhHC3oFis133LwhXHO9U7nRnx0RiJYMiqbgwjgazDEXHR6t8oGJiHM6wq5XlAw==", "integrity": "sha512-5FvVsICuMRx6Hd7H/Y9s9GDeEtYcXQWzGMS+sl4UX3t/zoHp3y+isSfIPRochnTH7h+Bh1ILyC639xy9Z6kPag==",
"requires": { "requires": {
"global": "^4.3.1" "global": "^4.3.1"
} }
@ -18226,11 +18375,6 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true "dev": true
}, },
"xmldom": {
"version": "0.1.31",
"resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz",
"integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ=="
},
"xtend": { "xtend": {
"version": "4.0.2", "version": "4.0.2",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@ -18302,9 +18446,9 @@
} }
}, },
"yt-channel-info": { "yt-channel-info": {
"version": "2.1.0", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/yt-channel-info/-/yt-channel-info-2.1.0.tgz", "resolved": "https://registry.npmjs.org/yt-channel-info/-/yt-channel-info-2.1.1.tgz",
"integrity": "sha512-e7rDJUw+GoOMojQYLG/SlD4gwXiRChmRj+tMzfLyoHUuvELZKq3bayTkepFDNls/0dLwc/vU6Xr9uAIXRGLvBw==", "integrity": "sha512-oiTSuEGCMFMpgZYYDZhxskPoUnhkFY2DukkTy90wsQdHNfAIjPsqitHYBm75rXDkL2ubLX+nogzf3ZHa9U1e6A==",
"requires": { "requires": {
"axios": "^0.21.1", "axios": "^0.21.1",
"querystring": "^0.2.0" "querystring": "^0.2.0"
@ -18319,9 +18463,9 @@
} }
}, },
"follow-redirects": { "follow-redirects": {
"version": "1.13.3", "version": "1.14.0",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.3.tgz", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz",
"integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==" "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg=="
} }
} }
}, },

View File

@ -31,9 +31,9 @@
"opml-to-json": "^1.0.1", "opml-to-json": "^1.0.1",
"rss-parser": "^3.12.0", "rss-parser": "^3.12.0",
"socks-proxy-agent": "^5.0.0", "socks-proxy-agent": "^5.0.0",
"video.js": "7.10.2", "video.js": "^7.12.1",
"videojs-abloop": "^1.2.0", "videojs-abloop": "^1.2.0",
"videojs-contrib-quality-levels": "^2.0.9", "videojs-contrib-quality-levels": "^2.1.0",
"videojs-http-source-selector": "^1.1.6", "videojs-http-source-selector": "^1.1.6",
"videojs-overlay": "^2.1.4", "videojs-overlay": "^2.1.4",
"videojs-replay": "^1.1.0", "videojs-replay": "^1.1.0",
@ -47,7 +47,7 @@
"xml2json": "^0.12.0", "xml2json": "^0.12.0",
"youtube-chat": "git+https://github.com/IcedCoffeee/youtube-chat.git", "youtube-chat": "git+https://github.com/IcedCoffeee/youtube-chat.git",
"youtube-suggest": "^1.1.2", "youtube-suggest": "^1.1.2",
"yt-channel-info": "^2.1.0", "yt-channel-info": "^2.1.1",
"yt-comment-scraper": "^4.0.1", "yt-comment-scraper": "^4.0.1",
"yt-dash-manifest-generator": "1.1.0", "yt-dash-manifest-generator": "1.1.0",
"yt-trending-scraper": "^1.1.3", "yt-trending-scraper": "^1.1.3",

View File

@ -42,6 +42,7 @@ export default Vue.extend({
isLive: false, isLive: false,
isFavorited: false, isFavorited: false,
isUpcoming: false, isUpcoming: false,
isPremium: false,
hideViews: false, hideViews: false,
optionsValues: [ optionsValues: [
'history', 'history',
@ -321,6 +322,7 @@ export default Vue.extend({
this.description = this.data.description this.description = this.data.description
this.isLive = this.data.liveNow || this.data.lengthSeconds === 'undefined' this.isLive = this.data.liveNow || this.data.lengthSeconds === 'undefined'
this.isUpcoming = this.data.isUpcoming || this.data.premiere this.isUpcoming = this.data.isUpcoming || this.data.premiere
this.isPremium = this.data.premium || false
this.viewCount = this.data.viewCount this.viewCount = this.data.viewCount
if (typeof (this.data.premiereTimestamp) !== 'undefined') { if (typeof (this.data.premiereTimestamp) !== 'undefined') {

View File

@ -74,6 +74,7 @@ export default Vue.extend({
useHls: false, useHls: false,
selectedDefaultQuality: '', selectedDefaultQuality: '',
selectedQuality: '', selectedQuality: '',
using60Fps: false,
maxFramerate: 0, maxFramerate: 0,
activeSourceList: [], activeSourceList: [],
mouseTimeout: null, mouseTimeout: null,
@ -416,7 +417,11 @@ export default Vue.extend({
} }
this.player.qualityLevels().levels_.sort((a, b) => { this.player.qualityLevels().levels_.sort((a, b) => {
return a.height - b.height if (a.height === b.height) {
return a.bitrate - b.bitrate
} else {
return a.height - b.height
}
}).forEach((ql, index, arr) => { }).forEach((ql, index, arr) => {
const height = ql.height const height = ql.height
const width = ql.width const width = ql.width
@ -427,14 +432,16 @@ export default Vue.extend({
upperLevel = arr[index + 1] upperLevel = arr[index + 1]
} }
if (this.defaultQuality === quality) { if (this.defaultQuality === quality && upperLevel === null) {
this.setDashQualityLevel(height) this.setDashQualityLevel(height, true)
} else if (upperLevel !== null) { } else if (upperLevel !== null) {
const upperHeight = upperLevel.height const upperHeight = upperLevel.height
const upperWidth = upperLevel.width const upperWidth = upperLevel.width
const upperQuality = upperWidth < upperHeight ? upperWidth : upperHeight const upperQuality = upperWidth < upperHeight ? upperWidth : upperHeight
if (this.defaultQuality >= quality && this.defaultQuality < upperQuality) { if (this.defaultQuality >= quality && this.defaultQuality === upperQuality) {
this.setDashQualityLevel(height, true)
} else if (this.defaultQuality >= quality && this.defaultQuality < upperQuality) {
this.setDashQualityLevel(height) this.setDashQualityLevel(height)
} }
} else if (index === 0 && quality > this.defaultQuality) { } else if (index === 0 && quality > this.defaultQuality) {
@ -445,23 +452,65 @@ export default Vue.extend({
}) })
}, },
setDashQualityLevel: function (qualityLevel) { setDashQualityLevel: function (qualityLevel, is60Fps = false) {
if (this.selectedQuality === qualityLevel) { if (this.selectedQuality === qualityLevel && this.using60Fps === is60Fps) {
return return
} }
let foundSelectedQuality = false
this.using60Fps = is60Fps
this.player.qualityLevels().levels_.sort((a, b) => { this.player.qualityLevels().levels_.sort((a, b) => {
return a.height - b.height if (a.height === b.height) {
return a.bitrate - b.bitrate
} else {
return a.height - b.height
}
}).forEach((ql, index, arr) => { }).forEach((ql, index, arr) => {
if (qualityLevel === 'auto' || ql.height === qualityLevel) { if (foundSelectedQuality) {
ql.enabled = false
ql.enabled_(false)
} else if (qualityLevel === 'auto') {
ql.enabled = true ql.enabled = true
ql.enabled_(true) ql.enabled_(true)
} else if (ql.height === qualityLevel) {
ql.enabled = true
ql.enabled_(true)
foundSelectedQuality = true
let lowerQuality
let higherQuality
if ((index - 1) !== -1) {
lowerQuality = arr[index - 1]
}
if ((index + 1) < arr.length) {
higherQuality = arr[index + 1]
}
if (typeof (lowerQuality) !== 'undefined' && lowerQuality.height === ql.height && lowerQuality.bitrate < ql.bitrate && !is60Fps) {
ql.enabled = false
ql.enabled_(false)
foundSelectedQuality = false
}
if (typeof (higherQuality) !== 'undefined' && higherQuality.height === ql.height && higherQuality.bitrate > ql.bitrate && is60Fps) {
ql.enabled = false
ql.enabled_(false)
foundSelectedQuality = false
}
} else { } else {
ql.enabled = false ql.enabled = false
ql.enabled_(false) ql.enabled_(false)
} }
}) })
const selectedQuality = qualityLevel === 'auto' ? 'auto' : qualityLevel + 'p' let selectedQuality = qualityLevel
if (selectedQuality !== 'auto' && is60Fps) {
selectedQuality = selectedQuality + 'p60'
} else if (selectedQuality !== 'auto') {
selectedQuality = selectedQuality + 'p'
}
const qualityElement = document.getElementById('vjs-current-quality') const qualityElement = document.getElementById('vjs-current-quality')
qualityElement.innerText = selectedQuality qualityElement.innerText = selectedQuality
@ -677,9 +726,9 @@ export default Vue.extend({
}, },
handleClick: function(event) { handleClick: function(event) {
const selectedQuality = event.target.innerText const selectedQuality = event.target.innerText
const quality = selectedQuality === 'auto' ? 'auto' : parseInt(selectedQuality.replace('p', '')) const quality = selectedQuality === 'auto' ? 'auto' : parseInt(selectedQuality.replace('p(60)?', ''))
v.setDashQualityLevel(quality) const is60Fps = selectedQuality.includes('p60')
// console.log(this.player().qualityLevels()) v.setDashQualityLevel(quality, is60Fps)
}, },
createControlTextEl: function (button) { createControlTextEl: function (button) {
const beginningHtml = `<div class="vjs-quality-level-value"> const beginningHtml = `<div class="vjs-quality-level-value">
@ -695,10 +744,21 @@ export default Vue.extend({
</li>` </li>`
levels.levels_.sort((a, b) => { levels.levels_.sort((a, b) => {
return b.height - a.height if (b.height === a.height) {
}).forEach((quality) => { return b.bitrate - a.bitrate
} else {
return b.height - a.height
}
}).forEach((quality, index, array) => {
let is60Fps = false
if (index < array.length - 1 && array[index + 1].height === quality.height) {
if (array[index + 1].bitrate < quality.bitrate) {
is60Fps = true
}
}
const qualityText = is60Fps ? quality.height + 'p60' : quality.height + 'p'
qualityHtml = qualityHtml + `<li class="vjs-menu-item quality-item" role="menuitemradio" tabindex="-1" aria-checked="false aria-disabled="false"> qualityHtml = qualityHtml + `<li class="vjs-menu-item quality-item" role="menuitemradio" tabindex="-1" aria-checked="false aria-disabled="false">
<span class="vjs-menu-item-text">${quality.height}p</span> <span class="vjs-menu-item-text">${qualityText}</span>
<span class="vjs-control-text" aria-live="polite"></span> <span class="vjs-control-text" aria-live="polite"></span>
</li>` </li>`
}) })

View File

@ -49,6 +49,18 @@ export default Vue.extend({
backendPreference: function () { backendPreference: function () {
return this.$store.getters.getBackendPreference return this.$store.getters.getBackendPreference
},
forwardText: function () {
return this.$t('Forward')
},
backwardText: function () {
return this.$t('Backward')
},
newWindowText: function () {
return this.$t('Open New Window')
} }
}, },
mounted: function () { mounted: function () {
@ -124,7 +136,7 @@ export default Vue.extend({
case 'hashtag': { case 'hashtag': {
// TODO: Implement a hashtag related view // TODO: Implement a hashtag related view
let message = 'Hashtags have not yet been implemented, try again later' let message = 'Hashtags have not yet been implemented, try again later'
if (this.$te(message) && this.$t(message) !== '') { if (this.$t(message) && this.$t(message) !== '') {
message = this.$t(message) message = this.$t(message)
} }

View File

@ -19,6 +19,7 @@
tabindex="0" tabindex="0"
@click="historyBack" @click="historyBack"
@keypress="historyBack" @keypress="historyBack"
:title="forwardText"
/> />
<font-awesome-icon <font-awesome-icon
class="navForwardIcon navIcon" class="navForwardIcon navIcon"
@ -27,6 +28,7 @@
tabindex="0" tabindex="0"
@click="historyForward" @click="historyForward"
@keypress="historyForward" @keypress="historyForward"
:title="forwardText"
/> />
<font-awesome-icon <font-awesome-icon
class="navSearchIcon navIcon" class="navSearchIcon navIcon"
@ -40,6 +42,7 @@
class="navNewWindowIcon navIcon" class="navNewWindowIcon navIcon"
icon="clone" icon="clone"
@click="createNewWindow" @click="createNewWindow"
:title="newWindowText"
/> />
<div class="logo"> <div class="logo">
<div <div

View File

@ -664,10 +664,12 @@ body.vjs-full-window {
display: none; display: none;
position: absolute; position: absolute;
bottom: 30px; bottom: 30px;
left: -8px; left: -15px;
z-index: 5; z-index: 5;
background-color: #151b17; background-color: #151b17;
width: 50px; width: 70px;
max-height: 225px;
overflow-y: auto;
} }
.vjs-quality-level-menu:hover { .vjs-quality-level-menu:hover {

View File

@ -257,7 +257,7 @@ export default Vue.extend({
} }
this.thumbnailUrl = response.authorThumbnails[2].url this.thumbnailUrl = response.authorThumbnails[2].url
this.channelDescription = autolinker.link(response.description) this.channelDescription = autolinker.link(response.description)
this.relatedChannels = response.relatedChannels this.relatedChannels = response.relatedChannels.items
if (response.authorBanners !== null) { if (response.authorBanners !== null) {
const bannerUrl = response.authorBanners[response.authorBanners.length - 1].url const bannerUrl = response.authorBanners[response.authorBanners.length - 1].url

View File

@ -428,7 +428,14 @@ export default Vue.extend({
if (this.proxyVideos) { if (this.proxyVideos) {
this.dashSrc = await this.createInvidiousDashManifest() this.dashSrc = await this.createInvidiousDashManifest()
} else { } else {
this.dashSrc = await this.createLocalDashManifest(result.player_response.streamingData.adaptiveFormats) const adaptiveFormats = result.player_response.streamingData.adaptiveFormats.filter((video) => {
if (typeof (video.qualityLabel) !== 'undefined') {
return !video.qualityLabel.includes('HDR')
} else {
return true
}
})
this.dashSrc = await this.createLocalDashManifest(adaptiveFormats)
} }
this.audioSourceList = result.player_response.streamingData.adaptiveFormats.filter((format) => { this.audioSourceList = result.player_response.streamingData.adaptiveFormats.filter((format) => {

View File

@ -28,6 +28,7 @@ Minimize: Minimize
Close: Close Close: Close
Back: Back Back: Back
Forward: Forward Forward: Forward
Open New Window: Open New Window
Version $ is now available! Click for more details: Version $ is now available! Click Version $ is now available! Click for more details: Version $ is now available! Click
for more details for more details