diff --git a/package.json b/package.json index c67e564..15444ab 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "install:yt-dlp": "sh scripts/install-yt-dlp.sh" }, "dependencies": { + "@dank074/discord-video-stream": "^6.0.0", "@discordjs/opus": "^0.10.0", "@discordjs/voice": "^0.19.1", "@radix-ui/react-scroll-area": "^1.2.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f92bb53..9f3b726 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@dank074/discord-video-stream': - specifier: workspace:* - version: link:vendor/Discord-video-stream + specifier: ^6.0.0 + version: 6.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(discord.js-selfbot-v13@vendor+discord.js-selfbot-v13) '@discordjs/opus': specifier: ^0.10.0 version: 0.10.0 @@ -151,52 +151,6 @@ importers: specifier: latest version: 4.1.6(@opentelemetry/api@1.9.1)(@types/node@25.8.0)(vite@8.0.13(@types/node@25.8.0)(esbuild@0.28.0)(jiti@1.21.7)(tsx@4.22.0)(yaml@2.9.0)) - vendor/Discord-video-stream: - dependencies: - '@lng2004/node-datachannel': - specifier: 0.32.0-20260202 - version: 0.32.0-20260202 - '@snazzah/davey': - specifier: ^0.1.8 - version: 0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) - debug-level: - specifier: ^4.1.1 - version: 4.1.1 - fluent-ffmpeg-simplified: - specifier: ^0.1.0 - version: 0.1.0 - node-av: - specifier: ^5.2.2 - version: 5.2.4 - p-debounce: - specifier: ^5.1.0 - version: 5.1.0 - sharp: - specifier: ^0.34.5 - version: 0.34.5 - zeromq: - specifier: ^6.5.0 - version: 6.5.0 - devDependencies: - '@biomejs/biome': - specifier: 2.3.8 - version: 2.3.8 - '@types/fluent-ffmpeg': - specifier: ^2.1.28 - version: 2.1.28 - '@types/node': - specifier: ^25.0.1 - version: 25.8.0 - discord.js-selfbot-v13: - specifier: workspace:* - version: link:../discord.js-selfbot-v13 - pkg-pr-new: - specifier: ^0.0.62 - version: 0.0.62 - typescript: - specifier: ^5.9.3 - version: 5.9.3 - vendor/discord.js-selfbot-v13: dependencies: '@discordjs/builders': @@ -272,18 +226,6 @@ importers: packages: - '@actions/core@1.11.1': - resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} - - '@actions/exec@1.1.1': - resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} - - '@actions/http-client@2.2.3': - resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} - - '@actions/io@1.1.3': - resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} - '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -313,112 +255,65 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@biomejs/biome@2.3.8': - resolution: {integrity: sha512-Qjsgoe6FEBxWAUzwFGFrB+1+M8y/y5kwmg5CHac+GSVOdmOIqsAiXM5QMVGZJ1eCUCLlPZtq4aFAQ0eawEUuUA==} - engines: {node: '>=14.21.3'} - hasBin: true - '@biomejs/biome@2.4.15': resolution: {integrity: sha512-j5VH3a/h/HXTKBM50MDMxRCzkeLv9S2XJcW2WgnZT1+xyisi+0bISrXR82gCX+8S9lvK0skEvHJRN+3Ktr2hlw==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@2.3.8': - resolution: {integrity: sha512-HM4Zg9CGQ3txTPflxD19n8MFPrmUAjaC7PQdLkugeeC0cQ+PiVrd7i09gaBS/11QKsTDBJhVg85CEIK9f50Qww==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] - '@biomejs/cli-darwin-arm64@2.4.15': resolution: {integrity: sha512-rF3PPqLq1yoST79zaQbDjVJwsuIeci/O+9bgNmC5QpgOqz6aqYuzA4abyAGx+mgyiDXn4A049xAN8gijbuR1Qg==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@2.3.8': - resolution: {integrity: sha512-lUDQ03D7y/qEao7RgdjWVGCu+BLYadhKTm40HkpJIi6kn8LSv5PAwRlew/DmwP4YZ9ke9XXoTIQDO1vAnbRZlA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] - '@biomejs/cli-darwin-x64@2.4.15': resolution: {integrity: sha512-/5KHXYMfSJs1fNXiX30xFtI8JcCFV6zaVVLxOa0M2sfqBKHkpQhRTv94yxQWxeTY2lzo2OuTlNvPC+hDQt2wcQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@2.3.8': - resolution: {integrity: sha512-PShR4mM0sjksUMyxbyPNMxoKFPVF48fU8Qe8Sfx6w6F42verbwRLbz+QiKNiDPRJwUoMG1nPM50OBL3aOnTevA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - '@biomejs/cli-linux-arm64-musl@2.4.15': resolution: {integrity: sha512-ZPcxznxm0pogHBLZhYntyR3sR+MrZjqJIKEr7ZqVen0Rl+P/4upVmfYXjftizi9RoqZntg33fv/1fbdhbYXpEQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@2.3.8': - resolution: {integrity: sha512-Uo1OJnIkJgSgF+USx970fsM/drtPcQ39I+JO+Fjsaa9ZdCN1oysQmy6oAGbyESlouz+rzEckLTF6DS7cWse95g==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] - '@biomejs/cli-linux-arm64@2.4.15': resolution: {integrity: sha512-owaAMZD/T4LrD0ELNCk0Km3qrRHuM0X6EAyVE1FSqGY0rbLoiDLrO4Us2tllm6cAeB2Ioa9C2C08NZPdr8+0Ug==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@2.3.8': - resolution: {integrity: sha512-YGLkqU91r1276uwSjiUD/xaVikdxgV1QpsicT0bIA1TaieM6E5ibMZeSyjQ/izBn4tKQthUSsVZacmoJfa3pDA==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - '@biomejs/cli-linux-x64-musl@2.4.15': resolution: {integrity: sha512-CNq/9W38SYSH023lfcQ4KKU8K0YX8T//FZUhcgtMMRABDojx5XsMV7jlweAvGSl389wJQB29Qo6Zb/a+jdvt+w==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@2.3.8': - resolution: {integrity: sha512-QDPMD5bQz6qOVb3kiBui0zKZXASLo0NIQ9JVJio5RveBEFgDgsvJFUvZIbMbUZT3T00M/1wdzwWXk4GIh0KaAw==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [linux] - '@biomejs/cli-linux-x64@2.4.15': resolution: {integrity: sha512-0jj7THz12GbUOLmMibktK6DZjqz2zV64KFxyBtcFTKPiiOIY0a7vns1elpO1dERvxpsZ5ik0oFfz0oGwFde1+g==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@2.3.8': - resolution: {integrity: sha512-H4IoCHvL1fXKDrTALeTKMiE7GGWFAraDwBYFquE/L/5r1927Te0mYIGseXi4F+lrrwhSWbSGt5qPFswNoBaCxg==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [win32] - '@biomejs/cli-win32-arm64@2.4.15': resolution: {integrity: sha512-ouhkYdlhp/1GghEJPdWwD/Vi3gQ1nFxuSpMolWsbq3Lsq3QUR4jl6UdhhscdCugKU5vOEuMiJhvKj66O0OCq+w==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@2.3.8': - resolution: {integrity: sha512-RguzimPoZWtBapfKhKjcWXBVI91tiSprqdBYu7tWhgN8pKRZhw24rFeNZTNf6UiBfjCYCi9eFQs/JzJZIhuK4w==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [win32] - '@biomejs/cli-win32-x64@2.4.15': resolution: {integrity: sha512-zBrGq5mx5wwpnow4+2BxUvleDM+GNd4sLbPaMapsSLQLD0NGRCquqPBTgN+7XkUteHvj7M+BstuI8tmnV7+HgQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] + '@dank074/discord-video-stream@6.0.0': + resolution: {integrity: sha512-OhEqOI+UPsg0qn2slnv6psU6tMpmHsVq4pisENSfudblHnw83jEueclqmFxd0c4uXKVcYHf1ICu6P+PSu6PK0A==} + engines: {node: '>=22.4.0'} + peerDependencies: + discord.js-selfbot-v13: ^3.6.0 + '@discordjs/builders@1.14.1': resolution: {integrity: sha512-gSKkhXLqs96TCzk66VZuHHl8z2bQMJFGwrXC0f33ngK+FLNau4hU1PYny3DNJfNdSH+gVMzE85/d5FQ2BpcNwQ==} engines: {node: '>=16.11.0'} @@ -916,10 +811,6 @@ packages: cpu: [x64] os: [win32] - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - '@fidm/asn1@1.0.4': resolution: {integrity: sha512-esd1jyNvRb2HVaQGq2Gg8Z0kbQPXzV9Tq5Z14KNIov6KfFD6PTaRIO8UpcsYiTNzOqJpmyzWgVTrUwFV3UF4TQ==} engines: {node: '>= 8'} @@ -1097,10 +988,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jsdevtools/ez-spawn@3.0.4': - resolution: {integrity: sha512-f5DRIOZf7wxogefH03RjMPMdBF7ADTWUMoOs9kaJo06EfwF+aFhMZMDZxHg/Xe12hptN9xoZjGso2fdjapBRIA==} - engines: {node: '>=10'} - '@leichtgewicht/ip-codec@2.0.5': resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} @@ -1137,62 +1024,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@octokit/action@6.1.0': - resolution: {integrity: sha512-lo+nHx8kAV86bxvOVOI3vFjX3gXPd/L7guAUbvs3pUvnR2KC+R7yjBkA1uACt4gYhs4LcWP3AXSGQzsbeN2XXw==} - engines: {node: '>= 18'} - - '@octokit/auth-action@4.1.0': - resolution: {integrity: sha512-m+3t7K46IYyMk7Bl6/lF4Rv09GqDZjYmNg8IWycJ2Fa3YE3DE7vQcV6G2hUPmR9NDqenefNJwVtlisMjzymPiQ==} - engines: {node: '>= 18'} - - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - - '@octokit/core@5.2.2': - resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} - engines: {node: '>= 18'} - - '@octokit/endpoint@9.0.6': - resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} - engines: {node: '>= 18'} - - '@octokit/graphql@7.1.1': - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@20.0.0': - resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==} - - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} - - '@octokit/plugin-paginate-rest@9.2.2': - resolution: {integrity: sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - - '@octokit/plugin-rest-endpoint-methods@10.4.1': - resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - - '@octokit/request-error@5.1.1': - resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} - engines: {node: '>= 18'} - - '@octokit/request@8.4.1': - resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} - engines: {node: '>= 18'} - - '@octokit/types@12.6.0': - resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==} - - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - '@opentelemetry/api@1.9.1': resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} engines: {node: '>=8.0.0'} @@ -1671,9 +1502,6 @@ packages: resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==} engines: {node: '>=v16'} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@seydx/node-av-darwin-arm64@5.2.4': resolution: {integrity: sha512-uQh6jWXDeXtjuaGOXrBx2rszPDcQbRa4W1YFrmlQG+ffOo+IJyczGjhTWfgzebRksB9tMAe9ViztU39THWZAkw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1732,10 +1560,6 @@ packages: '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@snazzah/davey-android-arm-eabi@0.1.11': resolution: {integrity: sha512-T1RYbNYKN6tLOcGIDKJd8OI6FBSEemwL7DOYdTMmhqfhhMr3YVN8WOhfoxGg63OcnpTN2e2c5tdY2bAx25RmQQ==} engines: {node: '>= 10'} @@ -1863,9 +1687,6 @@ packages: '@types/express@5.0.6': resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} - '@types/fluent-ffmpeg@2.1.28': - resolution: {integrity: sha512-5ovxsDwBcPfJ+eYs1I/ZpcYCnkce7pvH9AHSvrZllAp1ZPpTRDZAFjF3TRFbukxSgIYTTNYePbS0rKUmaxVbXw==} - '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -1981,11 +1802,6 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.16.0: - resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} - engines: {node: '>=0.4.0'} - hasBin: true - aes-js@3.1.2: resolution: {integrity: sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==} @@ -2088,6 +1904,9 @@ packages: resolution: {integrity: sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==} engines: {node: '>=4'} + async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + asyncc@2.0.9: resolution: {integrity: sha512-nTQfwHtnL+MSqPaUJhV22GWP3jThj0GnS4Nw1uJyBus6EQ40hQFnbBGUvWxC5P3m+1neSqH1p8asMXg/ypmsQw==} engines: {node: '>=6.0.0'} @@ -2182,9 +2001,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - better-sqlite3@12.10.0: resolution: {integrity: sha512-CyzaZRQKyHkB2ZInfTTl2nvT33EbDpjkLEbE8/Zck3Ll6O0qqvuGdrJ45HgtH+HykRg88ITY3AdreBGN70aBSQ==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} @@ -2254,9 +2070,6 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - call-me-maybe@1.0.2: - resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==} - callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -2383,9 +2196,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - config-master@3.1.0: resolution: {integrity: sha512-n7LBL1zBzYdTpF1mx5DNcZnZn05CWIdsdvtPL4MosvqbBUK3Rq6VWEtGUuF3Y0s9/CIhMejezqlSkP6TnCJ/9g==} @@ -2471,10 +2281,6 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decode-uri-component@0.4.1: - resolution: {integrity: sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==} - engines: {node: '>=14.16'} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -2497,9 +2303,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -2783,10 +2586,6 @@ packages: events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} - expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -2844,10 +2643,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - file-entry-cache@5.0.1: resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} engines: {node: '>=4'} @@ -2866,10 +2661,6 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - filter-obj@5.1.0: - resolution: {integrity: sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==} - engines: {node: '>=14.16'} - finalhandler@2.1.1: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} @@ -2903,8 +2694,10 @@ packages: flatted@2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - fluent-ffmpeg-simplified@0.1.0: - resolution: {integrity: sha512-u3McLUh6H6/hhXYxfZcSGwCJAAlN8wsCCPZjVpaK9HIIvmjOB3G584H3PAWZb/ZQTHVKUrzhjNEYMXZXZjOR+g==} + fluent-ffmpeg@2.1.3: + resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==} + engines: {node: '>=18'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -2975,10 +2768,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} @@ -3065,10 +2854,6 @@ packages: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} - human-signals@8.0.1: - resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} - engines: {node: '>=18.18.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -3172,10 +2957,6 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -3186,18 +2967,10 @@ packages: is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -3208,10 +2981,6 @@ packages: isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isbinaryfile@5.0.7: - resolution: {integrity: sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==} - engines: {node: '>= 18.0.0'} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3546,9 +3315,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mp4box@0.5.4: resolution: {integrity: sha512-GcCH0fySxBurJtvr0dfhz0IxHZjc1RP+F+I8xw+LIwkU1a+7HJx8NCDiww1I5u4Hz6g4eR1JlGADEGJ9r4lSfA==} @@ -3628,10 +3394,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -3727,10 +3489,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -3760,10 +3518,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3847,13 +3601,6 @@ packages: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} - pkg-pr-new@0.0.62: - resolution: {integrity: sha512-K2jtf1PLCJJFDimQIpasPXDdnRTZSYPy36Ldz+QhMpLz2YN1Wi0ZQkomVt5Wi3NdBZcYuYGXekyFWfJ6fAHYjg==} - hasBin: true - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - play-audio@0.5.2: resolution: {integrity: sha512-ZAqHUKkQLix2Iga7pPbsf1LpUoBjcpwU93F1l3qBIfxYddQLhxS6GKmS0d3jV8kSVaUbr6NnOEcEMFvuX93SWQ==} @@ -3940,10 +3687,6 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.3.0: - resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} - engines: {node: '>=18'} - prism-media@1.3.5: resolution: {integrity: sha512-IQdl0Q01m4LrkN1EGIE9lphov5Hy7WWlH6ulf5QdGePLlPas9p2mhgddTEHrlaXYjjFToM1/rWuwF37VF4taaA==} peerDependencies: @@ -4005,14 +3748,6 @@ packages: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} - query-registry@3.0.1: - resolution: {integrity: sha512-M9RxRITi2mHMVPU5zysNjctUT8bAPx6ltEXo/ir9+qmiM47Y7f0Ir3+OxUO5OjYAWdicBQRew7RtHtqUXydqlg==} - engines: {node: '>=20'} - - query-string@9.3.1: - resolution: {integrity: sha512-5fBfMOcDi5SA9qj5jZhWAcTtDfKF5WFdd2uD9nVNlbxVv1baq65aALy6qofpNEGELHvisjjasxQp7BlM9gvMzw==} - engines: {node: '>=18'} - queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4023,10 +3758,6 @@ packages: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} engines: {node: '>=8'} - quick-lru@7.3.0: - resolution: {integrity: sha512-k9lSsjl36EJdK7I06v7APZCbyGT2vMTsYSRX1Q2nbYmnkBqgUhRkAuzH08Ciotteu/PLJmIF2+tti7o3C/ts2g==} - engines: {node: '>=18'} - range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} @@ -4303,10 +4034,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -4359,10 +4086,6 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} - split-on-first@3.0.0: - resolution: {integrity: sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==} - engines: {node: '>=12'} - split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -4392,10 +4115,6 @@ packages: streamx@2.25.0: resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - string-width@3.1.0: resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} engines: {node: '>=6'} @@ -4418,10 +4137,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -4638,10 +4353,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} @@ -4649,10 +4360,6 @@ packages: resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} engines: {node: '>= 0.8.0'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -4688,9 +4395,6 @@ packages: uc.micro@1.0.6: resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -4702,25 +4406,10 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} - - undici@6.25.0: - resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} - engines: {node: '>=18.17'} - undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - - universal-user-agent@6.0.1: - resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -4741,10 +4430,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-join@5.0.0: - resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -4774,10 +4459,6 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -5004,42 +4685,15 @@ packages: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - zeromq@6.5.0: resolution: {integrity: sha512-vWOrt19lvcXTxu5tiHXfEGQuldSlU+qZn2TT+4EbRQzaciWGwNZ99QQTolQOmcwVgZLodv+1QfC6UZs2PX/6pQ==} engines: {node: '>= 12'} - zod-package-json@1.2.0: - resolution: {integrity: sha512-tamtgPM3MkP+obfO2dLr/G+nYoYkpJKmuHdYEy6IXRKfLybruoJ5NUj0lM0LxwOpC9PpoGLbll1ecoeyj43Wsg==} - engines: {node: '>=20'} - - zod@3.25.76: - resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} - zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} snapshots: - '@actions/core@1.11.1': - dependencies: - '@actions/exec': 1.1.1 - '@actions/http-client': 2.2.3 - - '@actions/exec@1.1.1': - dependencies: - '@actions/io': 1.1.3 - - '@actions/http-client@2.2.3': - dependencies: - tunnel: 0.0.6 - undici: 5.29.0 - - '@actions/io@1.1.3': {} - '@alloc/quick-lru@5.2.0': {} '@babel/code-frame@7.29.0': @@ -5063,17 +4717,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@biomejs/biome@2.3.8': - optionalDependencies: - '@biomejs/cli-darwin-arm64': 2.3.8 - '@biomejs/cli-darwin-x64': 2.3.8 - '@biomejs/cli-linux-arm64': 2.3.8 - '@biomejs/cli-linux-arm64-musl': 2.3.8 - '@biomejs/cli-linux-x64': 2.3.8 - '@biomejs/cli-linux-x64-musl': 2.3.8 - '@biomejs/cli-win32-arm64': 2.3.8 - '@biomejs/cli-win32-x64': 2.3.8 - '@biomejs/biome@2.4.15': optionalDependencies: '@biomejs/cli-darwin-arm64': 2.4.15 @@ -5085,54 +4728,46 @@ snapshots: '@biomejs/cli-win32-arm64': 2.4.15 '@biomejs/cli-win32-x64': 2.4.15 - '@biomejs/cli-darwin-arm64@2.3.8': - optional: true - '@biomejs/cli-darwin-arm64@2.4.15': optional: true - '@biomejs/cli-darwin-x64@2.3.8': - optional: true - '@biomejs/cli-darwin-x64@2.4.15': optional: true - '@biomejs/cli-linux-arm64-musl@2.3.8': - optional: true - '@biomejs/cli-linux-arm64-musl@2.4.15': optional: true - '@biomejs/cli-linux-arm64@2.3.8': - optional: true - '@biomejs/cli-linux-arm64@2.4.15': optional: true - '@biomejs/cli-linux-x64-musl@2.3.8': - optional: true - '@biomejs/cli-linux-x64-musl@2.4.15': optional: true - '@biomejs/cli-linux-x64@2.3.8': - optional: true - '@biomejs/cli-linux-x64@2.4.15': optional: true - '@biomejs/cli-win32-arm64@2.3.8': - optional: true - '@biomejs/cli-win32-arm64@2.4.15': optional: true - '@biomejs/cli-win32-x64@2.3.8': - optional: true - '@biomejs/cli-win32-x64@2.4.15': optional: true + '@dank074/discord-video-stream@6.0.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(discord.js-selfbot-v13@vendor+discord.js-selfbot-v13)': + dependencies: + '@lng2004/node-datachannel': 0.32.0-20260202 + '@snazzah/davey': 0.1.11(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + debug-level: 4.1.1 + discord.js-selfbot-v13: link:vendor/discord.js-selfbot-v13 + fluent-ffmpeg: 2.1.3 + node-av: 5.2.4 + p-debounce: 5.1.0 + sharp: 0.34.5 + zeromq: 6.5.0 + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - supports-color + '@discordjs/builders@1.14.1': dependencies: '@discordjs/formatters': 0.6.2 @@ -5454,8 +5089,6 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@fastify/busboy@2.1.1': {} - '@fidm/asn1@1.0.4': {} '@fidm/x509@1.2.1': @@ -5594,13 +5227,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@jsdevtools/ez-spawn@3.0.4': - dependencies: - call-me-maybe: 1.0.2 - cross-spawn: 7.0.6 - string-argv: 0.3.2 - type-detect: 4.1.0 - '@leichtgewicht/ip-codec@2.0.5': {} '@lng2004/node-datachannel@0.32.0-20260202': @@ -5634,78 +5260,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@octokit/action@6.1.0': - dependencies: - '@octokit/auth-action': 4.1.0 - '@octokit/core': 5.2.2 - '@octokit/plugin-paginate-rest': 9.2.2(@octokit/core@5.2.2) - '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.2.2) - '@octokit/types': 12.6.0 - undici: 6.25.0 - - '@octokit/auth-action@4.1.0': - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/types': 13.10.0 - - '@octokit/auth-token@4.0.0': {} - - '@octokit/core@5.2.2': - dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.1 - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - before-after-hook: 2.2.3 - universal-user-agent: 6.0.1 - - '@octokit/endpoint@9.0.6': - dependencies: - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - - '@octokit/graphql@7.1.1': - dependencies: - '@octokit/request': 8.4.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - - '@octokit/openapi-types@20.0.0': {} - - '@octokit/openapi-types@24.2.0': {} - - '@octokit/plugin-paginate-rest@9.2.2(@octokit/core@5.2.2)': - dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 - - '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.2.2)': - dependencies: - '@octokit/core': 5.2.2 - '@octokit/types': 12.6.0 - - '@octokit/request-error@5.1.1': - dependencies: - '@octokit/types': 13.10.0 - deprecation: 2.3.1 - once: 1.4.0 - - '@octokit/request@8.4.1': - dependencies: - '@octokit/endpoint': 9.0.6 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 - universal-user-agent: 6.0.1 - - '@octokit/types@12.6.0': - dependencies: - '@octokit/openapi-types': 20.0.0 - - '@octokit/types@13.10.0': - dependencies: - '@octokit/openapi-types': 24.2.0 - '@opentelemetry/api@1.9.1': {} '@otplib/core@12.0.1': {} @@ -6172,8 +5726,6 @@ snapshots: fast-deep-equal: 3.1.3 lodash: 4.18.1 - '@sec-ant/readable-stream@0.4.1': {} - '@seydx/node-av-darwin-arm64@5.2.4': optional: true @@ -6207,8 +5759,6 @@ snapshots: '@sinclair/typebox@0.27.10': {} - '@sindresorhus/merge-streams@4.0.0': {} - '@snazzah/davey-android-arm-eabi@0.1.11': optional: true @@ -6329,10 +5879,6 @@ snapshots: '@types/express-serve-static-core': 5.1.1 '@types/serve-static': 2.2.0 - '@types/fluent-ffmpeg@2.1.28': - dependencies: - '@types/node': 25.8.0 - '@types/http-errors@2.0.5': {} '@types/json-schema@7.0.15': {} @@ -6448,8 +5994,6 @@ snapshots: acorn@7.4.1: {} - acorn@8.16.0: {} - aes-js@3.1.2: {} agent-base@6.0.2: @@ -6539,6 +6083,8 @@ snapshots: astral-regex@1.0.0: {} + async@0.2.10: {} + asyncc@2.0.9: {} atomic-sleep@1.0.0: {} @@ -6611,8 +6157,6 @@ snapshots: baseline-browser-mapping@2.10.29: {} - before-after-hook@2.2.3: {} - better-sqlite3@12.10.0: dependencies: bindings: 1.5.0 @@ -6704,8 +6248,6 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - call-me-maybe@1.0.2: {} - callsites@3.1.0: {} camelcase-css@2.0.1: {} @@ -6830,8 +6372,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - config-master@3.1.0: dependencies: walk-back: 2.0.1 @@ -6905,8 +6445,6 @@ snapshots: decamelize@1.2.0: {} - decode-uri-component@0.4.1: {} - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 @@ -6925,8 +6463,6 @@ snapshots: depd@2.0.0: {} - deprecation@2.3.1: {} - detect-libc@2.1.2: {} detect-node-es@1.1.0: {} @@ -7218,21 +6754,6 @@ snapshots: transitivePeerDependencies: - bare-abort-controller - execa@9.6.1: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.1 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.3.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.2 - expand-template@2.0.3: {} expect-type@1.3.0: {} @@ -7313,10 +6834,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - file-entry-cache@5.0.1: dependencies: flat-cache: 2.0.1 @@ -7337,8 +6854,6 @@ snapshots: dependencies: to-regex-range: 5.0.1 - filter-obj@5.1.0: {} - finalhandler@2.1.1: dependencies: debug: 4.4.3 @@ -7383,10 +6898,10 @@ snapshots: flatted@2.0.2: {} - fluent-ffmpeg-simplified@0.1.0: + fluent-ffmpeg@2.1.3: dependencies: - execa: 9.6.1 - string-argv: 0.3.2 + async: 0.2.10 + which: 1.3.1 forwarded@0.2.0: {} @@ -7461,11 +6976,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -7558,8 +7068,6 @@ snapshots: transitivePeerDependencies: - supports-color - human-signals@8.0.1: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -7644,8 +7152,6 @@ snapshots: is-plain-obj@1.1.0: {} - is-plain-obj@4.1.0: {} - is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -7654,12 +7160,8 @@ snapshots: is-property@1.0.2: {} - is-stream@4.0.1: {} - is-unicode-supported@0.1.0: {} - is-unicode-supported@2.1.0: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -7668,8 +7170,6 @@ snapshots: isarray@2.0.5: {} - isbinaryfile@5.0.7: {} - isexe@2.0.0: {} isobject@3.0.1: {} @@ -7987,13 +7487,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.4 - mp4box@0.5.4: {} ms@2.1.3: {} @@ -8073,11 +7566,6 @@ snapshots: normalize-path@3.0.0: {} - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -8168,8 +7656,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-ms@4.0.0: {} - parseurl@1.3.3: {} patch-package@8.0.1: @@ -8199,8 +7685,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-to-regexp@8.4.2: {} @@ -8297,23 +7781,6 @@ snapshots: pirates@4.0.7: {} - pkg-pr-new@0.0.62: - dependencies: - '@actions/core': 1.11.1 - '@jsdevtools/ez-spawn': 3.0.4 - '@octokit/action': 6.1.0 - ignore: 5.3.2 - isbinaryfile: 5.0.7 - pkg-types: 1.3.1 - query-registry: 3.0.1 - tinyglobby: 0.2.16 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - play-audio@0.5.2: {} play-dl@1.9.7: @@ -8396,10 +7863,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.3.0: - dependencies: - parse-ms: 4.0.0 - prism-media@1.3.5(@discordjs/opus@0.10.0): optionalDependencies: '@discordjs/opus': 0.10.0 @@ -8447,29 +7910,12 @@ snapshots: dependencies: side-channel: 1.1.0 - query-registry@3.0.1: - dependencies: - query-string: 9.3.1 - quick-lru: 7.3.0 - url-join: 5.0.0 - validate-npm-package-name: 5.0.1 - zod: 3.25.76 - zod-package-json: 1.2.0 - - query-string@9.3.1: - dependencies: - decode-uri-component: 0.4.1 - filter-obj: 5.1.0 - split-on-first: 3.0.0 - queue-microtask@1.2.3: {} quick-format-unescaped@4.0.4: {} quick-lru@4.0.1: {} - quick-lru@7.3.0: {} - range-parser@1.2.1: {} raw-body@3.0.2: @@ -8802,8 +8248,6 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-concat@1.0.1: {} simple-get@4.0.1: @@ -8867,8 +8311,6 @@ snapshots: spdx-license-ids@3.0.23: {} - split-on-first@3.0.0: {} - split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -8894,8 +8336,6 @@ snapshots: - bare-abort-controller - react-native-b4a - string-argv@0.3.2: {} - string-width@3.1.0: dependencies: emoji-regex: 7.0.3 @@ -8924,8 +8364,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-final-newline@4.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -9168,16 +8606,12 @@ snapshots: dependencies: safe-buffer: 5.2.1 - tunnel@0.0.6: {} - tweetnacl@1.0.3: {} type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - type-detect@4.1.0: {} - type-fest@0.18.1: {} type-fest@0.21.3: {} @@ -9200,8 +8634,6 @@ snapshots: uc.micro@1.0.6: {} - ufo@1.6.4: {} - uglify-js@3.19.3: optional: true @@ -9209,18 +8641,8 @@ snapshots: undici-types@7.24.6: {} - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 - - undici@6.25.0: {} - undici@7.25.0: {} - unicorn-magic@0.3.0: {} - - universal-user-agent@6.0.1: {} - universalify@2.0.1: {} unpipe@1.0.0: {} @@ -9243,8 +8665,6 @@ snapshots: dependencies: punycode: 2.3.1 - url-join@5.0.0: {} - use-callback-ref@1.3.3(@types/react@19.2.14)(react@19.2.6): dependencies: react: 19.2.6 @@ -9269,8 +8689,6 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} - vary@1.1.2: {} vite@8.0.13(@types/node@25.8.0)(esbuild@0.28.0)(jiti@1.21.7)(tsx@4.22.0)(yaml@2.9.0): @@ -9327,7 +8745,7 @@ snapshots: werift-common@0.0.3: dependencies: '@shinyoshiaki/jspack': 0.0.6 - debug: 4.4.0 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -9346,7 +8764,7 @@ snapshots: dependencies: '@shinyoshiaki/jspack': 0.0.6 buffer-crc32: 1.0.0 - debug: 4.4.0 + debug: 4.4.3 int64-buffer: 1.1.0 ip: 2.0.1 lodash: 4.18.1 @@ -9498,17 +8916,9 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 - yoctocolors@2.1.2: {} - zeromq@6.5.0: dependencies: cmake-ts: 1.0.2 node-addon-api: 8.7.0 - zod-package-json@1.2.0: - dependencies: - zod: 3.25.76 - - zod@3.25.76: {} - zod@4.4.3: {} diff --git a/src/streaming/index.ts b/src/streaming/index.ts index 9db9ae9..348fbd0 100644 --- a/src/streaming/index.ts +++ b/src/streaming/index.ts @@ -2,28 +2,17 @@ import { EventEmitter } from "node:events"; import { PassThrough } from "node:stream"; import type { Readable } from "node:stream"; import type { ChildProcess } from "node:child_process"; -import { prepareTranscoder, TranscoderOptions } from "./transcoder"; import type { Client } from "discord.js-selfbot-v13"; +import { + Streamer as DankStreamer, + prepareStream as dankPrepareStream, + playStream as dankPlayStream, + Utils, + Encoders, +} from "@dank074/discord-video-stream"; -type VoiceConnectionLike = { - channel: { - id: string; - }; - createStreamConnection: () => Promise; - disconnect?: () => void; -}; - -type StreamConnectionLike = { - playVideo: (resource: string | Readable, options?: Record) => DispatcherLike; - playAudio: (resource: string | Readable, options?: Record) => DispatcherLike; - disconnect?: () => void; -}; - -type DispatcherLike = EventEmitter & { - stop?: () => void; - pause?: () => void; - resume?: () => void; -}; +type VoiceConnectionLike = any; +type StreamConnectionLike = any; export interface StreamPlayOptions { fps?: number; @@ -39,149 +28,96 @@ export interface StreamSession { stop(): void; } -export const Encoders = { - software: (opts: any) => opts, -}; - -export const Utils = { +export const UtilsAPI = { normalizeVideoCodec: (c: string) => c.toUpperCase?.() ?? c, }; export class Streamer { client: Client; + dankStreamer: DankStreamer; + constructor(client: Client) { this.client = client; - } - - async joinVoice(guildId: string, channelId: string): Promise { - const guild = this.client.guilds.cache.get(guildId); - const channel = (guild?.channels.cache.get(channelId) ?? - (await guild?.channels.fetch(channelId).catch(() => null))) as any; - if (!channel || channel.guild?.id !== guildId) { - throw new Error("VOICE_CHANNEL_NOT_FOUND"); - } - - const existingConnection = (this.client.voice as any).connection as - | VoiceConnectionLike - | undefined; - if (existingConnection?.channel?.id === channelId) { - (existingConnection as any).setVideoCodec?.("H264"); - return existingConnection; - } - - const voiceConnection = (await this.client.voice.joinChannel(channel as any, { - selfMute: true, - selfDeaf: true, - selfVideo: false, - videoCodec: "H264", - })) as unknown as VoiceConnectionLike; - - (voiceConnection as any).setVideoCodec?.("H264"); - - return voiceConnection; + this.dankStreamer = new DankStreamer(client); } async createSession(guildId: string, channelId: string): Promise { - const connection = await this.joinVoice(guildId, channelId); - const stream = await connection.createStreamConnection(); + await this.dankStreamer.joinVoice(guildId, channelId); - let activeVideo: DispatcherLike | null = null; - let activeAudio: DispatcherLike | null = null; - let finished = false; + let stopped = false; + let currentCommand: any = null; const stop = () => { - activeVideo?.stop?.(); - activeAudio?.stop?.(); - stream.disconnect?.(); - connection.disconnect?.(); + if (stopped) return; + stopped = true; + try { + if (currentCommand?.kill) currentCommand.kill("SIGKILL"); + } catch (e) { + // ignore + } + this.dankStreamer.stopStream(); + this.dankStreamer.leaveVoice(); }; - const waitForFinish = () => - new Promise((resolve, reject) => { - const maybeResolve = () => { - if (finished) return; - finished = true; - resolve(); - }; - - const handleError = (error: unknown) => { - if (finished) return; - finished = true; - stop(); - reject(error instanceof Error ? error : new Error(String(error))); - }; - - activeVideo?.on("finish", maybeResolve); - activeAudio?.on("finish", maybeResolve); - activeVideo?.on("error", handleError); - activeAudio?.on("error", handleError); - }); - return { - connection, - stream, - async play(source: string | Readable, options: StreamPlayOptions = {}) { - const videoOptions: Record = { - fps: options.fps ?? 30, - bitrate: options.bitrate ?? 2500, - presetH26x: options.presetH26x ?? "superfast", - }; - - const audioOptions: Record = { - volume: false, - }; - - let videoSource: string | Readable; - let audioSource: string | Readable; + connection: {} as any, + stream: {} as any, + play: async (source: string | Readable, options: StreamPlayOptions = {}) => { + if (stopped) return; + let targetSource: string | Readable = source; if (typeof source === "string" && source.includes("\n")) { - // yt-dlp returns multiple URLs (e.g., video\n audio\n) const urls = source.split("\n").filter((u) => u.trim()); - videoSource = urls[0] ?? source; - audioSource = urls[1] ?? urls[0] ?? source; - } else if (typeof source !== "string") { - // If source is a Readable (e.g. ffmpeg stdout) and audio+video - // need to be played separately, tee the stream into two PassThroughs. - if (options.includeAudio !== false) { - const videoTee = new PassThrough(); - const audioTee = new PassThrough(); - // Pipe to both tees; allow consumers to read independently. - (source as Readable).pipe(videoTee); - (source as Readable).pipe(audioTee); - videoSource = videoTee; - audioSource = audioTee; - } else { - // audio excluded — single video stream - const videoTee = new PassThrough(); - (source as Readable).pipe(videoTee); - videoSource = videoTee; - audioSource = videoTee; + targetSource = urls[0] ?? source; + } + + const fps = options.fps ?? 30; + const bitrateStr = String(options.bitrate ?? 2500).replace(/k$/i, ""); + const bitrateVideo = parseInt(bitrateStr, 10) || 2500; + + const { command, output } = dankPrepareStream(targetSource, { + encoder: Encoders.software({ + x264: { preset: (options.presetH26x as any) ?? "superfast" }, + x265: { preset: (options.presetH26x as any) ?? "superfast" }, + }), + videoCodec: Utils.normalizeVideoCodec("H264"), + width: 1280, + height: 720, + bitrateVideo: bitrateVideo, + frameRate: fps, + includeAudio: options.includeAudio !== false, + customHeaders: { + "User-Agent": + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.3", + Connection: "keep-alive", + }, + }); + + currentCommand = command; + + const globalAny: any = globalThis; + const onData = (chunk: Buffer) => { + try { + globalAny.broadcastVideoToWeb?.(chunk); + } catch { + // ignore } - } else { - videoSource = source; - audioSource = source; - } + }; + output.on("data", onData); - const inputFFmpegArgs = [ - "-headers", - "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.3\r\nConnection: keep-alive\r\n", - ]; - - if (typeof videoSource === "string" && videoSource.startsWith("http")) { - videoOptions.inputFFmpegArgs = inputFFmpegArgs; - } - if (typeof audioSource === "string" && audioSource.startsWith("http")) { - audioOptions.inputFFmpegArgs = inputFFmpegArgs; - } - - activeVideo = stream.playVideo(videoSource, videoOptions); - if (options.includeAudio !== false) { - activeAudio = stream.playAudio(audioSource, audioOptions); - } + command.on("error", (err: Error) => { + console.error("Transcoder error:", err); + }); try { - await waitForFinish(); + await dankPlayStream(output, this.dankStreamer, { + type: "go-live", + width: 1280, + height: 720, + frameRate: fps, + }); } finally { + output.off("data", onData); stop(); } }, @@ -190,33 +126,12 @@ export class Streamer { } } -export function prepareStream(source: string, _options: any): { - command: ChildProcess | { kill?: (signal: NodeJS.Signals) => unknown }; - output: Readable; -} { - const opts: TranscoderOptions = { - fps: _options?.fps ?? 30, - bitrate: _options?.bitrate ?? "2500k", - preset: _options?.presetH26x ?? _options?.preset ?? "superfast", - }; - const { command, output } = prepareTranscoder(source, opts); - return { command, output }; +export function prepareStream(source: string, _options: any): any { + return { command: null, output: new PassThrough() }; } -export async function playStream( - output: Readable, - _streamer: Streamer, - _options?: object, -): Promise { - // Simple implementation: consume the stream until end. In production - // this should attach the stream to a WebRTC connection for Discord. - return new Promise((resolve, reject) => { - output.on("end", resolve); - output.on("close", resolve); - output.on("error", (err) => reject(err)); - // Ensure data flows - if (output.readable) output.resume(); - }); +export async function playStream(): Promise { + return; } export async function createStreamSession( @@ -232,7 +147,6 @@ export async function playPreparedStream( session: StreamSession, options: StreamPlayOptions = {}, ): Promise { - // Default behavior: forward resource (string or Readable) to session.play. await session.play(source, options); } @@ -241,29 +155,5 @@ export async function playTranscodedPreparedStream( session: StreamSession, options: StreamPlayOptions = {}, ): Promise { - if (typeof source === "string" && /^(https?:)?\/\//.test(source)) { - const { command, output } = prepareStream(source, options); - const globalAny: any = globalThis; - const onData = (chunk: Buffer) => { - try { - globalAny.broadcastVideoToWeb?.(chunk); - } catch { - // ignore errors broadcasting - } - }; - output.on("data", onData); - try { - await session.play(output, options); - } finally { - output.off("data", onData); - try { - command.kill?.("SIGKILL"); - } catch (e) { - // ignore - } - } - return; - } - await session.play(source, options); } diff --git a/src/webserver.ts b/src/webserver.ts index c4a3249..f16199d 100644 --- a/src/webserver.ts +++ b/src/webserver.ts @@ -213,8 +213,10 @@ export async function startWebserver( getVoiceStatus: () => voiceController.getStatus(), streamer, useTranscoder: true, - onBeforeStreamStart: async () => { + onBeforeStreamStart: async (guildId: string, channelId: string) => { await voiceController.disconnect(); + // Wait for Discord gateway to fully process the disconnect + await new Promise((resolve) => setTimeout(resolve, 1500)); }, onAfterStreamEnd: async (guildId: string, channelId: string) => { const current = voiceController.getStatus();