From 4d43249e2553697d3d3f7914c4f76e8572514fac Mon Sep 17 00:00:00 2001 From: Kavin <20838718+FireMasterK@users.noreply.github.com> Date: Wed, 6 Dec 2023 09:47:29 +0000 Subject: [PATCH] Remove xml-js for fast-xml-parser. --- package.json | 6 +- pnpm-lock.yaml | 74 ++++------------- src/utils/DashUtils.js | 178 +++++++++++++---------------------------- vite.config.js | 1 - 4 files changed, 73 insertions(+), 186 deletions(-) diff --git a/package.json b/package.json index 5056feca..6297118e 100644 --- a/package.json +++ b/package.json @@ -15,19 +15,17 @@ "@fortawesome/free-brands-svg-icons": "6.5.1", "@fortawesome/free-solid-svg-icons": "6.5.1", "@fortawesome/vue-fontawesome": "3.0.5", - "buffer": "6.0.3", "dompurify": "3.0.6", + "fast-xml-parser": "4.3.2", "hotkeys-js": "3.12.2", "javascript-time-ago": "2.5.9", "linkify-html": "4.1.3", "linkifyjs": "4.1.3", "qrcode": "^1.5.3", "shaka-player": "4.7.1", - "stream-browserify": "3.0.0", "vue": "3.3.10", "vue-i18n": "9.8.0", - "vue-router": "4.2.5", - "xml-js": "1.6.11" + "vue-router": "4.2.5" }, "devDependencies": { "@iconify-json/fa6-brands": "1.1.17", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89557423..655f40f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,12 +17,12 @@ dependencies: '@fortawesome/vue-fontawesome': specifier: 3.0.5 version: 3.0.5(@fortawesome/fontawesome-svg-core@6.5.1)(vue@3.3.10) - buffer: - specifier: 6.0.3 - version: 6.0.3 dompurify: specifier: 3.0.6 version: 3.0.6 + fast-xml-parser: + specifier: 4.3.2 + version: 4.3.2 hotkeys-js: specifier: 3.12.2 version: 3.12.2 @@ -41,9 +41,6 @@ dependencies: shaka-player: specifier: 4.7.1 version: 4.7.1 - stream-browserify: - specifier: 3.0.0 - version: 3.0.0 vue: specifier: 3.3.10 version: 3.3.10(typescript@5.3.2) @@ -53,9 +50,6 @@ dependencies: vue-router: specifier: 4.2.5 version: 4.2.5(vue@3.3.10) - xml-js: - specifier: 1.6.11 - version: 1.6.11 devDependencies: '@iconify-json/fa6-brands': @@ -2623,10 +2617,6 @@ packages: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false - /big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -2683,13 +2673,6 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: true - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: false - /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -3318,6 +3301,13 @@ packages: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} dev: true + /fast-xml-parser@4.3.2: + resolution: {integrity: sha512-rmrXUXwbJedoXkStenj1kkljNF7ugn5ZjR9FJcwmCfcCbtOMDghPajbc+Tck6vE6F5XsDmx+Pr2le9fw8+pXBg==} + hasBin: true + dependencies: + strnum: 1.0.5 + dev: false + /fastq@1.15.0: resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: @@ -3594,10 +3584,6 @@ packages: resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false - /ignore@5.3.0: resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} engines: {node: '>= 4'} @@ -3625,6 +3611,7 @@ packages: /inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} @@ -4460,15 +4447,6 @@ packages: safe-buffer: 5.2.1 dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4635,6 +4613,7 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -4644,10 +4623,6 @@ packages: is-regex: 1.1.4 dev: true - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false - /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -4763,13 +4738,6 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true - /stream-browserify@3.0.0: - resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -4818,12 +4786,6 @@ packages: es-abstract: 1.22.3 dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: false - /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} engines: {node: '>=4'} @@ -4859,6 +4821,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum@1.0.5: + resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5158,6 +5124,7 @@ packages: /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true /vite-plugin-eslint@1.8.1(eslint@8.55.0)(vite@5.0.5): resolution: {integrity: sha512-PqdMf3Y2fLO9FsNPmMX+//2BF5SF8nEWspZdgl4kSt7UvHDRHVVfHvxsD7ULYzZrJDGRxR81Nq7TOFgwMnUang==} @@ -5493,13 +5460,6 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: true - /xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true - dependencies: - sax: 1.3.0 - dev: false - /xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} diff --git a/src/utils/DashUtils.js b/src/utils/DashUtils.js index f0d6dcde..206a3b54 100644 --- a/src/utils/DashUtils.js +++ b/src/utils/DashUtils.js @@ -1,42 +1,33 @@ // Based of https://github.com/GilgusMaximus/yt-dash-manifest-generator/blob/master/src/DashGenerator.js - -import { Buffer } from "buffer"; -window.Buffer = Buffer; -import { json2xml } from "xml-js"; +import { XMLBuilder } from "fast-xml-parser"; export function generate_dash_file_from_formats(VideoFormats, VideoLength) { const generatedJSON = generate_xmljs_json_from_data(VideoFormats, VideoLength); - return json2xml(generatedJSON); + const builder = new XMLBuilder({ + ignoreAttributes: false, + allowBooleanAttributes: true, + suppressBooleanAttributes: false, + attributeNamePrefix: "_", + }); + return builder.build(generatedJSON); } function generate_xmljs_json_from_data(VideoFormatArray, VideoLength) { const convertJSON = { - declaration: { - attributes: { - version: "1.0", - encoding: "utf-8", + "?xml": { + _version: "1.0", + _encoding: "utf-8", + MPD: { + _xmlns: "urn:mpeg:dash:schema:mpd:2011", + _profiles: "urn:mpeg:dash:profile:full:2011", + _minBufferTime: "PT1.5S", + _type: "static", + _mediaPresentationDuration: `PT${VideoLength}S`, + Period: { + AdaptationSet: generate_adaptation_set(VideoFormatArray), + }, }, }, - elements: [ - { - type: "element", - name: "MPD", - attributes: { - xmlns: "urn:mpeg:dash:schema:mpd:2011", - profiles: "urn:mpeg:dash:profile:full:2011", - minBufferTime: "PT1.5S", - type: "static", - mediaPresentationDuration: `PT${VideoLength}S`, - }, - elements: [ - { - type: "element", - name: "Period", - elements: generate_adaptation_set(VideoFormatArray), - }, - ], - }, - ], }; return convertJSON; } @@ -76,34 +67,27 @@ function generate_adaptation_set(VideoFormatArray) { mimeAudioObjs.forEach(mimeAudioObj => { const adapSet = { - type: "element", - name: "AdaptationSet", - attributes: { - id: mimeAudioObj.audioTrackId, - lang: mimeAudioObj.audioTrackId?.substr(0, 2), - mimeType: mimeAudioObj.mimeType, - startWithSAP: "1", - subsegmentAlignment: "true", - }, - elements: [], + _id: mimeAudioObj.audioTrackId, + _lang: mimeAudioObj.audioTrackId?.substr(0, 2), + _mimeType: mimeAudioObj.mimeType, + _startWithSAP: "1", + _subsegmentAlignment: "true", + Representation: [], }; let isVideoFormat = false; if (mimeAudioObj.mimeType.includes("video")) { isVideoFormat = true; - } - - if (isVideoFormat) { - adapSet.attributes.scanType = "progressive"; + adapSet["_scanType"] = "progressive"; } for (var i = 0; i < mimeAudioObj.videoFormats.length; i++) { const videoFormat = mimeAudioObj.videoFormats[i]; if (isVideoFormat) { - adapSet.elements.push(generate_representation_video(videoFormat)); + adapSet.Representation.push(generate_representation_video(videoFormat)); } else { - adapSet.elements.push(generate_representation_audio(videoFormat)); + adapSet.Representation.push(generate_representation_audio(videoFormat)); } } @@ -114,94 +98,40 @@ function generate_adaptation_set(VideoFormatArray) { function generate_representation_audio(Format) { const representation = { - type: "element", - name: "Representation", - attributes: { - id: Format.itag, - codecs: Format.codec, - bandwidth: Format.bitrate, + _id: Format.itag, + _codecs: Format.codec, + _bandwidth: Format.bitrate, + AudioChannelConfiguration: { + _schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", + _value: "2", }, - elements: [ - { - type: "element", - name: "AudioChannelConfiguration", - attributes: { - schemeIdUri: "urn:mpeg:dash:23003:3:audio_channel_configuration:2011", - value: "2", - }, + BaseURL: Format.url, + SegmentBase: { + _indexRange: `${Format.indexStart}-${Format.indexEnd}`, + Initialization: { + _range: `${Format.initStart}-${Format.initEnd}`, }, - { - type: "element", - name: "BaseURL", - elements: [ - { - type: "text", - text: Format.url, - }, - ], - }, - { - type: "element", - name: "SegmentBase", - attributes: { - indexRange: `${Format.indexStart}-${Format.indexEnd}`, - }, - elements: [ - { - type: "element", - name: "Initialization", - attributes: { - range: `${Format.initStart}-${Format.initEnd}`, - }, - }, - ], - }, - ], + }, }; return representation; } function generate_representation_video(Format) { const representation = { - type: "element", - name: "Representation", - attributes: { - id: Format.itag, - codecs: Format.codec, - bandwidth: Format.bitrate, - width: Format.width, - height: Format.height, - maxPlayoutRate: "1", - frameRate: Format.fps, + _id: Format.itag, + _codecs: Format.codec, + _bandwidth: Format.bitrate, + _width: Format.width, + _height: Format.height, + _maxPlayoutRate: "1", + _frameRate: Format.fps, + BaseURL: Format.url, + SegmentBase: { + _indexRange: `${Format.indexStart}-${Format.indexEnd}`, + Initialization: { + _range: `${Format.initStart}-${Format.initEnd}`, + }, }, - elements: [ - { - type: "element", - name: "BaseURL", - elements: [ - { - type: "text", - text: Format.url, - }, - ], - }, - { - type: "element", - name: "SegmentBase", - attributes: { - indexRange: `${Format.indexStart}-${Format.indexEnd}`, - }, - elements: [ - { - type: "element", - name: "Initialization", - attributes: { - range: `${Format.initStart}-${Format.initEnd}`, - }, - }, - ], - }, - ], }; return representation; } diff --git a/vite.config.js b/vite.config.js index bd5e3c5b..1cd37371 100644 --- a/vite.config.js +++ b/vite.config.js @@ -68,7 +68,6 @@ export default defineConfig({ resolve: { alias: { "@": path.resolve(__dirname, "./src"), - stream: "stream-browserify", }, }, build: {