Compare commits

...

16 Commits

19 changed files with 1679 additions and 1 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
node_modules/
data/credentials.json
*.txt

View File

@ -1,3 +1,23 @@
# Kiss Asian Downloader
Download content from Kiss Asian through JDownloader.
## Installation
Clone this repository. Then, install the dependencies.
```text
npm install
```
## Usage
You can use the script with the following command:
```text
node . --display <links_file>
```
> The argument `--display` is used if you wish to see the puppeteer window.
>
> `links_file` must be a text file containing the links to KissAsian media pages separated by newlines.

994
package-lock.json generated Normal file
View File

@ -0,0 +1,994 @@
{
"name": "kissasian-downloader",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@cliqz/adblocker": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/@cliqz/adblocker/-/adblocker-1.22.1.tgz",
"integrity": "sha512-kir/tVTe0VabtJfcRipDX+/UBnZn0aN0lX4GQT7wZIHMOACpW37eix7wGkzVS+icbwu1bEqZ+O8Q98UlORPm4w==",
"requires": {
"@cliqz/adblocker-content": "^1.22.1",
"@cliqz/adblocker-extended-selectors": "^1.22.1",
"@remusao/guess-url-type": "^1.1.2",
"@remusao/small": "^1.1.2",
"@remusao/smaz": "^1.7.1",
"@types/chrome": "^0.0.144",
"@types/firefox-webext-browser": "^82.0.0",
"tldts-experimental": "^5.6.21"
},
"dependencies": {
"@types/chrome": {
"version": "0.0.144",
"resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.144.tgz",
"integrity": "sha512-BgoiO7/KP9hRNrCR2Wq+aKWT5Dh9bTofuWaRtcqPcj8YKhZojQgb6sSdIqvds2C+eO63BwaR9KHVMYYgZdGGBg==",
"requires": {
"@types/filesystem": "*",
"@types/har-format": "*"
}
}
}
},
"@cliqz/adblocker-content": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/@cliqz/adblocker-content/-/adblocker-content-1.22.1.tgz",
"integrity": "sha512-CSOCdK/SJOZVWGVJuurfL0KtPq1AhSp3ng6BAo3SLXAd+WP7obERw2qFWQ0uzrApY/N1a1hvzfw31uonqRakXg==",
"requires": {
"@cliqz/adblocker-extended-selectors": "^1.22.1"
}
},
"@cliqz/adblocker-extended-selectors": {
"version": "1.22.1",
"resolved": "https://registry.npmjs.org/@cliqz/adblocker-extended-selectors/-/adblocker-extended-selectors-1.22.1.tgz",
"integrity": "sha512-uXB1TybAq6MgqsG09fcY8Qw0P9EOWp4G7KQ4QNXQd4HIP4o3zcJgBd5MKeclJAD/QOyPdhnb+a9JdwVFyqMamQ=="
},
"@cliqz/adblocker-puppeteer": {
"version": "1.18.7",
"resolved": "https://registry.npmjs.org/@cliqz/adblocker-puppeteer/-/adblocker-puppeteer-1.18.7.tgz",
"integrity": "sha512-uPeoGkheAYVPltq6MRLfR7QA6TfHqyfSWfsnoZhgViIqAP+aJKjAy3sT61j0YdXi0/NZoIMB6l/DMGMuYigvjg==",
"requires": {
"@cliqz/adblocker": "^1.18.7",
"@cliqz/adblocker-content": "^1.18.7",
"tldts-experimental": "^5.6.21"
}
},
"@remusao/guess-url-type": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@remusao/guess-url-type/-/guess-url-type-1.2.1.tgz",
"integrity": "sha512-rbOqre2jW8STjheOsOaQHLgYBaBZ9Owbdt8NO7WvNZftJlaG3y/K9oOkl8ZUpuFBisIhmBuMEW6c+YrQl5inRA=="
},
"@remusao/small": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@remusao/small/-/small-1.2.1.tgz",
"integrity": "sha512-7MjoGt0TJMVw1GPKgWq6SJPws1SLsUXQRa43Umht+nkyw2jnpy3WpiLNqGdwo5rHr5Wp9B2W/Pm5RQp656UJdw=="
},
"@remusao/smaz": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@remusao/smaz/-/smaz-1.9.1.tgz",
"integrity": "sha512-e6BLuP8oaXCZ9+v46Is4ilAZ/Vq6YLgmBP204Ixgk1qTjXmqvFYG7+AS7v9nsZdGOy96r9DWGFbbDVgMxwu1rA==",
"requires": {
"@remusao/smaz-compress": "^1.9.1",
"@remusao/smaz-decompress": "^1.9.1"
}
},
"@remusao/smaz-compress": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@remusao/smaz-compress/-/smaz-compress-1.9.1.tgz",
"integrity": "sha512-E2f48TwloQu3r6BdLOGF2aczeH7bJ/32oJGqvzT9SKur0cuUnLcZ7ZXP874E2fwmdE+cXzfC7bKzp79cDnmeyw==",
"requires": {
"@remusao/trie": "^1.4.1"
}
},
"@remusao/smaz-decompress": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/@remusao/smaz-decompress/-/smaz-decompress-1.9.1.tgz",
"integrity": "sha512-TfjKKprYe3n47od8auhvJ/Ikj9kQTbDTe71ynKlxslrvvUhlIV3VQSuwYuMWMbdz1fIs0H/fxCN1Z8/H3km6/A=="
},
"@remusao/trie": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/@remusao/trie/-/trie-1.4.1.tgz",
"integrity": "sha512-yvwa+aCyYI/UjeD39BnpMypG8N06l86wIDW1/PAc6ihBRnodIfZDwccxQN3n1t74wduzaz74m4ZMHZnB06567Q=="
},
"@types/chrome": {
"version": "0.0.91",
"resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.91.tgz",
"integrity": "sha512-vNvo9lJkp1AvViWrUwe1bxhoMwr5dRZWlgr1DTuaNkz97LsG56lDX1sceWeZir2gRACJ5vdHtoRdVAvm8C75Ug==",
"requires": {
"@types/filesystem": "*"
}
},
"@types/debug": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz",
"integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ=="
},
"@types/filesystem": {
"version": "0.0.30",
"resolved": "https://registry.npmjs.org/@types/filesystem/-/filesystem-0.0.30.tgz",
"integrity": "sha512-NCoRgmGmLpTT9VFL6Bb6z0jQuqI3d0E5FGl7M0JOv/J5RQYo9s5aOItPYnpckx9MbYQk1APLXcF8f20Vqnf2yA==",
"requires": {
"@types/filewriter": "*"
}
},
"@types/filewriter": {
"version": "0.0.29",
"resolved": "https://registry.npmjs.org/@types/filewriter/-/filewriter-0.0.29.tgz",
"integrity": "sha512-BsPXH/irW0ht0Ji6iw/jJaK8Lj3FJemon2gvEqHKpCdDCeemHa+rI3WBGq5z7cDMZgoLjY40oninGxqk+8NzNQ=="
},
"@types/firefox-webext-browser": {
"version": "82.0.0",
"resolved": "https://registry.npmjs.org/@types/firefox-webext-browser/-/firefox-webext-browser-82.0.0.tgz",
"integrity": "sha512-zKHePkjMx42KIUUZCPcUiyu1tpfQXH9VR4iDYfns3HvmKVJzt/TAFT+DFVroos8BI9RH78YgF3Hi/wlC6R6cKA=="
},
"@types/har-format": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.6.tgz",
"integrity": "sha512-TeZjp4COiAWPOeGx1tuFJETr/SBMx80lxqeqnCC36ZVn463f7ElCdA3X9RzDuo3BHjhN4apw41A5uoIw5FzgWA=="
},
"@types/node": {
"version": "15.12.2",
"resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
"integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww=="
},
"@types/puppeteer": {
"version": "5.4.3",
"resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-5.4.3.tgz",
"integrity": "sha512-3nE8YgR9DIsgttLW+eJf6mnXxq8Ge+27m5SU3knWmrlfl6+KOG0Bf9f7Ua7K+C4BnaTMAh3/UpySqdAYvrsvjg==",
"requires": {
"@types/node": "*"
}
},
"@types/yauzl": {
"version": "2.9.1",
"resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz",
"integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==",
"optional": true,
"requires": {
"@types/node": "*"
}
},
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
"integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"requires": {
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
}
},
"arr-union": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
"integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
},
"at-least-node": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
},
"axios": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
"integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
"requires": {
"follow-redirects": "1.5.10"
}
},
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
},
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"requires": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
"buffer": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
}
},
"buffer-crc32": {
"version": "0.2.13",
"resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
"integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
},
"chalk": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
},
"clone-deep": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
"integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
"requires": {
"for-own": "^0.1.3",
"is-plain-object": "^2.0.1",
"kind-of": "^3.0.2",
"lazy-cache": "^1.0.3",
"shallow-clone": "^0.1.2"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
"ms": "2.0.0"
}
},
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
"integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
},
"devtools-protocol": {
"version": "0.0.883894",
"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.883894.tgz",
"integrity": "sha512-33idhm54QJzf3Q7QofMgCvIVSd2o9H3kQPWaKT/fhoZh+digc+WSiMhbkeG3iN79WY4Hwr9G05NpbhEVrsOYAg=="
},
"end-of-stream": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"requires": {
"once": "^1.4.0"
}
},
"extract-zip": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
"integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
"requires": {
"@types/yauzl": "^2.9.1",
"debug": "^4.1.1",
"get-stream": "^5.1.0",
"yauzl": "^2.10.0"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"fd-slicer": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
"requires": {
"pend": "~1.2.0"
}
},
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"requires": {
"locate-path": "^5.0.0",
"path-exists": "^4.0.0"
}
},
"follow-redirects": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
"debug": "=3.1.0"
}
},
"for-in": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
"integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
},
"for-own": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
"integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
"requires": {
"for-in": "^1.0.1"
}
},
"fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
},
"fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"requires": {
"at-least-node": "^1.0.0",
"graceful-fs": "^4.2.0",
"jsonfile": "^6.0.1",
"universalify": "^2.0.0"
}
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
},
"get-stream": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
"integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"requires": {
"pump": "^3.0.0"
}
},
"glob": {
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.0.4",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
}
},
"graceful-fs": {
"version": "4.2.6",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
"integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"https-proxy-agent": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
"integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
"requires": {
"agent-base": "6",
"debug": "4"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"requires": {
"once": "^1.3.0",
"wrappy": "1"
}
},
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"is-buffer": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
},
"is-extendable": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
"integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
},
"is-plain-object": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
"integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
"requires": {
"isobject": "^3.0.1"
}
},
"isobject": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
"integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
},
"jdownloader-client-yaac": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/jdownloader-client-yaac/-/jdownloader-client-yaac-1.0.4.tgz",
"integrity": "sha512-hC+sSw8EvVPGwIQrToegalDxEs2piitYdqgrdH7d3iyo9Ze3/n4Sgt66GgCNOGEnSn2fAzFILbKe9d49hnh6DA==",
"requires": {
"axios": "^0.19.0"
}
},
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
"integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"requires": {
"graceful-fs": "^4.1.6",
"universalify": "^2.0.0"
}
},
"kind-of": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
"integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
"requires": {
"is-buffer": "^1.1.5"
}
},
"lazy-cache": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
"integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
},
"locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"requires": {
"p-locate": "^4.1.0"
}
},
"merge-deep": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
"integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
"requires": {
"arr-union": "^3.1.0",
"clone-deep": "^0.2.4",
"kind-of": "^3.0.2"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"mixin-object": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
"integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
"requires": {
"for-in": "^0.1.3",
"is-extendable": "^0.1.1"
},
"dependencies": {
"for-in": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
"integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
}
}
},
"mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"requires": {
"minimist": "^1.2.5"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"requires": {
"wrappy": "1"
}
},
"p-limit": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"requires": {
"p-try": "^2.0.0"
}
},
"p-locate": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"requires": {
"p-limit": "^2.2.0"
}
},
"p-try": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
"integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
},
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
},
"pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
"integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
},
"pkg-dir": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
"requires": {
"find-up": "^4.0.0"
}
},
"progress": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
"integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg=="
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"pump": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
"requires": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"puppeteer": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-10.0.0.tgz",
"integrity": "sha512-AxHvCb9IWmmP3gMW+epxdj92Gglii+6Z4sb+W+zc2hTTu10HF0yg6hGXot5O74uYkVqG3lfDRLfnRpi6WOwi5A==",
"requires": {
"debug": "4.3.1",
"devtools-protocol": "0.0.883894",
"extract-zip": "2.0.1",
"https-proxy-agent": "5.0.0",
"node-fetch": "2.6.1",
"pkg-dir": "4.2.0",
"progress": "2.0.1",
"proxy-from-env": "1.1.0",
"rimraf": "3.0.2",
"tar-fs": "2.0.0",
"unbzip2-stream": "1.3.3",
"ws": "7.4.6"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra": {
"version": "3.1.18",
"resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.18.tgz",
"integrity": "sha512-mGQyAnxaGcZomx7NVC4wgAkZl0MLTdE/GIfwRSbLJ9L4yIxPg9uEA3yiLBe+x09tjhTGEtv8KDef8Bl53RXgiA==",
"requires": {
"@types/debug": "^4.1.0",
"@types/puppeteer": "5.4.3",
"debug": "^4.1.1",
"deepmerge": "^4.2.2"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra-plugin": {
"version": "3.1.9",
"resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.1.9.tgz",
"integrity": "sha512-LYKj+3wGsnBzwEIpTertyOkzjcTHJn96FDSFXQ4Oo38CFFRw1qRBAJPPtAaMVjuVDqATeNd/RpP4n5jbxeX90g==",
"requires": {
"@types/debug": "^4.1.0",
"debug": "^4.1.1",
"merge-deep": "^3.0.1"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra-plugin-adblocker": {
"version": "2.11.11",
"resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-adblocker/-/puppeteer-extra-plugin-adblocker-2.11.11.tgz",
"integrity": "sha512-T1lfc/PUw7Ltz1YOlWyuodXlFOa+JLmKozPGD8Ka5fqvJDSGpV7AvVhJPYNdHDXAmqFiHn1VuS2IUkGZMxpjVw==",
"requires": {
"@cliqz/adblocker-puppeteer": "1.18.7",
"@types/chrome": "0.0.91",
"debug": "^4.1.1",
"node-fetch": "^2.6.0",
"puppeteer-extra-plugin": "^3.1.9"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra-plugin-stealth": {
"version": "2.7.8",
"resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-stealth/-/puppeteer-extra-plugin-stealth-2.7.8.tgz",
"integrity": "sha512-Zhm/WY/BAk9VGdZR5OVpiwfGn2NoAzEb0hdu3/PGRryfenn8Dtoai8aUa8GzFPExWL+yGPsztswupH+3TV3M2A==",
"requires": {
"debug": "^4.1.1",
"puppeteer-extra-plugin": "^3.1.9",
"puppeteer-extra-plugin-user-preferences": "^2.2.12"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra-plugin-user-data-dir": {
"version": "2.2.12",
"resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-data-dir/-/puppeteer-extra-plugin-user-data-dir-2.2.12.tgz",
"integrity": "sha512-+RTNevJLswyh/RfQ+c46otTtE9eABKv8KkLGHcz1jpnVH/iX2wHu7VkXA5Y9pKBaLYDt83BON8wCowy5Eh/KWA==",
"requires": {
"debug": "^4.1.1",
"fs-extra": "^9.1.0",
"puppeteer-extra-plugin": "^3.1.9"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"puppeteer-extra-plugin-user-preferences": {
"version": "2.2.12",
"resolved": "https://registry.npmjs.org/puppeteer-extra-plugin-user-preferences/-/puppeteer-extra-plugin-user-preferences-2.2.12.tgz",
"integrity": "sha512-y4YOykpYHq0t8qnRyuSL6sIDIRKgdlKkIIFdRbfZx3cg7nxeVLkHgEz3v/Ob0U/lvzlSrr4xvHhG+KcVWH7BXA==",
"requires": {
"debug": "^4.1.1",
"deepmerge": "^4.2.2",
"puppeteer-extra-plugin": "^3.1.9",
"puppeteer-extra-plugin-user-data-dir": "^2.2.12"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"readable-stream": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
"integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"requires": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
}
},
"rimraf": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"requires": {
"glob": "^7.1.3"
}
},
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
},
"shallow-clone": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
"integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
"requires": {
"is-extendable": "^0.1.1",
"kind-of": "^2.0.1",
"lazy-cache": "^0.2.3",
"mixin-object": "^2.0.1"
},
"dependencies": {
"kind-of": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
"integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
"requires": {
"is-buffer": "^1.0.2"
}
},
"lazy-cache": {
"version": "0.2.7",
"resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
"integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
}
}
},
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
"safe-buffer": "~5.2.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
},
"tar-fs": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
"integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
"requires": {
"chownr": "^1.1.1",
"mkdirp": "^0.5.1",
"pump": "^3.0.0",
"tar-stream": "^2.0.0"
}
},
"tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"requires": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
}
},
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
},
"tldts-core": {
"version": "5.7.38",
"resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-5.7.38.tgz",
"integrity": "sha512-mcL16YTXjpVJ+ekoKC/ddvdjGNMg8HkdWQNp3WNz26WJMV7Z2Hjr1IPwYYr9W3LxGdXV7mmg21Zk2vSstiSsFg=="
},
"tldts-experimental": {
"version": "5.7.38",
"resolved": "https://registry.npmjs.org/tldts-experimental/-/tldts-experimental-5.7.38.tgz",
"integrity": "sha512-3L0yML53LSw3tlRPwHcGOf35l3dhZx/3DgPGWL3ILATnuu76OiAOvJ4Xw1Znl6sIxVKJ4B4BE0zroZMMzsHg/A==",
"requires": {
"tldts-core": "^5.7.38"
}
},
"unbzip2-stream": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
"integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
"requires": {
"buffer": "^5.2.1",
"through": "^2.3.8"
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"ws": {
"version": "7.4.6",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
},
"yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
"requires": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
}
}
}

