Merge pull request #277 from arabcoders/dev

Minor improvements.
This commit is contained in:
Abdulmohsen 2025-05-23 02:08:13 +03:00 committed by GitHub
commit 4398b30b38
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
22 changed files with 9488 additions and 7619 deletions

View file

@ -46,6 +46,8 @@ env:
DOCKERHUB_SLUG: arabcoders/ytptube DOCKERHUB_SLUG: arabcoders/ytptube
GHCR_SLUG: ghcr.io/arabcoders/ytptube GHCR_SLUG: ghcr.io/arabcoders/ytptube
PLATFORMS: linux/amd64 PLATFORMS: linux/amd64
PNPM_VERSION: 10
NODE_VERSION: 20
jobs: jobs:
build-pr: build-pr:
@ -55,17 +57,23 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install frontend dependencies - name: Install pnpm
uses: bahmutov/npm-install@v1 uses: pnpm/action-setup@v4
with: with:
working-directory: ui version: ${{ env.PNPM_VERSION }}
install-command: yarn --production --prefer-offline --frozen-lockfile
- name: Build frontend - name: Install Node.js
uses: bahmutov/npm-install@v1 uses: actions/setup-node@v4
with: with:
working-directory: ui node-version: ${{ env.NODE_VERSION }}
install-command: yarn run generate cache: pnpm
cache-dependency-path: 'ui/pnpm-lock.yaml'
- name: Install frontend dependencies & Build
working-directory: ui
run: |
pnpm install --production --prefer-offline --frozen-lockfile
pnpm run generate
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@v3 uses: docker/setup-qemu-action@v3
@ -92,17 +100,23 @@ jobs:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Install frontend dependencies - name: Install pnpm
uses: bahmutov/npm-install@v1 uses: pnpm/action-setup@v4
with: with:
working-directory: ui version: ${{ env.PNPM_VERSION }}
install-command: yarn --production --prefer-offline --frozen-lockfile
- name: Build frontend - name: Install Node.js
uses: bahmutov/npm-install@v1 uses: actions/setup-node@v4
with: with:
working-directory: ui node-version: ${{ env.NODE_VERSION }}
install-command: yarn run generate cache: pnpm
cache-dependency-path: 'ui/pnpm-lock.yaml'
- name: Install frontend dependencies & Build
working-directory: ui
run: |
pnpm install --production --prefer-offline --frozen-lockfile
pnpm run generate
- name: Update Version File - name: Update Version File
uses: ArabCoders/write-version-to-file@master uses: ArabCoders/write-version-to-file@master

4
.vscode/launch.json vendored
View file

@ -13,7 +13,7 @@
"--port", "--port",
"8082" "8082"
], ],
"runtimeExecutable": "yarn", "runtimeExecutable": "pnpm",
"type": "node", "type": "node",
"cwd": "${workspaceFolder}/ui", "cwd": "${workspaceFolder}/ui",
"env": { "env": {
@ -45,7 +45,7 @@
"run", "run",
"generate" "generate"
], ],
"runtimeExecutable": "yarn", "runtimeExecutable": "pnpm",
"type": "node", "type": "node",
"cwd": "${workspaceFolder}/ui", "cwd": "${workspaceFolder}/ui",
"console": "internalConsole", "console": "internalConsole",

View file

@ -37,6 +37,7 @@
"libcurl", "libcurl",
"libx", "libx",
"matroska", "matroska",
"mbed",
"Microformat", "Microformat",
"microformats", "microformats",
"mkvtoolsnix", "mkvtoolsnix",

View file

@ -2,9 +2,9 @@ FROM node:lts-alpine AS node_builder
WORKDIR /app WORKDIR /app
COPY ui ./ COPY ui ./
RUN if [ ! -f "/app/exported/index.html" ]; then yarn install --production --prefer-offline --frozen-lockfile && yarn run generate; else echo "Skipping UI build, already built."; fi RUN if [ ! -f "/app/exported/index.html" ]; then pnpm install --production --prefer-offline --frozen-lockfile && pnpm run generate; else echo "Skipping UI build, already built."; fi
FROM python:3.11-alpine AS python_builder FROM python:3.13-alpine AS python_builder
ENV LANG=C.UTF-8 ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8 ENV LC_ALL=C.UTF-8
@ -21,7 +21,7 @@ ARG PIPENV_FLAGS="--deploy"
COPY ./Pipfile* . COPY ./Pipfile* .
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install ${PIPENV_FLAGS} RUN PIPENV_VENV_IN_PROJECT=1 pipenv install ${PIPENV_FLAGS}
FROM python:3.11-alpine FROM python:3.13-alpine
ARG TZ=UTC ARG TZ=UTC
ARG USER_ID=1000 ARG USER_ID=1000
@ -72,5 +72,4 @@ HEALTHCHECK --interval=10s --timeout=20s --start-period=10s --retries=3 CMD [ "/
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]
CMD ["/opt/python/bin/python", "/app/app/main.py", "--ytp-process"]
CMD ["/opt/python/bin/python", "/app/app/upgrader.py", "--run", "--ytptube-mp"]

View file

@ -28,4 +28,4 @@ yt-dlp = "*"
[dev-packages] [dev-packages]
[requires] [requires]
python_version = "3.11" python_version = "*"

548
Pipfile.lock generated
View file

