diff --git a/Pipfile b/Pipfile index 9524d0e..3abb1aa 100644 --- a/Pipfile +++ b/Pipfile @@ -13,3 +13,4 @@ sphinx-rtd-theme = "*" radon = "*" "flake8" = "*" httpretty = "*" +pylint = "*" diff --git a/Pipfile.lock b/Pipfile.lock index a0b3690..e886064 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "01fabf42a826553591227799f7bee2447edf81a6bec93559917576e2b1018c8d" + "sha256": "2fdcfcd032fa6e2b1aef868df499755a8a4e1038c2c08d6fbc6ee9cd777d05b8" }, "pipfile-spec": 6, "requires": {}, @@ -35,9 +35,10 @@ }, "cfscrape": { "hashes": [ - "sha256:cb9159955d0e6e82cf4ad8cc9b19413e68ebfed1ce98a26e51f62e66d45146f1" + "sha256:0794aa78e586a3af578ff0869f95779bd1702adcdbc9369e8dc470435caaf020", + "sha256:fa7fc172e6872f461377216ddd5a6d82c9650b9d10cac5aa0239998daf3e093a" ], - "version": "==1.9.5" + "version": "==1.9.7" }, "chardet": { "hashes": [ @@ -90,17 +91,17 @@ }, "requests-cache": { "hashes": [ - "sha256:e9270030becc739b0a7f7f834234c73a878b2d794122bf76f40055a22419eb67", - "sha256:fe561ca119879bbcfb51f03a35e35b425e18f338248e59fd5cf2166c77f457a2" + "sha256:6822f788c5ee248995c4bfbd725de2002ad710182ba26a666e85b64981866060", + "sha256:73a7211870f7d67af5fd81cad2f67cfe1cd3eb4ee6a85155e07613968cc72dfc" ], - "version": "==0.4.13" + "version": "==0.5.0" }, "soupsieve": { "hashes": [ - "sha256:afa56bf14907bb09403e5d15fbed6275caa4174d36b975226e3b67a3bb6e2c4b", - "sha256:eaed742b48b1f3e2d45ba6f79401b2ed5dc33b2123dfe216adb90d4bfa0ade26" + "sha256:6898e82ecb03772a0d82bd0d0a10c0d6dcc342f77e0701d0ec4a8271be465ece", + "sha256:b20eff5e564529711544066d7dc0f7661df41232ae263619dede5059799cdfca" ], - "version": "==1.8" + "version": "==1.9.1" }, "tabulate": { "hashes": [ @@ -110,10 +111,10 @@ }, "urllib3": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:4c291ca23bbb55c76518905869ef34bdd5f0e46af7afe6861e8375643ffee1a0", + "sha256:9a247273df709c4fedb38c711e44292304f73f39ab01beda9f6b9fc375669ac3" ], - "version": "==1.24.1" + "version": "==1.24.2" } }, "develop": { @@ -124,6 +125,13 @@ ], "version": "==0.7.12" }, + "astroid": { + "hashes": [ + "sha256:6560e1e1749f68c64a4b5dee4e091fce798d2f0d84ebe638cf0e0585a343acf4", + "sha256:b65db1bbaac9f9f4d190199bb8680af6f6f84fd3769a5ea883df8a91fe68b4c4" + ], + "version": "==2.2.5" + }, "babel": { "hashes": [ "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", @@ -210,12 +218,53 @@ ], "version": "==1.1.0" }, + "isort": { + "hashes": [ + "sha256:01cb7e1ca5e6c5b3f235f0385057f70558b70d2f00320208825fa62887292f43", + "sha256:268067462aed7eb2a1e237fcb287852f22077de3fb07964e87e00f829eea2d1a" + ], + "version": "==4.3.17" + }, "jinja2": { "hashes": [ - "sha256:74c935a1b8bb9a3947c50a54766a969d4846290e1e788ea44c1392163723c3bd", - "sha256:f84be1bb0040caca4cea721fcbbbbd61f9be9464ca236387158b0feea01914a4" + "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", + "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b" ], - "version": "==2.10" + "version": "==2.10.1" + }, + "lazy-object-proxy": { + "hashes": [ + "sha256:0ce34342b419bd8f018e6666bfef729aec3edf62345a53b537a4dcc115746a33", + "sha256:1b668120716eb7ee21d8a38815e5eb3bb8211117d9a90b0f8e21722c0758cc39", + "sha256:209615b0fe4624d79e50220ce3310ca1a9445fd8e6d3572a896e7f9146bbf019", + "sha256:27bf62cb2b1a2068d443ff7097ee33393f8483b570b475db8ebf7e1cba64f088", + "sha256:27ea6fd1c02dcc78172a82fc37fcc0992a94e4cecf53cb6d73f11749825bd98b", + "sha256:2c1b21b44ac9beb0fc848d3993924147ba45c4ebc24be19825e57aabbe74a99e", + "sha256:2df72ab12046a3496a92476020a1a0abf78b2a7db9ff4dc2036b8dd980203ae6", + "sha256:320ffd3de9699d3892048baee45ebfbbf9388a7d65d832d7e580243ade426d2b", + "sha256:50e3b9a464d5d08cc5227413db0d1c4707b6172e4d4d915c1c70e4de0bbff1f5", + "sha256:5276db7ff62bb7b52f77f1f51ed58850e315154249aceb42e7f4c611f0f847ff", + "sha256:61a6cf00dcb1a7f0c773ed4acc509cb636af2d6337a08f362413c76b2b47a8dd", + "sha256:6ae6c4cb59f199d8827c5a07546b2ab7e85d262acaccaacd49b62f53f7c456f7", + "sha256:7661d401d60d8bf15bb5da39e4dd72f5d764c5aff5a86ef52a042506e3e970ff", + "sha256:7bd527f36a605c914efca5d3d014170b2cb184723e423d26b1fb2fd9108e264d", + "sha256:7cb54db3535c8686ea12e9535eb087d32421184eacc6939ef15ef50f83a5e7e2", + "sha256:7f3a2d740291f7f2c111d86a1c4851b70fb000a6c8883a59660d95ad57b9df35", + "sha256:81304b7d8e9c824d058087dcb89144842c8e0dea6d281c031f59f0acf66963d4", + "sha256:933947e8b4fbe617a51528b09851685138b49d511af0b6c0da2539115d6d4514", + "sha256:94223d7f060301b3a8c09c9b3bc3294b56b2188e7d8179c762a1cda72c979252", + "sha256:ab3ca49afcb47058393b0122428358d2fbe0408cf99f1b58b295cfeb4ed39109", + "sha256:bd6292f565ca46dee4e737ebcc20742e3b5be2b01556dafe169f6c65d088875f", + "sha256:cb924aa3e4a3fb644d0c463cad5bc2572649a6a3f68a7f8e4fbe44aaa6d77e4c", + "sha256:d0fc7a286feac9077ec52a927fc9fe8fe2fabab95426722be4c953c9a8bede92", + "sha256:ddc34786490a6e4ec0a855d401034cbd1242ef186c20d79d2166d6a4bd449577", + "sha256:e34b155e36fa9da7e1b7c738ed7767fc9491a62ec6af70fe9da4a057759edc2d", + "sha256:e5b9e8f6bda48460b7b143c3821b21b452cb3a835e6bbd5dd33aa0c8d3f5137d", + "sha256:e81ebf6c5ee9684be8f2c87563880f93eedd56dd2b6146d8a725b50b7e5adb0f", + "sha256:eb91be369f945f10d3a49f5f9be8b3d0b93a4c2be8f8a5b83b0571b8123e0a7a", + "sha256:f460d1ceb0e4a5dcb2a652db0904224f367c9b3c1470d5a7683c0480e582468b" + ], + "version": "==1.3.1" }, "mando": { "hashes": [ @@ -299,19 +348,27 @@ ], "version": "==2.3.1" }, + "pylint": { + "hashes": [ + "sha256:5d77031694a5fb97ea95e828c8d10fc770a1df6eb3906067aaed42201a8a6a09", + "sha256:723e3db49555abaf9bf79dc474c6b9e2935ad82230b10c1138a71ea41ac0fff1" + ], + "index": "pypi", + "version": "==2.3.1" + }, "pyparsing": { "hashes": [ - "sha256:66c9268862641abcac4a96ba74506e594c884e3f57690a696d21ad8210ed667a", - "sha256:f6c5ef0d7480ad048c054c37632c67fca55299990fff127850181659eea33fc3" + "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", + "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" ], - "version": "==2.3.1" + "version": "==2.4.0" }, "pytz": { "hashes": [ - "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", - "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", + "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" ], - "version": "==2018.9" + "version": "==2019.1" }, "radon": { "hashes": [ @@ -358,11 +415,11 @@ }, "sphinx": { "hashes": [ - "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c", - "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08" + "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", + "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" ], "index": "pypi", - "version": "==1.8.5" + "version": "==2.0.1" }, "sphinx-rtd-theme": { "hashes": [ @@ -372,12 +429,47 @@ "index": "pypi", "version": "==0.4.3" }, - "sphinxcontrib-websupport": { + "sphinxcontrib-applehelp": { "hashes": [ - "sha256:68ca7ff70785cbe1e7bccc71a48b5b6d965d79ca50629606c7861a21b206d9dd", - "sha256:9de47f375baf1ea07cdb3436ff39d7a9c76042c10a769c52353ec46e4e8fc3b9" + "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", + "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" ], - "version": "==1.1.0" + "version": "==1.0.1" + }, + "sphinxcontrib-devhelp": { + "hashes": [ + "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", + "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" + ], + "version": "==1.0.1" + }, + "sphinxcontrib-htmlhelp": { + "hashes": [ + "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", + "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-jsmath": { + "hashes": [ + "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", + "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" + ], + "version": "==1.0.1" + }, + "sphinxcontrib-qthelp": { + "hashes": [ + "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", + "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" + ], + "version": "==1.0.2" + }, + "sphinxcontrib-serializinghtml": { + "hashes": [ + "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", + "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" + ], + "version": "==1.1.3" }, "tqdm": { "hashes": [ @@ -394,12 +486,38 @@ "index": "pypi", "version": "==1.13.0" }, + "typed-ast": { + "hashes": [ + "sha256:04894d268ba6eab7e093d43107869ad49e7b5ef40d1a94243ea49b352061b200", + "sha256:16616ece19daddc586e499a3d2f560302c11f122b9c692bc216e821ae32aa0d0", + "sha256:252fdae740964b2d3cdfb3f84dcb4d6247a48a6abe2579e8029ab3be3cdc026c", + "sha256:2af80a373af123d0b9f44941a46df67ef0ff7a60f95872412a145f4500a7fc99", + "sha256:2c88d0a913229a06282b285f42a31e063c3bf9071ff65c5ea4c12acb6977c6a7", + "sha256:2ea99c029ebd4b5a308d915cc7fb95b8e1201d60b065450d5d26deb65d3f2bc1", + "sha256:3d2e3ab175fc097d2a51c7a0d3fda442f35ebcc93bb1d7bd9b95ad893e44c04d", + "sha256:4766dd695548a15ee766927bf883fb90c6ac8321be5a60c141f18628fb7f8da8", + "sha256:56b6978798502ef66625a2e0f80cf923da64e328da8bbe16c1ff928c70c873de", + "sha256:5cddb6f8bce14325b2863f9d5ac5c51e07b71b462361fd815d1d7706d3a9d682", + "sha256:644ee788222d81555af543b70a1098f2025db38eaa99226f3a75a6854924d4db", + "sha256:64cf762049fc4775efe6b27161467e76d0ba145862802a65eefc8879086fc6f8", + "sha256:68c362848d9fb71d3c3e5f43c09974a0ae319144634e7a47db62f0f2a54a7fa7", + "sha256:6c1f3c6f6635e611d58e467bf4371883568f0de9ccc4606f17048142dec14a1f", + "sha256:b213d4a02eec4ddf622f4d2fbc539f062af3788d1f332f028a2e19c42da53f15", + "sha256:bb27d4e7805a7de0e35bd0cb1411bc85f807968b2b0539597a49a23b00a622ae", + "sha256:c9d414512eaa417aadae7758bc118868cd2396b0e6138c1dd4fda96679c079d3", + "sha256:f0937165d1e25477b01081c4763d2d9cdc3b18af69cb259dd4f640c9b900fe5e", + "sha256:fb96a6e2c11059ecf84e6741a319f93f683e440e341d4489c9b161eca251cf2a", + "sha256:fc71d2d6ae56a091a8d94f33ec9d0f2001d1cb1db423d8b4355debfe9ce689b7" + ], + "markers": "implementation_name == 'cpython'", + "version": "==1.3.4" + }, "urllib3": { "hashes": [ - "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", - "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" + "sha256:4c291ca23bbb55c76518905869ef34bdd5f0e46af7afe6861e8375643ffee1a0", + "sha256:9a247273df709c4fedb38c711e44292304f73f39ab01beda9f6b9fc375669ac3" ], - "version": "==1.24.1" + "version": "==1.24.2" }, "webencodings": { "hashes": [ @@ -407,6 +525,12 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" + }, + "wrapt": { + "hashes": [ + "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533" + ], + "version": "==1.11.1" } } } diff --git a/anime_downloader/.#util.py b/anime_downloader/.#util.py new file mode 120000 index 0000000..ba58f0c --- /dev/null +++ b/anime_downloader/.#util.py @@ -0,0 +1 @@ +vn-ki@this.1316:1557033979 \ No newline at end of file diff --git a/anime_downloader/downloader/__init__.py b/anime_downloader/downloader/__init__.py index 913ad25..4a2ec41 100644 --- a/anime_downloader/downloader/__init__.py +++ b/anime_downloader/downloader/__init__.py @@ -1,5 +1,12 @@ from anime_downloader.downloader.http_downloader import HTTPDownloader +from anime_downloader.downloader.external_downloader import ExternalDownloader def get_downloader(downloader): - return HTTPDownloader + """get_downloader returns the proper downloader class + + TODO: Lazy loading of downloaders + """ + if downloader == 'http': + return HTTPDownloader + return ExternalDownloader diff --git a/anime_downloader/downloader/base_downloader.py b/anime_downloader/downloader/base_downloader.py index 779cbf7..ba858c3 100644 --- a/anime_downloader/downloader/base_downloader.py +++ b/anime_downloader/downloader/base_downloader.py @@ -10,13 +10,16 @@ logger = logging.getLogger(__name__) class BaseDownloader: - def __init__(self, source, path, force, range_size=None): + def __init__(self, source, path, force, options=None): logger.info(path) self.url = source.stream_url self.referer = source.referer self.path = path - self.range_size = range_size + + if options is None: + options = {} + self.options = options util.make_dir(path.rsplit('/', 1)[0]) diff --git a/anime_downloader/downloader/external_downloader.py b/anime_downloader/downloader/external_downloader.py new file mode 100644 index 0000000..2964691 --- /dev/null +++ b/anime_downloader/downloader/external_downloader.py @@ -0,0 +1,34 @@ +from anime_downloader.downloader.base_downloader import BaseDownloader +from anime_downloader import session + +from pathlib import Path +import time +import sys +import subprocess + +session = session.get_session() + + +class ExternalDownloader(BaseDownloader): + def _download(self): + executable = self.options['executable'] + opts = self.options['cmd_opts'] + path = Path(self.path) + + # TODO: Pull this into downloadersession? + rep_dict = { + 'stream_url': self.url, + 'file_format': str(path.name), + 'download_dir': str(path.parent.absolute()), + 'referer': self.referer, + } + + cmd = [executable] + opts + cmd = [c.format(**rep_dict) for c in cmd] + p = subprocess.Popen(cmd) + return_code = p.wait() + + if return_code != 0: + # Sleep for a while to make sure downloader exits correctly + time.sleep(2) + sys.exit(1) diff --git a/anime_downloader/downloader/http_downloader.py b/anime_downloader/downloader/http_downloader.py index 14393e0..bc6b26a 100644 --- a/anime_downloader/downloader/http_downloader.py +++ b/anime_downloader/downloader/http_downloader.py @@ -8,13 +8,13 @@ session = session.get_session() class HTTPDownloader(BaseDownloader): def _download(self): - if self.range_size is None: + if self.options['range_size'] is None: self._non_range_download() else: self._ranged_download() def _ranged_download(self): - http_chunksize = self.range_size + http_chunksize = self.options['range_size'] range_start = 0 range_end = http_chunksize diff --git a/anime_downloader/session.py b/anime_downloader/session.py index f36caec..63679f1 100644 --- a/anime_downloader/session.py +++ b/anime_downloader/session.py @@ -1,14 +1,18 @@ +import logging + import requests +import requests_cache import urllib3 from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry -import requests_cache +import tempfile -import logging +from anime_downloader import downloader logger = logging.getLogger(__name__) -requests_cache.install_cache('anime_downloader', expires_after=300) +file = tempfile.mktemp() +requests_cache.install_cache('anime_downloader', expires_after=300, location=file) _session = requests_cache.CachedSession() @@ -45,3 +49,32 @@ def get_session(custom_session=None): _session.hooks = {'response': hook} return _session + + +class DownloaderSession: + external_downloaders = { + "aria2": { + "executable": "aria2c", + "cmd_opts": [ + "{stream_url}", "-x", "12", "-s", "12", + "-j", "12", "-k", "10M", "-o", "{file_format}", + "--continue", "true", "--dir", "{download_dir}", + "--stream-piece-selector", "inorder", "--min-split-size", + "5M", "--referer", "{referer}" + ], + "_disable_ssl_additional": ["--check-certificate", "false"], + }, + } + + def __init__(self, disable_ssl=False): + # TODO: Figure out a way to do disable_ssl elgantly + # Disablining ssl check should be in session and not in + # donwloader because it's a session wise option + + # TODO: Add ability to add downloaders using config + pass + + def __getitem__(self, key): + if key == 'http': + return downloader.get_downloader('http')() + return self.down diff --git a/anime_downloader/sites/anime.py b/anime_downloader/sites/anime.py index 2793e2d..6ed7816 100644 --- a/anime_downloader/sites/anime.py +++ b/anime_downloader/sites/anime.py @@ -42,7 +42,7 @@ class Anime: title = '' meta = dict() subclasses = {} - QUALITIES = None + QUALITIES = [] @classmethod def search(cls, query): @@ -62,9 +62,13 @@ class Anime: return def __init__(self, url=None, quality='720p', - fallback_qualities=['720p', '480p', '360p'], + fallback_qualities=None, _skip_online_data=False): self.url = url + + if fallback_qualities is None: + fallback_qualities = ['720p', '480p', '360p'] + self._fallback_qualities = [ q for q in fallback_qualities if q in self.QUALITIES] @@ -80,8 +84,8 @@ class Anime: self._len = len(self._episode_urls) @classmethod - def verify_url(self, url): - if self.sitename in url: + def verify_url(cls, url): + if cls.sitename in url: return True return False @@ -91,6 +95,19 @@ class Anime: @classmethod def factory(cls, sitename: str): + """ + factory returns the appropriate subclass for the given site name. + + Parameters + ---------- + sitename: str + sitename is the name of the site + + Returns + ------- + subclass of :py:class:`Anime` + Sub class of :py:class:`Anime` + """ return cls.subclasses[sitename] @classmethod @@ -155,12 +172,13 @@ class Anime: episode_class = AnimeEpisode.subclasses[self.sitename] if isinstance(index, int): ep_id = self._episode_urls[index] - return episode_class(ep_id[1], self.quality, parent=self, + return episode_class(ep_id[1], parent=self, ep_no=ep_id[0]) elif isinstance(index, slice): anime = copy.deepcopy(self) anime._episode_urls = anime._episode_urls[index] return anime + return None def __repr__(self): return ''' @@ -175,7 +193,7 @@ Episode count: {length} def __str__(self): return self.title - def _scarpe_episodes(self, soup): + def _scarpe_episodes(self): """ _scarpe_episodes is function which has to be overridden by the base classes to scrape the episode urls from the web page. @@ -193,7 +211,7 @@ Episode count: {length} """ return - def _scrape_metadata(self, soup): + def _scrape_metadata(self): """ _scrape_metadata is function which has to be overridden by the base classes to scrape the metadata of anime from the web page. @@ -208,19 +226,40 @@ Episode count: {length} class AnimeEpisode: - QUALITIES = None + """ + Base class for all Episode classes. + + Parameters + ---------- + url: string + URL of the episode. + quality: One of ['360p', '480p', '720p', '1080p'] + Quality of episode + fallback_qualities: list + The order of fallback. + + Attributes + ---------- + sitename: str + name of the site + title: str + Title of the anime + meta: dict + metadata about the anime. [Can be empty] + QUALITIES: list + Possible qualities for the site + """ + QUALITIES = [] title = '' stream_url = '' subclasses = {} - def __init__(self, url, quality='720p', parent=None, - ep_no=None): - if quality not in self.QUALITIES: - raise AnimeDLError('Incorrect quality: "{}"'.format(quality)) + def __init__(self, url, parent: Anime = None, ep_no=None): self.ep_no = ep_no self.url = url - self.quality = quality + self.quality = parent.quality + self.QUALITIES = parent.QUALITIES self._parent = parent self._sources = None self.pretty_title = '{}-{}'.format(self._parent.title, self.ep_no) diff --git a/anime_downloader/sites/kissanime.py b/anime_downloader/sites/kissanime.py index c5ad3cd..6bb10d4 100644 --- a/anime_downloader/sites/kissanime.py +++ b/anime_downloader/sites/kissanime.py @@ -9,6 +9,7 @@ logger = logging.getLogger(__name__) class KissanimeEpisode(AnimeEpisode, sitename='kissanime'): + """KissanimeEpisode""" QUALITIES = ['360p', '480p', '720p', '1080p'] _base_url = 'http://kissanime.ru' VERIFY_HUMAN = True @@ -25,6 +26,7 @@ class KissanimeEpisode(AnimeEpisode, sitename='kissanime'): class KissAnime(Anime, sitename='kissanime'): + """KissAnime""" sitename = 'kissanime' _referer = 'http://kissanime.ru' QUALITIES = ['360p', '480p', '720p', '1080p'] diff --git a/anime_downloader/sites/twistmoe.py b/anime_downloader/sites/twistmoe.py index 2fc80cd..c939f22 100644 --- a/anime_downloader/sites/twistmoe.py +++ b/anime_downloader/sites/twistmoe.py @@ -1,7 +1,6 @@ from Crypto.Cipher import AES import base64 from hashlib import md5 -from bs4 import BeautifulSoup import warnings from anime_downloader import session @@ -27,6 +26,7 @@ class TwistMoeEpisode(AnimeEpisode, sitename='twist.moe'): class TwistMoe(Anime, sitename='twist.moe'): + sitename = 'twist.moe' QUALITIES = ['360p', '480p', '720p', '1080p'] _api_url = "https://twist.moe/api/anime/{}/sources" diff --git a/anime_downloader/util.py b/anime_downloader/util.py index d3af4d9..2d44d77 100644 --- a/anime_downloader/util.py +++ b/anime_downloader/util.py @@ -193,7 +193,7 @@ def format_command(cmd, episode, file_format, path): cmd_dict = { '{aria2}': 'aria2c {stream_url} -x 12 -s 12 -j 12 -k 10M -o ' '{file_format}.mp4 --continue=true --dir={download_dir}' - ' --stream-piece-selector=inorder --min-split-size=5M --referer={referer}' + ' --stream-piece-selector=inorder --min-split-size=5M --referer={referer} --check-certificate=false' } rep_dict = { 'stream_url': episode.source().stream_url,