View File

@ -12,5 +12,14 @@
},
"keywords": [],
"author": "moonstar-x",
"license": "ISC"
"license": "ISC",
"dependencies": {
"chalk": "^4.1.1",
"jdownloader-client-yaac": "^1.0.4",
"minimist": "^1.2.5",
"puppeteer": "^10.0.0",
"puppeteer-extra": "^3.1.18",
"puppeteer-extra-plugin-adblocker": "^2.11.11",
"puppeteer-extra-plugin-stealth": "^2.7.8"
}
}

View File

@ -0,0 +1,113 @@
const { JdownloaderClient: Client, JdownloaderClient } = require('jdownloader-client-yaac');
const Logger = require('../utils/Logger');
const Utils = require('../utils/Utils');
const { JDownloaderError } = require('../../errors');
const Media = require('../media/Media');
class JDownloaderClient {
constructor(credentials) {
this.client = new Client(credentials.email, credentials.password);
this.device = null;
}
async load() {
await this.client.core.connect();
this.device = (await this.client.core.listDevices())[0];
Logger.info(`Connected to JDownloader ${this.device.name}`);
}
async finish() {
await this.client.core.disconnect();
Logger.info(`Disconnected from JDownloader ${this.device.name}`);
}
async addLinks(media) {
if (!(media instanceof Media)) {
throw new TypeError('Invalid Media instance passed to downloader!');
}
await this.client.linkgrabberV2.addLinks(this.device.id, {
destinationFolder: media.getDownloadDestinationFolder(),
packageName: media.getDownloadPackageName(),
links: media.downloadURLs
});
Logger.info(`Added links for ${media.name}`);
}
async getCrawledLinks(mediaDownloadURLs) {
let crawledLinks = await this.client.linkgrabberV2.queryLinks(this.device.id, {
url: true
});
let retries = 0;
while (crawledLinks.length !== mediaDownloadURLs.length && retries < JDownloaderClient.DEFAULTS.MAX_QUERY_RETRIES) {
retries++;
Logger.warn(`Querying links from LinkGrabber, retry ${retries} of ${JDownloaderClient.DEFAULTS.MAX_QUERY_RETRIES}...`);
crawledLinks = await this.client.linkgrabberV2.queryLinks(this.device.id, {
url: true
});
await Utils.wait(JDownloaderClient.DEFAULTS.RETRY_TIMEOUT);
}
if (crawledLinks.length < 1) {
throw new JDownloaderError('Could not fetch crawled links from JDownloader!');
}
return crawledLinks;
}
getRenamedCrawledLinks(crawledLinks, media) {
if (!(media instanceof Media)) {
throw new TypeError('Invalid Media instance passed to downloader!');
}
return crawledLinks.map((link) => {
const ext = link.name.substring(link.name.lastIndexOf('.') + 1);
return {
linkId: link.uuid,
newName: media.getDownloadFilename(ext, link.url)
};
}, []);
}
async renameCrawledLinks(renamedCrawledLinks) {
Logger.info('Renaming crawled links...');
await Utils.mapSeries(renamedCrawledLinks, (renamedLink) => {
return this.client.linkgrabberV2.renameLink(this.device.id, renamedLink)
.then(() => {
Logger.info(`Renamed ${renamedLink.newName}`);
});
});
Logger.success('Renaming complete.');
}
async startDownload(crawledLinks = []) {
const linkIDs = crawledLinks.map((link) => link.uuid);
if (linkIDs.length < 1) {
throw new JDownloaderError('No links to download!');
}
const packageUUID = crawledLinks[0].packageUUID;
if (!packageUUID) {
throw new JDownloaderError('Cannot start download without packageUUID!');
}
await this.client.core.callAction('/linkgrabberv2/moveToDownloadlist', this.device.id, [linkIDs, [packageUUID]]);
Logger.success('Download started.');
}
}
JDownloaderClient.DEFAULTS = {
MAX_QUERY_RETRIES: 6,
RETRY_TIMEOUT: 3000
};
module.exports = JDownloaderClient;