@ -1,11 +1,11 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "5cff673a1115f2ebff5a501564e11b7388af390c2a098bef13a189ea460c7bc6" "sha256": "48fcd9e2b5944d90ebb226668ac120414836e416bea2685411b1c0184f29d7df"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
"python_version": "3.11" "python_version": "*"
}, },
"sources": [ "sources": [
{ {
@ -637,113 +637,113 @@
}, },
"multidict": { "multidict": {
"hashes": [ "hashes": [
"sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", "sha256:0327ad2c747a6600e4797d115d3c38a220fdb28e54983abe8964fd17e95ae83c",
"sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", "sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0",
"sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", "sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c",
"sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", "sha256:0e05c39962baa0bb19a6b210e9b1422c35c093b651d64246b6c2e1a7e242d9fd",
"sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", "sha256:0f14ea68d29b43a9bf37953881b1e3eb75b2739e896ba4a6aa4ad4c5b9ffa145",
"sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", "sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f",
"sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", "sha256:19d08b4f22eae45bb018b9f06e2838c1e4b853c67628ef8ae126d99de0da6395",
"sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", "sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c",
"sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", "sha256:232b7237e57ec3c09be97206bfb83a0aa1c5d7d377faa019c68a210fa35831f1",
"sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", "sha256:2e543a40e4946cf70a88a3be87837a3ae0aebd9058ba49e91cacb0b2cd631e2b",
"sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", "sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2",
"sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", "sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e",
"sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", "sha256:33a12ebac9f380714c298cbfd3e5b9c0c4e89c75fe612ae496512ee51028915f",
"sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", "sha256:343892a27d1a04d6ae455ecece12904d242d299ada01633d94c4f431d68a8c49",
"sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", "sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd",
"sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", "sha256:3ef4e9096ff86dfdcbd4a78253090ba13b1d183daa11b973e842465d94ae1772",
"sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", "sha256:4219390fb5bf8e548e77b428bb36a21d9382960db5321b74d9d9987148074d6b",
"sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", "sha256:496bcf01c76a70a31c3d746fd39383aad8d685ce6331e4c709e9af4ced5fa221",
"sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", "sha256:49a29d7133b1fc214e818bbe025a77cc6025ed9a4f407d2850373ddde07fd04a",
"sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", "sha256:4d7b50b673ffb4ff4366e7ab43cf1f0aef4bd3608735c5fbdf0bdb6f690da411",
"sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", "sha256:4efc31dfef8c4eeb95b6b17d799eedad88c4902daba39ce637e23a17ea078915",
"sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", "sha256:4f5f29794ac0e73d2a06ac03fd18870adc0135a9d384f4a306a951188ed02f95",
"sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", "sha256:4ffc3c6a37e048b5395ee235e4a2a0d639c2349dffa32d9367a42fc20d399772",
"sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", "sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51",
"sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", "sha256:51d662c072579f63137919d7bb8fc250655ce79f00c82ecf11cab678f335062e",
"sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", "sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275",
"sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", "sha256:5363f9b2a7f3910e5c87d8b1855c478c05a2dc559ac57308117424dfaad6805c",
"sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", "sha256:55ae0721c1513e5e3210bca4fc98456b980b0c2c016679d3d723119b6b202c42",
"sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", "sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd",
"sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", "sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601",
"sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", "sha256:5e0ba18a9afd495f17c351d08ebbc4284e9c9f7971d715f196b79636a4d0de44",
"sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", "sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781",
"sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", "sha256:603f39bd1cf85705c6c1ba59644b480dfe495e6ee2b877908de93322705ad7cf",
"sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", "sha256:60d849912350da557fe7de20aa8cf394aada6980d0052cc829eeda4a0db1c1db",
"sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", "sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b",
"sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", "sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3",
"sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", "sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de",
"sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", "sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031",
"sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", "sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8",
"sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", "sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf",
"sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", "sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156",
"sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", "sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9",
"sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", "sha256:73484a94f55359780c0f458bbd3c39cb9cf9c182552177d2136e828269dee529",
"sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", "sha256:75493f28dbadecdbb59130e74fe935288813301a8554dc32f0c631b6bdcdf8b0",
"sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", "sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780",
"sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", "sha256:7e23f2f841fcb3ebd4724a40032d32e0892fbba4143e43d2a9e7695c5e50e6bd",
"sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", "sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc",
"sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", "sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9",
"sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", "sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f",
"sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", "sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed",
"sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", "sha256:87cb72263946b301570b0f63855569a24ee8758aaae2cd182aae7d95fbc92ca7",
"sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", "sha256:8adee3ac041145ffe4488ea73fa0a622b464cc25340d98be76924d0cda8545ff",
"sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", "sha256:8cc403092a49509e8ef2d2fd636a8ecefc4698cc57bbe894606b14579bc2a955",
"sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", "sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1",
"sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", "sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373",
"sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", "sha256:93ec84488a384cd7b8a29c2c7f467137d8a73f6fe38bb810ecf29d1ade011a7c",
"sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", "sha256:941f1bec2f5dbd51feeb40aea654c2747f811ab01bdd3422a48a4e4576b7d76a",
"sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", "sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d",
"sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", "sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69",
"sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", "sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15",
"sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", "sha256:9bbf7bd39822fd07e3609b6b4467af4c404dd2b88ee314837ad1830a7f4a8299",
"sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", "sha256:9c17341ee04545fd962ae07330cb5a39977294c883485c8d74634669b1f7fe04",
"sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", "sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740",
"sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", "sha256:9faf1b1dcaadf9f900d23a0e6d6c8eadd6a95795a0e57fcca73acce0eb912065",
"sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", "sha256:9fcad2945b1b91c29ef2b4050f590bfcb68d8ac8e0995a74e659aa57e8d78e01",
"sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", "sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e",
"sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", "sha256:a4d1cb1327c6082c4fce4e2a438483390964c02213bc6b8d782cf782c9b1471f",
"sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", "sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26",
"sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", "sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1",
"sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", "sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a",
"sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", "sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b",
"sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", "sha256:b308402608493638763abc95f9dc0030bbd6ac6aff784512e8ac3da73a88af08",
"sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", "sha256:b61e98c3e2a861035aaccd207da585bdcacef65fe01d7a0d07478efac005e028",
"sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", "sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93",
"sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", "sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb",
"sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", "sha256:bb5ac9e5bfce0e6282e7f59ff7b7b9a74aa8e5c60d38186a4637f5aa764046ad",
"sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", "sha256:bb61ffd3ab8310d93427e460f565322c44ef12769f51f77277b4abad7b6f7223",
"sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", "sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20",
"sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", "sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac",
"sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", "sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e",
"sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", "sha256:c04157266344158ebd57b7120d9b0b35812285d26d0e78193e17ef57bfe2979a",
"sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", "sha256:c10d17371bff801af0daf8b073c30b6cf14215784dc08cd5c43ab5b7b8029bbc",
"sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", "sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab",
"sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", "sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4",
"sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", "sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0",
"sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", "sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd",
"sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", "sha256:d1a20707492db9719a05fc62ee215fd2c29b22b47c1b1ba347f9abc831e26683",
"sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", "sha256:d1f7cbd4f1f44ddf5fd86a8675b7679176eae770f2fc88115d6dddb6cefb59bc",
"sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", "sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645",
"sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", "sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e",
"sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", "sha256:d5b1cc3ab8c31d9ebf0faa6e3540fb91257590da330ffe6d2393d4208e638925",
"sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", "sha256:d693307856d1ef08041e8b6ff01d5b4618715007d288490ce2c7e29013c12b9a",
"sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", "sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0",
"sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", "sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046",
"sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", "sha256:d83f18315b9fca5db2452d1881ef20f79593c4aa824095b62cb280019ef7aa3d",
"sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", "sha256:d877447e7368c7320832acb7159557e49b21ea10ffeb135c1077dbbc0816b598",
"sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", "sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2",
"sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", "sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2",
"sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", "sha256:e32053d6d3a8b0dfe49fde05b496731a0e6099a4df92154641c00aa76786aef5",
"sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", "sha256:e5f8a146184da7ea12910a4cec51ef85e44f6268467fb489c3caf0cd512f29c2",
"sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", "sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b",
"sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", "sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482",
"sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", "sha256:fad6daaed41021934917f4fb03ca2db8d8a4d79bf89b17ebe77228eb6710c003",
"sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" "sha256:fc60f91c02e11dfbe3ff4e1219c085695c339af72d1641800fe6075b91850c8f"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==6.4.3" "version": "==6.4.4"
}, },
"mutagen": { "mutagen": {
"hashes": [ "hashes": [
@ -868,169 +868,181 @@
}, },
"pycryptodome": { "pycryptodome": {
"hashes": [ "hashes": [
"sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4",
"sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c",
"sha256:2988ffcd5137dc2d27eb51cd18c0f0f68e5b009d5fec56fbccb638f90934f333", "sha256:14e15c081e912c4b0d75632acd8382dfce45b258667aa3c67caf7a4d4c13f630",
"sha256:37ddcd18284e6b36b0a71ea495a4c4dca35bb09ccc9bfd5b91bfaf2321f131c1", "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f",
"sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27",
"sha256:56c6f9342fcb6c74e205fbd2fee568ec4cdbdaa6165c8fde55dbc4ba5f584464", "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a",
"sha256:87a88dc543b62b5c669895caf6c5a958ac7abc8863919e94b7a6cafd2f64064f", "sha256:350ebc1eba1da729b35ab7627a833a1a355ee4e852d8ba0447fafe7b14504d56",
"sha256:8f4f6f47a7f411f2c157e77bbbda289e0c9f9e1e9944caa73c1c2e33f3f92d6e", "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef",
"sha256:96e73527c9185a3d9b4c6d1cfb4494f6ced418573150be170f6580cb975a7f5a", "sha256:45c69ad715ca1a94f778215a11e66b7ff989d792a4d63b68dc586a1da1392ff5",
"sha256:98fd9da809d5675f3a65dcd9ed384b9dc67edab6a4cda150c5870a8122ec961d", "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477",
"sha256:9dbb749cef71c28271484cbef684f9b5b19962153487735411e1020ca3f59cb1", "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886",
"sha256:9e1bb165ea1dc83a11e5dbbe00ef2c378d148f3a2d3834fb5ba4e0f6fd0afe4b", "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a",
"sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75",
"sha256:a26bcfee1293b7257c83b0bd13235a4ee58165352be4f8c45db851ba46996dc6", "sha256:63dad881b99ca653302b2c7191998dd677226222a3f2ea79999aa51ce695f720",
"sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339",
"sha256:a6cf9553b29624961cab0785a3177a333e09e37ba62ad22314ebdbb01ca79840", "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625",
"sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490",
"sha256:b4bdce34af16c1dcc7f8c66185684be15f5818afd2a82b75a4ce6b55f9783e13", "sha256:6fe8258e2039eceb74dfec66b3672552b6b7d2c235b2dfecc05d16b8921649a8",
"sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b",
"sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", "sha256:7ac1080a8da569bde76c0a104589c4f414b8ba296c0b3738cf39a466a9fb1818",
"sha256:d4d1174677855c266eed5c4b4e25daa4225ad0c9ffe7584bb1816767892545d0", "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a",
"sha256:e653519dedcd1532788547f00eeb6108cc7ce9efdf5cc9996abce0d53f95d5a9", "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002",
"sha256:e7514a1aebee8e85802d154fdb261381f1cb9b7c5a54594545145b8ec3056ae6", "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae",
"sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", "sha256:93837e379a3e5fd2bb00302a47aee9fdf7940d83595be3915752c74033d17ca7",
"sha256:f1ae7beb64d4fc4903a6a6cca80f1f448e7a8a95b77d106f8a29f2eb44d17547", "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d",
"sha256:f5810bc7494e4ac12a4afef5a32218129e7d3890ce3f2b5ec520cc69eb1102ad", "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265",
"sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39",
"sha256:f7a683bc9fa585c0dfec7fa4801c96a48d30b30b096e3297f9374f40c2fedafc", "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566",
"sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723" "sha256:a7fc76bf273353dc7e5207d172b83f569540fc9a28d63171061c42e361d22353",
"sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b",
"sha256:b34e8e11d97889df57166eda1e1ddd7676da5fcd4d71a0062a760e75060514b4",
"sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2",
"sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575",
"sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6",
"sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843",
"sha256:d8e95564beb8782abfd9e431c974e14563a794a4944c29d6d3b7b5ea042110b4",
"sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446",
"sha256:ddb95b49df036ddd264a0ad246d1be5b672000f12d6961ea2c267083a5e19379",
"sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa",
"sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be",
"sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
"version": "==3.22.0" "version": "==3.23.0"
}, },
"pyjson5": { "pyjson5": {
"hashes": [ "hashes": [
"sha256:00361a0aaabc3162992087d83bc067517c95c35810b631d9a40b80732003066e", "sha256:001440b986f226e65237179a2a9721f0e78d6e75a7779d9941d0f10522fce12c",
"sha256:052ed8ee6b9d9631db66ca29799f9d37ee8c3ce77ca7b44d169495149eefd893", "sha256:0014adf743c4093df511934a6bca5b1e3592b36b96ff86bd74b0c4de05beafe1",
"sha256:06b857a5a36f2bad52267d1a57a880cd62c3b0d3f3a719ab8599a1d5465e2417", "sha256:03742b454bede9a61c2003574b74c8ba5de5d8363b0630f89a164d17bb7562a8",
"sha256:0a2c476a829a5dc823fb381154be6532355588db1d13df9b2e524b022faf14d7", "sha256:09cbd1dc018bf5d3ec34128635df0545f2074bb019c00e37b885a03a454eef00",
"sha256:0c75758dd26d233f6bea4c6479a933c5092b15b6dc706cf14dc94218089285a9", "sha256:0ad9c24d20ce825df70701361c7b7da04f703f8f5ff3cf565b156ff02e24db02",
"sha256:0e39d7414ea02439bbd4f7d0c9fb2607a4cda1061eeee853bb046b2df39f0b26", "sha256:0ae55ee48ffb5a7f9fc22c135d38f31fc2db43b8dfc69b1285476123fe641697",
"sha256:0fac0c9137785ceabd7ec48bfdd4b87eb11e186c495fd02c1a6e0e0af24a0979", "sha256:10412ccc4fffbcd07187e4b0016bbedb1a22adf7bcd8eb4c78823a7e3cf32b9f",
"sha256:10688e75fd9f18e34dddd111cafd87cca6727837469b8bfb61f2d2685490f976", "sha256:1442d68d81b5fd61e98fbb19be1bf6fe845bc0550fc37660d415f7f7bd7cfe27",
"sha256:1550dc70199401056f80acfc503da36de2df70dd4364a0efb654ffe7e9246ac6", "sha256:1f1f9bf8a097f3c2436028be563ba6fbce75cb48c1a7142c67e935fd8b63ae07",
"sha256:16aadc503f247428988cba0e71f83bbd426383ba4b3658b1ca68df80783bba73", "sha256:20c2333f45497452adf803dbc24aedd471303d22942cc26b3806bbd7ca668608",
"sha256:19636485a5799a33ee4e9d1eabc5097d25c16ae08be340ee5a2c9d548d33297d", "sha256:21d7687a9377b05d112580f13f6b03555a2da1555e44c592902026bc14a98989",
"sha256:1abe62fa9cc8cad77a52979a17aa092fe55630c7dd5b37156e64f4fb278aebc9", "sha256:22dc2201250b665771669093894311991d6517f92a78efb2d63dae2353132180",
"sha256:1aed6425a5645b74d93f99ec56e6412e843c252c40e647a8c7856c3e8e828819", "sha256:27488b7a015077ccf800db536fc52d0fd870c7493f92db7f5f27e3150ac4c3f9",
"sha256:1fa2bcdfbeac1d3c1220b1fd53edc6db0fdb9e7f71410161d3a26a9f29580839", "sha256:28bce6656db6552ae05d6d1117793ee19113b23923a47586f684d9b0a13da0e8",
"sha256:1fa3b0a34920615c555958b7656e450fc682bdf61410814495b7947168ca529b", "sha256:2ba2866a42a31b0aaab292f141f6b535cca47983786ed38f0ab7e128c0c70d27",
"sha256:208b8bf374c42f4ce7ca0a735da8ad508285f7c36268eab7ecb01e1e66fbb309", "sha256:2bbb2bb8af94128cb05361c6d8dd3cdca240e8c02920d6723e93b7d8c127b9d7",
"sha256:24c6206f508c169034fd851eb87af3aec893d2eca3bf14df65eecc520da16883", "sha256:2f0096855d931023c23846537b53c1af3f070ac2cb71a44a516fb80550516167",
"sha256:25ab666bd4a400a7060d6aa508d84674f8c2dd6c15ca04ccdf524aa02ae96fff", "sha256:30cf465a427d0264e2e71b8cb75d606eca00090b4eeadf9ac18f691e032b89c7",
"sha256:260b6f2d7148f5fa23d817b82e9960a75a44678116d6a5513bed4e88d6697343", "sha256:3541f78103dab48a43326c4fe47a6175c21b76cf8104f58d8a9822fc6f54fd6d",
"sha256:2ae856525e4d178a05771c4c593c8ec5625480d916cd81e544f5abd9376e929c", "sha256:364372ebcc1770abd35c6a67e0716d3419117d536e1383baed45de364ecfaace",
"sha256:2b7f692b6454d78ddfca8450e294631299d8cb0ab80d90bffdac88da0803ad8d", "sha256:384ce0c40ae635f6cb9f3b653bbf6e93f10207a98d51301805a37a0a47d168da",
"sha256:2bbfdeeb531f79730899ef674d80dd6b6bc7c29fe3789660115f0ba66eef834f", "sha256:39b0e9641ca70efa6f7ff725afda83e3eb4a84b1a97d0c38aa13abe5622c4e1d",
"sha256:2d682d4e0dfdeb76c950fa7dd61139b70b0309d3908ef6e7dd1a75e2ef166365", "sha256:406eaf4bb7e5354f5d3f5e1d34f7afd1d971696798cba88e65a53971b5d557e7",
"sha256:2dea723f88e89dba1d4a6542c5527cac7ecff6755291ad2eb60e1c2f578bb69f", "sha256:429256f888ce0d61066f070ad696ded9c6d62a8570aef6b683356f9ca0d8f9c0",
"sha256:32857cec9deb18fa4edb9dccf261066f7d5b2b4fadc901cbe99938d553ae5bfa", "sha256:452ddb98b1ccf738dc722d3ce7fa7640c8f7345d68dc077c383fb141e35b88da",
"sha256:339e0813957c9ca0950c30b72e366a00f48a233051cedb5e1a77c3004d95428a", "sha256:46841aed0b414aabbedc9d0df4d0568833c5c6c29d58a4550575a4a4b6365206",
"sha256:344bda09e56492ecb7b7180ef27fa3a6664105f4b27a77ac9933076eac3a2afd", "sha256:469abb3e01556e608f4931bf4217af575c51fbf2e3b05067b6ab2f24ae59015b",
"sha256:357e861d1dd0906d8233e2c18fc77ebda6eee3e2ca460fafc443c9df9eb0a5e7", "sha256:5382de2408dc5e66cf397558f47fa99c19c0b52082453350d952ae371150b8f1",
"sha256:3948742ff2d2f222ab87cc77d8c6ce8a9ef063fe2904f8fa88309611a128147a", "sha256:55f299cc8ee717951cb5ba866d85ab2d6c083965d47f4568b340591a2145136c",
"sha256:3e8807fbb37eab3de4ebf2584e1b94677311a9adc17202ca36945f1d5976e747", "sha256:5797c32db7acc41402b0c999f4f0cf1ed7ffdd9df2b2d84bc754e59c644999d0",
"sha256:3fd513eaffba7b72d56bd5b26a92e2edb3694602adcaf3414a9f7d6c4c5d9be7", "sha256:58020a57d49c6baf142c6891fc932cdc7474020841eb624918ab3a5af4694a47",
"sha256:3ff32694ff70d8ebe80c8989a670d6a42561b20cb3fff9b7db41b5b460e4fd4e", "sha256:5809a30c8bdb68831cc7c00cc260b3a3e8185b04516058394717f90d9f00f428",
"sha256:404a227befcb3a18736869b89bb0269de102ce1f671bfd0b7deb8c23f345f71b", "sha256:594ceb310e99d9fe0d3e74361841cc535561ef52a79c0aaa8b6d640d11f43eb2",
"sha256:40e840b4e7ec92b944ba03654b2f94b4509f6c77c4b5d74348830983ea711873", "sha256:5c589dc2bb48e6229f6fddf0f86634534b24f19960273475429e3ba690118a96",
"sha256:46173d6d66ed1a9e3173f489132535a5387116d54954ac527e2244b067cc9296", "sha256:5c91a06dad5cb73127b0ef4e1befff836f65244278372a94751367dfb0a80af5",
"sha256:4958a06958e9f50cc5f60af76236b9ce256b4ab655e3d50d166e8598aafefe43", "sha256:5e334220158e3789fb1c7e67ca200ade1d17c70ddd1373dc1d39d5808645905f",
"sha256:4a58185b9ac3adfed0adf539be7293d76fe0f7c515b6f9982b225c8084027255", "sha256:5efd518c27b63f74c59f79aa9e3892f6d18cef9fc400be3bb05a12b90896a97e",
"sha256:4f057998f98de42644dac09c10e69c4e283724bde581e516c2e3ace6e4f5d248", "sha256:632d331ba0de878e5a8a4fe4a3bc7a68225dcd87ba87a429ee92434535d057ca",
"sha256:4fe4971ff95058bf25b9eb2928ee01b63ff89dff3625baeb1ba414b42f09017a", "sha256:64d04cc1fd7cc2e02e770db9f9ddde69d95f6385a17f135642a1d9b15d6ca326",
"sha256:515c89e7063100bcc7c67292559bdd926da19b59fe00281e9dd2fa83f30747f1", "sha256:6a307e7bc6df85f3b1b54f62ce0dc2f784115b839d8d2d949705a11e2b0ad517",
"sha256:51d8ef9626ceb75352fa0bc2a99c173de493c910e5b0de9dfeee2680c4eeafd4", "sha256:6aea9a2bf0c66ca9a966c9198949c1efdf6a61c4e00d42cb4f3047d4b3b0eb3e",
"sha256:54b680e763acb81d67b98faa817c197451bdb44d53198aff32703d542c6465fe", "sha256:6f568fd0b0adc4f152aaa58493ab88543289ee30a2b5a1d20cbc63cae12fe3c5",
"sha256:571534c8b64116b411a66ab50cb04e9c7f0b574cbfefacd5bc31f97d5395965a", "sha256:70910ffadb8f10e69a9a379cd4712ab41785957f6b739cfe3c9c14146eae1fcd",
"sha256:57b9bf670c8d524e213fac1065cd90b168d7c7e5fc9fbad7219a2de70b9d6761", "sha256:7112cf79212c5634f6af1e15e26998690cd6e4393243fd62570702efb224dc54",
"sha256:59c261624e93e2da0752b91234df1c222a1ef1cc1e5a708bb7661aee974920a8", "sha256:74cb4e173de02d78bca5e21e0ed433df880f4e976104e49a559ee430545f6bbb",
"sha256:5a1391adcf78a52004d48a80fa82f950e8a0983b773a7bedfddcea8dfa442eb8", "sha256:759a6742b72045cfdf188d3af7058dc8a8d63e47b265c344a2a68dc40d156bf3",
"sha256:5a379911161545aa57bd6cd97f249cabcfe5990688f4dff9a8f328f5f6f231d3", "sha256:7709c097d60518d0be59504020b4549694ffd01c2bccb583bf489a3de8f54da8",
"sha256:5e7f5b92460dc69ce27814d4ab546e3bae84b9b2e26f29701ad7fab637e6bf2f", "sha256:7bd659d782bb5b5ef84fbfcd57cdef19c4178a4c83bb0dc82b5e7d5157d17d15",
"sha256:628188b3882edac2a3171e52959348834bf166683ba2f0ed41086a6556523cd5", "sha256:81248399ee082aecaa6b5c5019063826c5bd80c6bbb39a67952f7cbeffa24fd9",
"sha256:65a8dc57f815dd935a5bf3006a58d00892b8d2d2168c4e3b382104a9fc762752", "sha256:82eff8cecd2744c5c9becc0c60fd15b8d96f272e358dcb27c993d138ff09e650",
"sha256:65f2922cc8fd6b1e9cc8ff7e5fe975f7bf111c03eb06ed9b2ee793e6870d3212", "sha256:82fdeb5754a772d8ed7d67982a3f64fb9b1eb0b3fb6daf7a061921eefba23326",
"sha256:660f58321f3c8e06f62b83ffd9867e2721916e1c87b1a7e936314226cfc0803c", "sha256:8524228411e312f19afb417d3dae4e34a2f4f7094fb992aa93b9413111fd1765",
"sha256:671f9e68c54db7f894808ca9921d638fc92a2d7e6fcf67ac030c9ec6ff7add34", "sha256:86650998b4d0d08795429ee1814342833896989d65d8dc1deb9a544cd2d38434",
"sha256:681e52df0705056dc39cf7d7bec4161e2769437fdf89f55084a4b060e9bbbfc9", "sha256:88e784397d44c14c70af472e7e0d5e141d8ec67a406aaa1e465ed0e0a0b62dd1",
"sha256:6894bb4558dab2989f75cf816eb49020765015830a95ddd2a48c20c2d4fbc859", "sha256:897f8534a384ab10e11140c0852f1397af2d8d7c064b50eb41a1c6973da95a2a",
"sha256:6bda3c48c5eb1ac4daee5dd5204e38e6751f74ad23840a8d98f25582578a3852", "sha256:8b1c159806c6967c8e2d32bb2d9f99f610071777f84133be5479ce1b318330b7",
"sha256:701db0660e434fae000e5d4d49efc0b80fbeedf938cbcc8b6d72c229d395feca", "sha256:8b9e409f0eca16f3fbbf31f0d6e50b1779a88c8b8c550acc92604b2e3bca1450",
"sha256:7296e0d2e1b2a9fd63cdc95b5dc2c9cd8098a60449fc93e802d23855383b6ea4", "sha256:8fb78a9da81674b13df0ebf7b299897b0aa734a944028b639743225c6aa4caac",
"sha256:72fa22291149e8731c4bbc225cf75a41a049a54903018ca670c849658c1edc04", "sha256:90adaebc95819ed5fdb84881ae9083867cc5fd646c665433fd19459eb1ef1f7c",
"sha256:7489387590db81b7acba0b0ca5703173689745bf3b98b8386b912e125bf92595", "sha256:90c6ba0134a9217ee6dfed91a0020aa9d0366d27b1bbee63e6ed8b1f46ee813f",
"sha256:748f2db601c8347acd27be01cb27e18c151a16c307f4951712c2e93f92fd91b3", "sha256:92a80fce259648ba939c4783064c0245ad841881d73db9da9c4877d6c6ccc4e7",
"sha256:77005662014809a7b8b78f984131a3751295ff102f4c62b452bbdac946360166", "sha256:9398dfc696cdc45a9dcdd1c50051c5e259014d99482857ebea164201fafdbad0",
"sha256:77f4724dcb646c2d40ad45d5aa7a5af86d54dc38c78e27b795418ecca23248bb", "sha256:93c3f8feb95e599d1a1b87291b0c14693775512bdda4bf95dcef83c5d80e9c69",
"sha256:78bd729b58d590e2c0892c6c33d555e93d16bf86e38c296ff0525278973ae4d2", "sha256:9444ae9f8982b584ae2dbbecdd510189de577e879f794619afc62b5ea9109d26",
"sha256:7a11d3cd6114de90364c24876f1cd47dcecaffb47184ffffb01eb585c8810f4b", "sha256:94e6005e98ef5defb6c7aa3d7010723cb8faf3cf878b919241c9a857f95ad7e3",
"sha256:7c4de1cde04573cd220a042006d088b0d4a042b5270cb9e8ca0a3c16cfacf5e9", "sha256:950f4d162338f3c6223875d8eeb097b8ca76a5716664777594ef3b755bfdb936",
"sha256:7da4839a6a42fd4351bb7a9794651835fb7d8a55ced25c8781d31ccff15fec80", "sha256:9676a20a7fa05463e143bb6c2a479f0c4530ef9f81c0d1af764452f0ee3640c3",
"sha256:85a5a88d23e9fe54f452ea751720a153c199923c44b0cb61dd4ff20e0b3decbd", "sha256:96ea440ff46d5f05d79e09582007b4d887111dcbf971900a9c40e8de83e48d2d",
"sha256:89eeb08b5e77f59ac9040bbd93be637a8ea829c06173316756e2e9026dcf2393", "sha256:97401f7465dcba52da29d63718b2b69e2ca9b51cee64bdf0ae79279ebf100250",
"sha256:8fe8ba077a6ef01e6493696c27455eeae64e39ff4bd71a1a7bb66af40be7232c", "sha256:9aff233d66cb08f5fb4bab34bffc6007b71acff508607e723ebea3d0ec78236e",
"sha256:94e1b9d219f40bebbb6285840b094eca523481cf199cd46154044dae333d492d", "sha256:a4cf7e9f9a2f1194178864de70c7e152b0f07fa23ea3a8dcbcf35e8399403477",
"sha256:95295503ee7fa7a9428425da22e88ae2513f8e353fd25b653c58248ab706e2e1", "sha256:a5ee5b7eddc642595b648edf0ee9af5f997ded3e5cda4345b2a8de01766ccdb6",
"sha256:962bd6a2e8c295d21713f4262b4d680f4ba5ae4194b1a37222440c75a8140ade", "sha256:a719b276cacea63b28ab1d5de0f136a26732a7bedc7b5ef1a0c5a5747d852b42",
"sha256:970345b95004f12b5e7694b954c6c734497cfd52195e3cd36b8f44c81b858683", "sha256:a7c6fb7a1f1ffcd266ededfe3dec5bf68989ada9fedb238a3260d020386ea81c",
"sha256:9912aed5a76998867a27379b652883166051cd60522b643611a559a1021b7cf5", "sha256:a8ee704fee7e60767bcc91ac510a87ee551e2eb85e01a1353e67d8c3add0ce2a",
"sha256:9ae405a054886d544fbbd909f66dcfb5ae5a86a377c70d43799aa4691ac6e9ef", "sha256:aac39b8f1a9d0eea4e275ab2c4c45afc8221718b06444b12fc3ee4acb65ff7ce",
"sha256:9ee2f077cf05daa9aaf3c750b63cce5b5671cf8fa848b29beaf1030a08d94fda", "sha256:ab3c9783fb8a1b4362a6e7ce242e3c0a0e9ba4f372a678ad1802bb6199864d74",
"sha256:9f3e3c4ae939d478597e2c60c0fc7d4662c3ebeae7b11e05435a67d8b2d3e8a8", "sha256:b1b7909ca28e332979006692af9e3079e0e6fe883f0726201b67271e45f7871a",
"sha256:a4577a18545f3f4461df46d3d38d85659b16a77ca8975289ef6f21e1c228f7bf", "sha256:b1e71df87ee24b45b1e680d6efa75cacafc488d861285a983adf348576d264e7",
"sha256:a60abd461ff8776a01852cdbafc2b9016c4fbdcfb3a3c563745e5b31c074e227", "sha256:b4355d5f9edba434ef2a474d3fbfd91821be54e86b959ab12ccb1b48c9a872fe",
"sha256:a7bd59c9000a413ffa794d5feebd54475dffd2c65a5b0fa11e18fa084caa4146", "sha256:b7441803def1be9cf6e1f42d550f2ec37b459aa854cea4da5ecc8e03a9b52ed8",
"sha256:a903d111e4f0cf383a6e09e2c1e85152a2aa9d25b364c813025f6a947a10db60", "sha256:b8525cd88dba52b55ce5a4efaaaa05378c596ff6ec1ee7a500cca9fac12a001d",
"sha256:ab07960def3b195e013d97d7ba66fc15109c3481c1f66abf6e4dd5b27d15a0da", "sha256:bd7453845bfcb5e3af55206184da28af2a5beb8eaf5196dc2da81a7ba90fc12c",
"sha256:ade16f3c6fecced58f8274626fdc5c71fcf5f9ef6401d4a87b02a0c1b889ba86", "sha256:bd84d94e8422e14292f1acc8edcc7deaee313eb7475c113ba77a16c0ac384160",
"sha256:aebdd4c5a878f125fea8b192244b1e64532561a315725502eee8d7629598882f", "sha256:beb673830e1c8db01861cab2df06af51480091d69063d028d6f77557fa58eb05",
"sha256:af3d0bdeecb19e9bbf62c70ba4ee54664c986ccaadea2a6edf7552f2c700d4d5", "sha256:c04a350059667d5fa6768e0f2b2ae874ccf402309d8132dceacdf8a92f9a5bd9",
"sha256:b0cd98871646bfb2236cfdc0ae87f8ae8f1f631133b99fef5e74307248c4ae8d", "sha256:c39c6bc7a502778d860b5f8b09fe72c4c9d75a073233ffc5dee96df3290d9d16",
"sha256:b302cadffc93c936a6e81f02e1dc526d5fe17e2aa82f4d6f3034223b178d9d50", "sha256:c5e6b7fcbcaa08a8b59ff6b17162fde443d61ede8f8165bd67fa5719032ecd5e",
"sha256:b3ecee050a8a4b03cc4f1a7e9a0c478be757b46578fda1ea0f16ac8a24ba8e7a", "sha256:c626104ecf59907976ccccc8d47f0e07e3c2b1c45b21efcc84c71f96643b0f81",
"sha256:b77c94296cd0763bc2d7d276cb53dbc97edeacfbc50c02103521d586ca91ff37", "sha256:c89596795f24d9e3041867e8d801caeb46f0cf94e858f1820d71c185818c10ab",
"sha256:b7f48ec8a4dd01a4eddff56f654b4ad40ae9fdfff24834aada830b92de884027", "sha256:c94a85e46b3b9039d630bfcf8f0656dd205e921cad285d483940a2b0e79eabea",
"sha256:b802b1231aa102f5e404ec52eabf2118863146ef6e002c76da7b9af58d68e9e1", "sha256:cc2715ddadd685f674329a7aa48e5fdbbb96346d6f61981027e1cf4c70632067",
"sha256:b945ab6795423eff3c129628a910dfae7ac9009e300471436d4d405de27dfd15", "sha256:ced7da1c042fe086674bcd28817516fb858617af5a547862621f94827fe70d2f",
"sha256:bff832aebd269867deedae1b906b9b233ad909197debd747d28b4fbb509518e9", "sha256:d16dd99a8c8ca55e446633c6346fc4de30a4eff5eaf0d8376db95965e5acaf8f",
"sha256:c1c4313379c2faf9f7eaa9d3ecdf6bd19fec32c9b9b5b4ea18b63de4520dc8ce", "sha256:d2420b2ee2d68ce56f4c22fb471f738006ec0977e3666a21a9aaf441d963c38c",
"sha256:c2342007fcf4ed52260c2b7512ae3ec9694dbf72ec4990e43c69ab4d7646dc14", "sha256:d36ec72d063c4f1ea46b1d83f2fcdf63ba18c201a128f552e06d5f385f80e6f2",
"sha256:c32d633aef62fd8faef22b8a1f90eedeb139b6900cc5abaf12d6bd69e11a62f6", "sha256:d442b6575a1e002adfb1c99ae3002632ab2fdb4859150fdac1414974805e5fb7",
"sha256:c64b0cdc979c8e5f328ea9e3c3c9ad26dd47c6b037abcd9a3d83a13624539c86", "sha256:d55001960b1d9a6455e81804fbf6542b3d57b92c91166e55549eda52da9f3af0",
"sha256:c7e9cec9c9e9c2ad3561df2cebedbd4a7348b73ebb8a665ea99e3ce145beffbf", "sha256:d5c93042513df889a4fe05c9dbf5c47c7a5a05c54cc8a0094d685a9199efbd39",
"sha256:cc414b6ab28ed75d761c825f1150c19dd9a8f9b2268ee6af0173d148f018a8c5", "sha256:d6e678a71f8125bade49683ad60fa9798f8502d35eef2a93f13a5684bfe534b4",
"sha256:cc81e47e99558b61e96b9feb4822e959d8260c5f3757681e375f42b57fe8550c", "sha256:d71eae5c6c72f003e1303ce73f76f7a765e5d5cd216a4aae1c2e7711ba4c0dd2",
"sha256:d0a669c4f54721c938aae42320fe5cc93e77ed79eac8247e66abc624dd9fe4e4", "sha256:d9330aed86005d00339e65aca95cfe388e0d5b91a0fe063da8032be51b083130",
"sha256:d27f71da8a9d5de12e1c2c7ea060b029778efc5c0611de6401c1c3142991038d", "sha256:dbfeee33abe68c7c0952c3d9076e31056aba9a0877339dd85683dd63742f5e95",
"sha256:d622733cf671c8104a2936b3ff589903fa4e2fec5db4e2679297219446d944a7", "sha256:dc918fc4d88643763304f18a9742cbdff45b9163dc5e4cb3a38e2accedb67c5e",
"sha256:d6eee32d88c810c4cfb53cc6762ef3ac3c70d5e7bd76648d93c5e0ee103d3526", "sha256:df4f548fed26561c53cc0a8a19432b0f74e0837484b4b06bbe5eb951abbb4c06",
"sha256:d7b4a4b36a8748011c7586d4bba3eb403d82bdb62605e7478f2c8b11c7e01711", "sha256:e0c37d6ab63df496d01ecadf957a74879285ed7a7f6500af3c14e09c073a2c9b",
"sha256:d83e0bc87d94baa39703c1d7139c5ce7ff025a53a34251762128713a294cf147", "sha256:e22567f2533350f5d7ddafb76b5f5449867a44d8bbc85fb82cf27dde08f05eee",
"sha256:d8d3229287ff78ead13493b0613566473d0f4298dd3c827f91242bab9184133c", "sha256:e229fddb8e5dc7696a438cf72e279540ea281c2dae56b93c7c91bae14d812a93",
"sha256:db7df506cf28addb35f508aa0ea19485a188de7708e2760f3cca29750773ad0a", "sha256:e3468a3b8509648cf4d92ebc05fe94261330829137f225621b4778796b067c68",
"sha256:de914ea1dd7a49862e7395206bb8d92c65e60defb8eb4b86e3d24f973db5132f", "sha256:e6f670d9df62fa3b3fe724ee837950d855929617a854348846a9b5975096eb7d",
"sha256:e3aee51ef5feb4409ff36713f70251265b04c18c8322bc91d2578759225e918d", "sha256:e859101d682399a72cd1d96b0cfcb7110c054b870f0389d86e014161a21cdcdd",
"sha256:eebe950815df3d0206722c89ffc73f79fb11c202132d1ec08ebabb5d1f73433c", "sha256:e85cd01a583a02e5bda920e69d7dd425eba0ac9a6ff5be5c40abff8c2aa3b0fa",
"sha256:f02e405ec6b8d6255b2e6fec05526e71d254fe1345e1d428a7aa397e42d75761", "sha256:e8e6c4025878cd3e97af3eecfabfa088a17798cf8dbf42b60b57c81f494586a3",
"sha256:f3bc501e35ac49b4df950d7e14e5a53a5618e2ba36c6364be0733cc65800c80a", "sha256:f4a3215d5ecab101e0e9752d4aec6935ab45a82f6f0282283307bbab495c9677",
"sha256:f5d9086a74246412e61a0263f81fdad4cac6ce89b03924a601ea115a7d803d52", "sha256:f4f6dc39723048aa6d4816bb52e8ed50b5886b5ae92c3d6b4a7d62e6cf544779",
"sha256:f7c5d5a7af14bbe064cec79ca180da7cbe079316ea56994fbe657d083e02cfa2", "sha256:f51de3798f4f056a9dc27d8a845fcf1b317fa7eb30b33753e0b3190208b68a57",
"sha256:f89dfaf06fccbefcbca50f6a435b70cd47a46612be17114cac8fb6f85e65d0b2", "sha256:f5d48146117c3f6e16a0d4da0a4607a3d148894cc248ab6af4bd1832c6d4eac6",
"sha256:f8d5a208b8954758c75f8e8ae28d195bac3fae24ce9b51f6261b401e4ccce116", "sha256:f77023f210edf75764b3392d5b58736bfe42c80546e3f1b8e7bad182fdc4685d",
"sha256:f984d06902b2096206d15bcbc6f0c75c024de295294ca04c8c11aedc871e2da0", "sha256:f93192935e2cef0cc4eb675c2b2a0ec8e68a8efac890259351c8d7802a7193fe",
"sha256:fa7b84f9dc01cac5ac2e25d25af56911dda8d8ba3d4217c768431ba39ce4248d", "sha256:f9411294f7bb8d842c348aae59aa5b33ad8e76ce4a3a4ad9665d8fd04e018c0a",
"sha256:fd074295f9771eba2fd68843ed28c58d9835012dc7ebd48687649d9d92da9ee7", "sha256:fcb910e843e119bbe90f3898d5a95d1d0f452bb88b29614f76015b9b15fa5753",
"sha256:fd21ce9dd4733347b6a426f4f943dd20547befbd6ef502b7480944c84a1425a3", "sha256:fed7cf6605bbdb310395d81cc8abb4403ed88ae1f3c37256445e9c01ea073eab",
"sha256:fe03568ca61050f00c951501d70aaf68064ab5fecb3d84961ce743102cc81036" "sha256:ffd652318c2b483b4321a06c74ffe9281d8b795c996abcf6d6010129729f652e"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.7'", "markers": "python_version ~= '3.7'",
"version": "==1.6.8" "version": "==1.6.9"
}, },
"pysubs2": { "pysubs2": {
"hashes": [ "hashes": [
@ -1060,11 +1072,11 @@
}, },
"python-engineio": { "python-engineio": {
"hashes": [ "hashes": [
"sha256:a0c47c129c39777e8ebc6d18011efd50db2144e4e8f08983acae8a3614626535", "sha256:9ec20d7900def0886fb9621f86fd1f05140d407f8d4e6a51bef0cfba2d112ff7",
"sha256:f42a36a868d7063aa10ddccf6bd6117a169b6bd00d7ca53999772093b62014f9" "sha256:9f2b5a645c416208a9c727254316d487252493de52bee0ff70dc29ca9210397e"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.6'",
"version": "==4.12.0" "version": "==4.12.1"
}, },
"python-magic": { "python-magic": {
"hashes": [ "hashes": [
@ -1345,12 +1357,12 @@
}, },
"yt-dlp": { "yt-dlp": {
"hashes": [ "hashes": [
"sha256:53cd82bf13f12a1fe9c564b0004e001156b153c9247fa3cef14d1400ab359150", "sha256:a49c4b76afeaded6254c3e2b759d8d5a13271aa963d5fccb51fe059d1c313151",
"sha256:d01367d0c3ae94e35cb1e2eccb7a7c70e181c4ca448f4ee2374f26489d263603" "sha256:ea73854c5dabc124f29a35a8fae9bc5d422ef3231bebeea2bdfa82ac191a9c29"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.9'",
"version": "==2025.4.30" "version": "==2025.5.22"
} }
}, },
"develop": {} "develop": {}

View file

@ -132,8 +132,9 @@ The engine which powers the actual video downloads in YTPTube is [yt-dlp](https:
sites regularly change their layouts, frequent updates of yt-dlp are required to keep up. sites regularly change their layouts, frequent updates of yt-dlp are required to keep up.
We have added `YTP_YTDLP_AUTO_UPDATE` environment, which allows you to automatically update yt-dlp to the latest version. We have added `YTP_YTDLP_AUTO_UPDATE` environment, which allows you to automatically update yt-dlp to the latest version.
To get latest version, simply set the environment variable to `true` and restart the container. Now, whenever you restart To get latest version, It's enabled by default and whenever you start the container, it will check for the latest
the container, it will check for the latest version of yt-dlp and update it if a new version is available. version of yt-dlp and update it if a new version is available. To disable this feature, set the environment variable
`YTP_YTDLP_AUTO_UPDATE` to `false`.
We will no longer release new versions of YTPTube for every new version of yt-dlp. We will no longer release new versions of YTPTube for every new version of yt-dlp.
@ -288,5 +289,5 @@ Certain configuration values can be set via environment variables, using the `-e
| YTP_BASIC_MODE | Whether to run WebUI in basic mode | `false` | | YTP_BASIC_MODE | Whether to run WebUI in basic mode | `false` |
| YTP_PICTURES_BACKENDS | A comma separated list of pictures urls to use. | `empty string` | | YTP_PICTURES_BACKENDS | A comma separated list of pictures urls to use. | `empty string` |
| YTP_BROWSER_ENABLED | Whether to enable the file browser | `false` | | YTP_BROWSER_ENABLED | Whether to enable the file browser | `false` |
| YTP_YTDLP_AUTO_UPDATE | Whether to enable the auto update for yt-dlp | `false` | | YTP_YTDLP_AUTO_UPDATE | Whether to enable the auto update for yt-dlp | `true` |

View file

@ -47,7 +47,6 @@ from .Utils import (
get_file_sidecar, get_file_sidecar,
get_files, get_files,
get_mime_type, get_mime_type,
load_cookies,
read_logfile, read_logfile,
validate_url, validate_url,
validate_uuid, validate_uuid,
@ -1698,103 +1697,6 @@ class HttpAPI(Common):
LOG.exception(e) LOG.exception(e)
return web.json_response(data={"error": str(e)}, status=web.HTTPInternalServerError.status_code) return web.json_response(data={"error": str(e)}, status=web.HTTPInternalServerError.status_code)
@route("GET", "api/youtube/auth")
async def is_authenticated(self, _: Request) -> Response:
"""
Check if the user cookies are valid.
Args:
request (Request): The request object.
Returns:
Response: The response object
"""
ytdlp_args = self.config.get_ytdlp_args()
c_request = {}
c_request_file = os.path.join(self.config.config_path, "check_cookie_request.json")
if os.path.exists(c_request_file):
async with await anyio.open_file(c_request_file, "r", encoding="utf-8") as f:
try:
c_request = json.loads(await f.read())
except json.JSONDecodeError as e:
LOG.error(f"Failed to load '{c_request_file}'. '{e!s}'.")
LOG.exception(e)
return web.json_response(
data={"message": "Failed to load cookie request file. Check logs for more details."},
status=web.HTTPInternalServerError.status_code,
)
cookie_file = c_request.get("cookie_file", None)
if not cookie_file:
cookie_file = ytdlp_args.get("cookiefile", None)
if not cookie_file:
return web.json_response(
data={"message": "No cookie file provided."}, status=web.HTTPNotFound.status_code
)
if not os.path.exists(cookie_file):
return web.json_response(
data={"message": f"Cookie file '{cookie_file}' does not exist."}, status=web.HTTPNotFound.status_code
)
try:
_, cookies = load_cookies(cookie_file)
except ValueError as e:
LOG.error(f"Failed to load cookies from '{cookie_file}'. '{e!s}'.")
LOG.exception(e)
return web.json_response(
data={"message": "Failed to load cookies. Check logs for more details."},
status=web.HTTPInternalServerError.status_code,
)
url = c_request.get("url", "https://www.youtube.com/paid_memberships")
try:
opts = {}
if c_request.get("proxy"):
opts["proxy"] = c_request.get("proxy")
try:
c_status = c_request.get("status", [200])
if isinstance(c_status, int):
c_status = [c_status]
if not isinstance(c_status, list):
c_status = [200]
except Exception:
c_status = [200]
async with httpx.AsyncClient(**opts) as client:
if "user-agent" in client.headers:
client.headers.pop("user-agent")
LOG.info(f"Checking '{url}' to validate if cookies are valid.")
response = await client.request(
method=c_request.get("method", "GET"),
url=url,
data=c_request.get("data", None),
json=c_request.get("json", None),
params=c_request.get("params", None),
headers=c_request.get("headers", None),
cookies=cookies,
follow_redirects=bool(c_request.get("follow_redirects", False)),
)
valid = response.status_code in c_status
return web.json_response(
data={"message": "Authenticated." if valid else "Not authenticated."},
status=web.HTTPOk.status_code if valid else web.HTTPUnauthorized.status_code,
)
except Exception as e:
LOG.error(f"Failed to request '{url}'. '{e!s}'.")
LOG.exception(e)
return web.json_response(
data={"message": "Failed to check cookies status. Check logs for more details."},
status=web.HTTPInternalServerError.status_code,
)
@route("GET", "api/notifications") @route("GET", "api/notifications")
async def notifications(self, _: Request) -> Response: async def notifications(self, _: Request) -> Response:
""" """

View file

@ -24,6 +24,9 @@ class Preset:
name: str name: str
"""The name of the preset.""" """The name of the preset."""
description: str = ""
"""The description of the preset."""
folder: str = "" folder: str = ""
"""The default download folder to use if non is given.""" """The default download folder to use if non is given."""
@ -37,6 +40,7 @@ class Preset:
"""yt-dlp cli command line arguments.""" """yt-dlp cli command line arguments."""
default: bool = False default: bool = False
"""If True, the preset is a default preset."""
def serialize(self) -> dict: def serialize(self) -> dict:
return self.__dict__ return self.__dict__

View file

@ -145,7 +145,7 @@ class Config:
browser_enabled: bool = False browser_enabled: bool = False
"Enable file browser access." "Enable file browser access."
ytdlp_auto_update: bool = False ytdlp_auto_update: bool = True
"""Enable in-place auto update of yt-dlp package.""" """Enable in-place auto update of yt-dlp package."""
ytdlp_cli: str = "" ytdlp_cli: str = ""

View file

@ -2,6 +2,7 @@
{ {
"id": "3e163c6c-64eb-4448-924f-814b629b3810", "id": "3e163c6c-64eb-4448-924f-814b629b3810",
"name": "default", "name": "default",
"description": "",
"folder": "", "folder": "",
"template": "", "template": "",
"cookies": "", "cookies": "",
@ -11,6 +12,7 @@
{ {
"id": "5bf9c42b-8852-468a-99f5-915622dfba25", "id": "5bf9c42b-8852-468a-99f5-915622dfba25",
"name": "Best video and audio", "name": "Best video and audio",
"description": "",
"folder": "", "folder": "",
"template": "", "template": "",
"cookies": "", "cookies": "",
@ -20,6 +22,7 @@
{ {
"id": "441675ed-b739-40f0-a0b0-1ecfcb9dc48b", "id": "441675ed-b739-40f0-a0b0-1ecfcb9dc48b",
"name": "1080p H264/m4a or best available", "name": "1080p H264/m4a or best available",
"description": "",
"folder": "", "folder": "",
"template": "", "template": "",
"cookies": "", "cookies": "",
@ -29,6 +32,7 @@
{ {
"id": "9719fcc3-4cf2-4d88-b1e4-74dff3dba00e", "id": "9719fcc3-4cf2-4d88-b1e4-74dff3dba00e",
"name": "720p h264/m4a or best available", "name": "720p h264/m4a or best available",
"description": "",
"folder": "", "folder": "",
"template": "", "template": "",
"cookies": "", "cookies": "",
@ -38,10 +42,21 @@
{ {
"id": "a6fd4b25-2b3e-458d-bb57-b75e41cc4330", "id": "a6fd4b25-2b3e-458d-bb57-b75e41cc4330",
"name": "Audio only", "name": "Audio only",
"description": "",
"folder": "", "folder": "",
"template": "", "template": "",
"cookies": "", "cookies": "",
"cli": "--extract-audio --add-chapters --embed-metadata --embed-thumbnail --format 'bestaudio/best'", "cli": "--extract-audio --add-chapters --embed-metadata --embed-thumbnail --format 'bestaudio/best'",
"default": true "default": true
},
{
"id": "2ade2c28-cad4-4a06-b7eb-2439fdf46f60",
"name": "ytdlp-info-reader",
"description": "This preset generate specific filename format and metadata to work with yt-dlp info reader plugins for jellyfin/emby and plex and to make play state sync work for WatchState.\n\nThere is one more step you need to do via Other > Terminal if you have it enabled or directly from container shell\n\nyt-dlp -I0 --write-info-json --write-thumbnail --convert-thumbnails jpg --paths /downloads/youtube -o \"%(channel|Unknown_title)s [%(channel_id|Unknown_id)s]/%(title).180B [%(channel_id|Unknown_id)s].%(ext)s\" -- https://www.youtube.com/channel/UCClfFsWcT3N2I7VTXXyt84A\n\nChange the url to the channel you want to download.\n\nFor more information please visit \nhttps://github.com/arabcoders/watchstate/blob/master/FAQ.md#how-to-get-watchstate-working-with-youtube-contentlibrary",
"folder": "youtube",
"template": "%(channel)s %(channel_id|Unknown_id)s/Season %(release_date>%Y,upload_date>%Y|Unknown)s/%(release_date>%Y%m%d,upload_date>%Y%m%d)s - %(title).180B [%(extractor)s-%(id)s].%(ext)s",
"cookies": "",
"cli": "--windows-filenames --write-info-json --embed-info-json \n--convert-thumbnails jpg --write-thumbnail --embed-metadata",
"default": true
} }
] ]

View file

@ -39,7 +39,7 @@ class Upgrader:
pkg_installer = PackageInstaller() pkg_installer = PackageInstaller()
ytdlp_auto_update: bool = os.environ.get("YTP_YTDLP_AUTO_UPDATE", "false").strip().lower() == "true" ytdlp_auto_update: bool = os.environ.get("YTP_YTDLP_AUTO_UPDATE", "true").strip().lower() == "true"
if ytdlp_auto_update: if ytdlp_auto_update:
try: try:

View file

@ -317,3 +317,15 @@ hr {
.is-full-height { .is-full-height {
height: 100%; height: 100%;
} }
.is-ellipsis {
max-width: calc(100% - 10px);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.is-max-width {
max-width: calc(100% - 10px);
}

View file

@ -1,6 +1,6 @@
<template> <template>
<main class="columns mt-2"> <main class="columns mt-2">
<div class="column"> <div class="column is-12">
<form autocomplete="off" @submit.prevent="addDownload"> <form autocomplete="off" @submit.prevent="addDownload">
<div class="box"> <div class="box">
<div class="columns is-multiline is-mobile"> <div class="columns is-multiline is-mobile">
@ -76,6 +76,13 @@
</button> </button>
</div> </div>
</div> </div>
<div class="column is-12" v-if="get_preset(form.preset)?.description">
<div class="is-overflow-auto" style="max-height: 150px;">
<div class="is-ellipsis is-clickable" @click="expand_description">
<span class="icon"><i class="fa-solid fa-info" /></span> {{ get_preset(form.preset)?.description }}
</div>
</div>
</div>
<div class="columns is-multiline is-mobile" v-if="showAdvanced && !config.app.basic_mode"> <div class="columns is-multiline is-mobile" v-if="showAdvanced && !config.app.basic_mode">
<div class="column is-12"> <div class="column is-12">
<div class="field"> <div class="field">
@ -324,4 +331,7 @@ const hasFormatInConfig = computed(() => {
}) })
const filter_presets = (flag = true) => config.presets.filter(item => item.default === flag) const filter_presets = (flag = true) => config.presets.filter(item => item.default === flag)
const get_preset = name => config.presets.find(item => item.name === name)
const expand_description = e => toggleClass(e.target, ['is-ellipsis', 'is-pre-wrap'])
</script> </script>

View file

@ -65,7 +65,7 @@
</div> </div>
</div> </div>
<div class="column is-12"> <div class="column is-6-tablet is-12-mobile">
<div class="field"> <div class="field">
<label class="label is-inline" for="folder"> <label class="label is-inline" for="folder">
<span class="icon"><i class="fa-solid fa-folder" /></span> <span class="icon"><i class="fa-solid fa-folder" /></span>
@ -83,7 +83,7 @@
</div> </div>
</div> </div>
<div class="column is-12"> <div class="column is-6-tablet is-12-mobile">
<div class="field"> <div class="field">
<label class="label is-inline" for="output_template"> <label class="label is-inline" for="output_template">
<span class="icon"><i class="fa-solid fa-file" /></span> <span class="icon"><i class="fa-solid fa-file" /></span>
@ -104,7 +104,7 @@
</div> </div>
</div> </div>
<div class="column is-12"> <div class="column is-6-tablet is-12-mobile">
<div class="field"> <div class="field">
<label class="label is-inline" for="cli_options"> <label class="label is-inline" for="cli_options">
<span class="icon"><i class="fa-solid fa-terminal" /></span> <span class="icon"><i class="fa-solid fa-terminal" /></span>
@ -125,7 +125,7 @@
</div> </div>
</div> </div>
<div class="column is-12"> <div class="column is-6-tablet is-12-mobile">
<div class="field"> <div class="field">
<label class="label is-inline" for="cookies" v-tooltip="'Netscape HTTP Cookie format.'"> <label class="label is-inline" for="cookies" v-tooltip="'Netscape HTTP Cookie format.'">
<span class="icon"><i class="fa-solid fa-cookie" /></span> <span class="icon"><i class="fa-solid fa-cookie" /></span>
@ -146,6 +146,22 @@
</div> </div>
</div> </div>
<div class="column">
<div class="field">
<label class="label is-inline" for="description">
<span class="icon"><i class="fa-solid fa-comment" /></span>
Description
</label>
<div class="control">
<textarea class="textarea" id="description" v-model="form.description" :disabled="addInProgress"
placeholder="Extras instructions for users to follow" />
</div>
<span class="help">
<span class="icon"><i class="fa-solid fa-info" /></span>
<span>Use this field to help users to understand how to use this preset.</span>
</span>
</div>
</div>
</div> </div>
</div> </div>
@ -342,11 +358,15 @@ const importItem = async () => {
form.folder = item.folder form.folder = item.folder
} }
if (item.description) {
form.description = item.description
}
import_string.value = '' import_string.value = ''
showImport.value = false showImport.value = false
} catch (e) { } catch (e) {
console.error(e) console.error(e)
toast.error(`Failed to parse string. ${e.message}`) toast.error(`Failed to parse. ${e.message}`)
} }
} }

View file

@ -12,9 +12,9 @@
"web-types": "./web-types.json", "web-types": "./web-types.json",
"dependencies": { "dependencies": {
"@pinia/nuxt": "^0.11.0", "@pinia/nuxt": "^0.11.0",
"@sentry/nuxt": "^9.17.0", "@sentry/nuxt": "^9.22.0",
"@vueuse/core": "^13.1.0", "@vueuse/core": "^13.2.0",
"@vueuse/nuxt": "^13.1.0", "@vueuse/nuxt": "^13.2.0",
"@xterm/addon-fit": "^0.10.0", "@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0", "@xterm/xterm": "^5.5.0",
"cron-parser": "^5.2.0", "cron-parser": "^5.2.0",
@ -22,12 +22,11 @@
"floating-vue": "^5.2.2", "floating-vue": "^5.2.2",
"hls.js": "^1.6.2", "hls.js": "^1.6.2",
"moment": "^2.30.1", "moment": "^2.30.1",
"nuxt": "^3.17.2", "nuxt": "^3.17.4",
"pinia": "^3.0.2", "pinia": "^3.0.2",
"socket.io-client": "^4.7.2", "socket.io-client": "^4.8.1",
"vue": "^3.4", "vue": "^3.5.14",
"vue-router": "^4.5.1", "vue-router": "^4.5.1",
"vue-toastification": "^2.0.0-rc.5" "vue-toastification": "2.0.0-rc.5"
}, }
"devDependencies": {}
} }

View file

@ -11,14 +11,7 @@
<div class="is-pulled-right" v-if="socket.isConnected && false === config.app.basic_mode"> <div class="is-pulled-right" v-if="socket.isConnected && false === config.app.basic_mode">
<div class="field is-grouped"> <div class="field is-grouped">
<p class="control" v-if="config.app.has_cookies"> <p class="control" v-if="!config.app.basic_mode">
<button class="button is-purple" @click="checkCookies" v-tooltip.bottom="'Check youtube cookies status.'"
:disabled="isChecking">
<span class="icon"><i class="fas fa-cookie" :class="{ 'is-loading': isChecking }" /></span>
</button>
</p>
<p class="control">
<button class="button is-warning" @click="pauseDownload" v-if="false === config.paused" <button class="button is-warning" @click="pauseDownload" v-if="false === config.paused"
v-tooltip.bottom="'Pause non-active downloads.'"> v-tooltip.bottom="'Pause non-active downloads.'">
<span class="icon"><i class="fas fa-pause" /></span> <span class="icon"><i class="fas fa-pause" /></span>
@ -63,15 +56,12 @@
</template> </template>
<script setup> <script setup>
import { request } from '~/utils/index'
import { useStorage } from '@vueuse/core' import { useStorage } from '@vueuse/core'
const emitter = defineEmits(['getInfo']) const emitter = defineEmits(['getInfo'])
const config = useConfigStore() const config = useConfigStore()
const stateStore = useStateStore() const stateStore = useStateStore()
const socket = useSocketStore() const socket = useSocketStore()
const toast = useToast()
const isChecking = ref(false)
const get_info = ref('') const get_info = ref('')
const bg_enable = useStorage('random_bg', true) const bg_enable = useStorage('random_bg', true)
const bg_opacity = useStorage('random_bg_opacity', 0.85) const bg_opacity = useStorage('random_bg_opacity', 0.85)
@ -100,31 +90,6 @@ watch(() => stateStore.queue, () => {
useHead({ title: `YTPTube: ( ${Object.keys(stateStore.queue).length || 0}/${config.app.max_workers} | ${Object.keys(stateStore.history).length || 0} )` }) useHead({ title: `YTPTube: ( ${Object.keys(stateStore.queue).length || 0}/${config.app.max_workers} | ${Object.keys(stateStore.history).length || 0} )` })
}, { deep: true }) }, { deep: true })
const checkCookies = async () => {
if (true === isChecking.value) {
return
}
if (false === confirm(`Check for cookies status?`)) {
return
}
try {
isChecking.value = true
const response = await request('/api/youtube/auth')
const data = await response.json()
if (response.ok) {
toast.success('Succuss. ' + data.message)
} else {
toast.error('Failed. ' + data.message)
}
} catch (e) {
toast.error('Failed to check cookies state. ' + e.message)
} finally {
isChecking.value = false
}
}
const pauseDownload = () => { const pauseDownload = () => {
if (false === confirm('Are you sure you want to pause all non-active downloads?')) { if (false === confirm('Are you sure you want to pause all non-active downloads?')) {
return false return false

View file

@ -58,9 +58,9 @@ div.is-centered {
<header class="card-header"> <header class="card-header">
<div class="card-header-title is-text-overflow is-block" v-text="item.name" /> <div class="card-header-title is-text-overflow is-block" v-text="item.name" />
<div class="card-header-icon"> <div class="card-header-icon">
<a class="has-text-primary" v-tooltip="'Export preset.'" @click.prevent="exportItem(item)"> <button class="has-text-primary" v-tooltip="'Export preset.'" @click="exportItem(item)">
<span class="icon"><i class="fa-solid fa-file-export" /></span> <span class="icon"><i class="fa-solid fa-file-export" /></span>
</a> </button>
<button @click="item.raw = !item.raw"> <button @click="item.raw = !item.raw">
<span class="icon"><i class="fa-solid" :class="{ <span class="icon"><i class="fa-solid" :class="{
'fa-arrow-down': !item?.raw, 'fa-arrow-down': !item?.raw,
@ -87,11 +87,24 @@ div.is-centered {
<span class="icon"><i class="fa-solid fa-cookie" /></span> <span class="icon"><i class="fa-solid fa-cookie" /></span>
<span>Has cookies</span> <span>Has cookies</span>
</p> </p>
<button @click="item.toggle_description = !item.toggle_description" v-if="item.description">
<span class="icon"><i class="fa-solid"
:class="{ 'fa-arrow-down': !item?.raw, 'fa-arrow-up': item?.raw, }" /></span>
<span>{{ !item.toggle_description ? 'Show' : 'Hide' }} Description</span>
</button>
</div> </div>
</div> </div>
<div class="card-content" v-if="item?.raw"> <div class="card-content content m-1 p-1 is-overflow-auto" style="max-height: 300px;"
<div class="content"> v-if="item?.toggle_description">
<div class="is-pre-wrap">{{ item.description }}</div>
</div>
<div class="card-content content is-overflow-auto m-0 p-0" v-if="item?.raw" style="max-height: 300px;">
<div class="is-position-relative">
<pre><code>{{ filterItem(item) }}</code></pre> <pre><code>{{ filterItem(item) }}</code></pre>
<button class="button is-small is-primary is-position-absolute" style="top:0; right:0"
@click="copyText(filterItem(item))">
<span class="icon"><i class="fa-solid fa-copy" /></span>
</button>
</div> </div>
</div> </div>
<div class="card-footer mt-auto"> <div class="card-footer mt-auto">
@ -276,13 +289,16 @@ const updateItem = async ({ reference, preset }) => {
resetForm(true) resetForm(true)
} }
const filterItem = (item) => { const filterItem = item => {
const { raw, ...rest } = item const { raw, toggle_description, ...rest } = item
if ("default" in rest) {
delete rest.default
}
return JSON.stringify(rest, null, 2) return JSON.stringify(rest, null, 2)
} }
const editItem = (item) => { const editItem = item => {
preset.value = item preset.value = JSON.parse(filterItem(item))
presetRef.value = item.id presetRef.value = item.id
toggleForm.value = true toggleForm.value = true
} }
@ -291,7 +307,7 @@ onMounted(async () => (socket.isConnected ? await reloadContent(true) : ""))
const exportItem = item => { const exportItem = item => {
let data = JSON.parse(JSON.stringify(item)) let data = JSON.parse(JSON.stringify(item))
const keys = ["id", "default", "raw", "cookies"] const keys = ["id", "default", "raw", "cookies", "toggle_description"]
keys.forEach(key => { keys.forEach(key => {
if (key in data) { if (key in data) {
delete data[key] delete data[key]

9017
ui/pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load diff

View file

@ -2,57 +2,62 @@ const sources = [
{ {
name: 'youtube', name: 'youtube',
url: 'https://www.youtube-nocookie.com/embed/', url: 'https://www.youtube-nocookie.com/embed/',
regex: /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:shorts\/|[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/, regex: /(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:shorts\/|[^\/\n\s]+\/\S+\/|(?:v|e(?:mbed)?)\/|\S*?[?&]v=)|youtu\.be\/)(?<id>[a-zA-Z0-9_-]{11})/,
}, },
{ {
name: "instagram", name: "instagram_post",
url: "https://www.instagram.com/p/", url: "https://www.instagram.com/p/",
regex: /https?:\/\/(?:www\.)?instagram\.com\/p\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?instagram\.com\/p\/(?<id>[^/?#&]+)/,
},
{
name: "instagram_story",
url: "https://www.instagram.com/stories/highlights/",
regex: /https?:\/\/(?:www\.)?instagram\.com\/stories\/highlights\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "twitter", name: "twitter",
url: "https://twitter.com/i/status/", url: "https://twitter.com/i/status/",
regex: /https?:\/\/(?:www\.)?twitter\.com\/i\/status\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?(twitter\.com|x\.com)\/.+?\/status\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "facebook", name: "facebook",
url: "https://www.facebook.com/plugins/post.php?href=", url: "https://www.facebook.com/plugins/post.php?href=",
regex: /https?:\/\/(?:www\.)?facebook\.com\/(?:[^/?#&]+)\/posts\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?facebook\.com\/(?:[^/?#&]+)\/posts\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "tiktok", name: "tiktok",
url: "https://www.tiktok.com/embed/", url: "https://www.tiktok.com/embed/",
regex: /https?:\/\/(?:www\.)?tiktok\.com\/(?:[^/?#&]+)\/video\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?tiktok\.com\/(?:[^/?#&]+)\/video\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "vimeo", name: "vimeo",
url: "https://player.vimeo.com/video/", url: "https://player.vimeo.com/video/",
regex: /https?:\/\/(?:www\.)?vimeo\.com\/(?:[^/?#&]+)\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?vimeo\.com(?:\/[^/?#&]+)?\/(?<id>[^/?#&]+)/,
},
{
name: "soundcloud",
url: "https://w.soundcloud.com/player/?url=",
regex: /https?:\/\/(?:www\.)?soundcloud\.com\/(?:[^/?#&]+)\/([^/?#&]+)/,
}, },
{ {
name: "spotify", name: "spotify",
url: "https://open.spotify.com/embed/", url: "https://open.spotify.com/embed/",
regex: /https?:\/\/(?:open\.)?spotify\.com\/(?:[^/?#&]+)\/([^/?#&]+)/, regex: /https?:\/\/(?:open\.)?spotify\.com\/(?:[^/?#&]+)\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "twitch", name: "twitch_vod",
url: "https://player.twitch.tv/?channel=", url: "https://player.twitch.tv/?parent={origin}&video=",
regex: /https?:\/\/(?:www\.)?twitch\.tv\/(?:[^/?#&]+)\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?twitch\.tv\/(?:[^/?#&]+)\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "mixcloud", name: "twitch_clip",
url: "https://www.mixcloud.com/widget/iframe/", url: "https://clips.twitch.tv/embed?parent={origin}&clip=",
regex: /https?:\/\/(?:www\.)?mixcloud\.com\/(?:[^/?#&]+)\/([^/?#&]+)/, regex: /https?:\/\/(?:www\.)?twitch\.tv\/(?:[^/?#&]+)\/clip\/(?<id>[^/?#&]+)/,
},
{
name: "twitch_channel",
url: "https://player.twitch.tv/?parent={origin}&channel=",
regex: /https?:\/\/(?:www\.)?twitch\.tv\/(?<id>[^/?#&]+)/,
}, },
{ {
name: "dailymotion", name: "dailymotion",
url: "https://www.dailymotion.com/embed/video/", url: "https://www.dailymotion.com/embed/video/",
regex: /https?:\/\/(?:www\.)?dailymotion\.com\/(?:[^/?#&]+)\/video\/([^/?#&]+)/, regex: /^.+dailymotion.com\/(video|hub)\/(?<id>[^_]+)[^#]*(#video=([^_&]+))?/,
}, },
] ]
@ -62,8 +67,13 @@ const isEmbedable = url => {
const getEmbedable = url => { const getEmbedable = url => {
const source = sources.find(source => source.regex.test(url)); const source = sources.find(source => source.regex.test(url));
const id = source.regex.exec(url)[1]; if (!source) {
return source.url + id; return null;
}
source.url.replace(/\{origin\}/g, window.location.origin);
return source.url + source.regex.exec(url)['groups'].id;
} }
export { isEmbedable, getEmbedable }; export { isEmbedable, getEmbedable };

View file

@ -460,6 +460,19 @@ const has_data = item => {
return false return false
} }
const toggleClass = (target, className) => {
if (Array.isArray(className)) {
className.forEach(name => toggleClass(target, name))
return;
}
if (target.classList.contains(className)) {
target.classList.remove(className)
return;
}
target.classList.add(className)
}
export { export {
ag_set, ag_set,
ag, ag,
@ -485,4 +498,5 @@ export {
base64UrlEncode, base64UrlEncode,
base64UrlDecode, base64UrlDecode,
has_data, has_data,
toggleClass,
} }

File diff suppressed because it is too large Load diff