View File

@ -0,0 +1,74 @@
const fs = require('fs');
const path = require('path');
const { FatalError } = require('../../errors');
class MediaLinksFile {
constructor(filename) {
this.file = path.join(process.cwd(), filename);
if (!fs.existsSync(this.file)) {
throw new FatalError('The specified file could not be found!');
}
}
read() {
return new Promise((resolve, reject) => {
fs.readFile(this.file, (err, data) => {
if (err) {
return reject(err);
}
return resolve(MediaLinksFile.parseBuffer(data));
});
});
}
write(newContent) {
return new Promise((resolve, reject) => {
fs.writeFile(this.file, newContent, null, (err) => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
async removeFirstLink() {
const items = await this.read();
const serialized = MediaLinksFile.serialize(items.slice(1));
await this.write(serialized);
}
remove() {
return new Promise((resolve, reject) => {
fs.unlink(this.file, (err) => {
if (err) {
return reject(err);
}
return resolve();
});
});
}
static serialize(content) {
return content.map((line) => `${line}\r`).join('\n');
}
static parseBuffer(buffer) {
return buffer.toString()
.split('\n')
.filter((line) => line)
.map((line) => {
const returnCarriageIndex = line.indexOf('\r');
if (returnCarriageIndex < 0) {
return line;
}
return line.substring(0, returnCarriageIndex);
});
}
}
module.exports = MediaLinksFile;

View File

@ -0,0 +1,25 @@
class Media {
constructor(name, mediaURLs) {
this.name = name;
this.mediaURLs = mediaURLs;
this.downloadURLs = [];
}
setDownloadURLs(downloadURLs) {
this.downloadURLs = downloadURLs;
}
getDownloadPackageName() {
throw new Error('Method not implemented!');
}
getDownloadDestinationFolder() {
throw new Error('Method not implemented!');
}
getDownloadFilename() {
throw new Error('Method not implemented!');
}
}
module.exports = Media;

View File

@ -0,0 +1,22 @@
const Media = require('./Media');
class Movie extends Media {
constructor(name, year, mediaURLs) {
super(name, mediaURLs);
this.year = year;
}
getDownloadPackageName() {
return `${this.name} (${this.year})`;
}
getDownloadDestinationFolder() {
return `${this.name} (${this.year})`;
}
getDownloadFilename(ext) {
return `${this.name} (${this.year}).${ext}`;
}
}
module.exports = Movie;

27
src/classes/media/Show.js Normal file
View File

@ -0,0 +1,27 @@
const Media = require('./Media');
class Show extends Media{
constructor(name, season, mediaURLs) {
super(name, mediaURLs);
this.season = season < 10 ? `0${season}` : `${season}`;
}
getParsedEpisodeNumberForURL(downloadURL) {
const episode = this.downloadURLs.indexOf(downloadURL) + 1;
return episode < 10 ? `0${episode}` : `${episode}`;
}
getDownloadPackageName() {
return this.name;
}
getDownloadDestinationFolder() {
return `${this.name}/Season ${this.season}`;
}
getDownloadFilename(ext, downloadURL) {
return `${this.name} - S${this.season}E${this.getParsedEpisodeNumberForURL(downloadURL)}.${ext}`;
}
}
module.exports = Show;

View File

@ -0,0 +1,209 @@
const Logger = require('../utils/Logger');
const Utils = require('../utils/Utils');
const { ScraperError } = require('../../errors');
const Show = require('../media/Show');
const Movie = require('../media/Movie');
const Media = require('../media/Media');
class KissAsianScraper {
constructor(page) {
this.page = page;
}
async load() {
await this.page.goto(KissAsianScraper.BASE_URL);
await this.page.waitForSelector(KissAsianScraper.DEFAULTS.SITE_SELECTOR);
Logger.info('Cloudflare DDOS Protection bypassed, redirected to main site.');
}
async finish(browser) {
await this.page.close();
await browser.close();
Logger.info('Closed browser instance.');
}
async authenticate(credentials) {
await this.page.click('#topHolderBox a[href="/Login"]');
await this.page.waitForSelector('#btnSubmit');
Logger.info('Authenticating...');
await this.page.$eval('#username', (el, credentials) => el.value = credentials.username, credentials);
await this.page.$eval('#password', (el, credentials) => el.value = credentials.password, credentials);
await this.page.click('#btnSubmit');
await this.page.waitForSelector('#head a.logo');
Logger.success(`Successfully logged in as ${credentials.username}.`);
}
async getMediaData(mediaURL) {
await this.page.goto(mediaURL);
await this.page.waitForSelector(KissAsianScraper.DEFAULTS.SITE_SELECTOR);
Logger.info(`Visited ${mediaURL}`);
const name = await this.getCurrentMediaName();
const type = await this.getCurrentMediaType();
const isCompleted = await this.getCurrentMediaStatusCompleted();
if (!isCompleted) {
Logger.warn(`Warning! ${name} is still not completed. Proceed only if you're certain.`);
}
Logger.info(`Getting media links for ${type} ${name}...`);
const mediaURLs = await this.page.evaluate(() => {
const table = document.querySelector('.episodeList table.listing');
const tableBody = table.firstElementChild;
const links = [];
for (let i = tableBody.children.length - 1; i > 1; i--) {
const node = tableBody.children.item(i);
const aElement = node.firstElementChild.firstElementChild;
links.push(aElement.href);
}
return links;
});
Logger.success(`Scraped ${mediaURLs.length} media links.`);
if (type === KissAsianScraper.MEDIA_TYPES.SHOW) {
return new Show(name, 1, mediaURLs);
}
const year = await this.getCurrentMediaYear();
return new Movie(name, year, mediaURLs);
}
async populateMediaDownloadURLs(media) {
if (!(media instanceof Media)) {
throw new TypeError('Invalid Media instance passed to scraper!');
}
const downloadURLs = await Utils.mapSeries(media.mediaURLs, async(mediaURL) => {
await this.directlyVisitPlayerURL(mediaURL);
return this.getDownloadLinkForCurrentPlayer();
});
media.setDownloadURLs(downloadURLs);
}
async directlyVisitPlayerURL(playerURL) {
await this.page.goto(`${playerURL}&s=mp`);
await this.page.waitForSelector(KissAsianScraper.DEFAULTS.SITE_SELECTOR);
const isCaptchaEnabled = await this.page.evaluate(() => {
const form = document.getElementById('formVerify');
return !!form;
});
if (isCaptchaEnabled) {
throw new ScraperError(`MP server not available for ${playerURL}`);
}
Logger.info(`Directly visited ${playerURL}`);
}
async getDownloadLinkForCurrentPlayer() {
return await this.page.evaluate(() => {
const divDownload = document.getElementById('divDownload');
const aElement = divDownload.lastElementChild;
return aElement.href;
});
}
async skipCaptcha(playerURL) {
Logger.warn('Skipping captcha...');
const [skipCaptchaButton] = await this.page.$x('//a[contains(., "FE server")]');
if (!skipCaptchaButton) {
throw new ScraperError(`Skip captcha button not found for ${playerURL}`);
}
await skipCaptchaButton.click();
await this.page.waitForSelector(KissAsianScraper.DEFAULTS.SITE_SELECTOR);
Logger.success('Successfully skipped captcha.');
}
async selectEpisodeServerForCurrentPlayer(server) {
try {
await this.page.select('#selectServer', server);
await this.page.waitForSelector(KissAsianScraper.DEFAULTS.SITE_SELECTOR);
Logger.info(`Changed streaming server to ${server}.`);
} catch (err) {
throw new ScraperError(`Server ${server} is unavailable.`);
}
}
async getCurrentMediaName() {
return await this.page.evaluate(() => {
const a = document.querySelector('div.barContent a.bigChar');
return a.text;
});
}
async getCurrentMediaYear() {
return await this.page.evaluate(() => {
const infoSpans = document.querySelectorAll('span.info');
for (let i = 0; i < infoSpans.length; i++) {
const span = infoSpans.item(i);
if (span.textContent === 'Date aired:') {
const date = span.nextSibling.textContent;
const [year] = date.match(/\d{4}/);
return parseInt(year, 10);
}
}
return null;
});
}
async getCurrentMediaStatusCompleted() {
return await this.page.evaluate(() => {
const infoSpans = document.querySelectorAll('span.info');
for (let i = 0; i < infoSpans.length; i++) {
const span = infoSpans.item(i);
if (span.textContent === 'Status:') {
const status = span.nextSibling.textContent;
return status === 'Completed';
}
}
return null;
});
}
async getCurrentMediaType() {
const isMovie = await this.page.evaluate(() => {
const a = document.querySelector('a[href="/Genre/Movie"]');
return !!a;
});
return isMovie ? KissAsianScraper.MEDIA_TYPES.MOVIE : KissAsianScraper.MEDIA_TYPES.SHOW;
}
}
KissAsianScraper.BASE_URL = 'https://kissasian.li';
KissAsianScraper.DEFAULTS = {
SITE_SELECTOR: '#head a.logo'
};
KissAsianScraper.MEDIA_TYPES = {
MOVIE: 'movie',
SHOW: 'show'
};
module.exports = KissAsianScraper;

View File

@ -0,0 +1,38 @@
const parseArgs = require('minimist');
const { InvalidArgumentError } = require('../../errors');
class ArgsParser {
constructor(minimistOptions = ArgsParser.DEFAULT_OPTIONS, requiredArgs = []) {
this.options = minimistOptions;
this.required = requiredArgs;
}
parse(argv) {
const parsedArgs = parseArgs(argv, this.options);
this.validate(parsedArgs);
const { _: [directory], ...rest } = parsedArgs;
return {
...rest,
directory
};
}
validate(parsedArgs) {
this.required.forEach((arg) => {
if (!parsedArgs[arg]) {
throw new InvalidArgumentError(`--${arg} is required!`);
}
});
}
}
ArgsParser.DEFAULT_OPTIONS = {
boolean: ['display'],
default: {
display: false
}
};
module.exports = ArgsParser;

View File

@ -0,0 +1,21 @@
const chalk = require('chalk');
class Logger {
static info(...args) {
console.info(chalk.blue(...args));
}
static error(...args) {
console.error(chalk.red(...args));
}
static success(...args) {
console.log(chalk.green(...args));
}
static warn(...args) {
console.warn(chalk.yellow(...args));
}
}
module.exports = Logger;

View File

@ -0,0 +1,24 @@
class Utils {
static async mapSeries(iterable, action) {
const resolved = [];
for (const x of iterable) {
resolved.push(await action(x));
}
return Promise.resolve(resolved);
}
static wait(duration) {
return new Promise((resolve) => {
setTimeout(resolve, duration);
});
}
static parseTemplate(template, data) {
return Object.keys(data).reduce((str, key) => {
return str.replace(new RegExp(`{${key}}`, 'gi'), data[key]);
}, template);
}
}
module.exports = Utils;

9
src/errors/FatalError.js Normal file
View File

@ -0,0 +1,9 @@
class FatalError extends Error {
constructor(message) {
super(message);
this.name = 'FatalError';
}
}
module.exports = FatalError;

View File

@ -0,0 +1,9 @@
class InvalidArgumentError extends Error {
constructor(message) {
super(message);
this.name = 'InvalidArgumentError';
}
}
module.exports = InvalidArgumentError;

View File

@ -0,0 +1,9 @@
class JDownloaderError extends Error {
constructor(message) {
super(message);
this.name = 'JDownloaderError';
}
}
module.exports = JDownloaderError;

View File

@ -0,0 +1,9 @@
class ScraperError extends Error {
constructor(message) {
super(message);
this.name = 'ScraperError';
}
}
module.exports = ScraperError;

11
src/errors/index.js Normal file
View File

@ -0,0 +1,11 @@
const FatalError = require('./FatalError');
const ScraperError = require('./ScraperError');
const JDownloaderError = require('./JDownloaderError');
const InvalidArgumentError = require('./InvalidArgumentError');
module.exports = {
FatalError,
ScraperError,
JDownloaderError,
InvalidArgumentError
};

54
src/index.js Normal file
View File

@ -0,0 +1,54 @@
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
const AdBlockerPlugin = require('puppeteer-extra-plugin-adblocker');
const ArgsParser = require('./classes/utils/ArgsParser');
const MediaLinksFile = require('./classes/filesystem/MediaLinksFile');
const KissAsianScraper = require('./classes/scraping/KissAsianScraper');
const JDownloaderClient = require('./classes/download/JDownloaderClient');
const Utils = require('./classes/utils/Utils');
const credentials = require('../data/credentials.json');
const args = new ArgsParser().parse(process.argv.slice(2));
puppeteer.use(StealthPlugin());
puppeteer.use(AdBlockerPlugin({ blockTrackers: true }));
const singleMediaProcedure = async(scraper, downloader, mediaURL) => {
const media = await scraper.getMediaData(mediaURL);
await scraper.populateMediaDownloadURLs(media);
await downloader.addLinks(media);
const crawledLinks = await downloader.getCrawledLinks(media.downloadURLs);
const renamedCrawledLinks = downloader.getRenamedCrawledLinks(crawledLinks, media);
await downloader.renameCrawledLinks(renamedCrawledLinks);
await downloader.startDownload(crawledLinks);
};
const main = async() => {
const browser = await puppeteer.launch({ headless: !args.display, slowMo: 250 });
const page = await browser.newPage();
const file = new MediaLinksFile(args.directory);
const mediaToDownload = await file.read();
const scraper = new KissAsianScraper(page);
const downloader = new JDownloaderClient(credentials.jdownloader);
await downloader.load();
await scraper.load();
await scraper.authenticate(credentials.kissasian);
await Utils.mapSeries(mediaToDownload, async(url) => {
await singleMediaProcedure(scraper, downloader, url);
await file.removeFirstLink();
});
await file.remove();
await downloader.finish();
await scraper.finish(browser);
process.exit(0);
};
main();