full rework
This commit is contained in:
parent
3faa6f9a40
commit
ad61784744
786
errors.log
786
errors.log
@ -1,786 +0,0 @@
|
||||
Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 136, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 245, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 136, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 245, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': argument of type 'types.GenericAlias' is not iterable
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 34, in __init
|
||||
if folder not in self.folderDict:
|
||||
TypeError: argument of type 'types.GenericAlias' is not iterable
|
||||
|
||||
Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 136, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 245, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'Aesthetica of a Rogue Hero (2012)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 136, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 245, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 534, in _make_request
|
||||
response = conn.getresponse()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 516, in getresponse
|
||||
httplib_response = super().getresponse()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 1375, in getresponse
|
||||
response.begin()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 318, in begin
|
||||
version, status, reason = self._read_status()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 287, in _read_status
|
||||
raise RemoteDisconnected("Remote end closed connection without"
|
||||
http.client.RemoteDisconnected: Remote end closed connection without response
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 534, in _make_request
|
||||
response = conn.getresponse()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 516, in getresponse
|
||||
httplib_response = super().getresponse()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 1375, in getresponse
|
||||
response.begin()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 318, in begin
|
||||
version, status, reason = self._read_status()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\http\client.py", line 287, in _read_status
|
||||
raise RemoteDisconnected("Remote end closed connection without"
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))
|
||||
|
||||
Unexpected error processing folder 'Aesthetica of a Rogue Hero (2012)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'Alya Sometimes Hides Her Feelings in Russian (2024)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'Angels of Death (2018)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Unexpected error processing folder 'Arifureta (2019)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
Folder: 'A.I.C.O. Incarnation (2018)' - Unexpected error processing folder 'A.I.C.O. Incarnation (2018)': ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
ConnectionResetError: [WinError 10054] Eine vorhandene Verbindung wurde vom Remotehost geschlossen
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 667, in send
|
||||
resp = conn.urlopen(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 841, in urlopen
|
||||
retries = retries.increment(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\retry.py", line 474, in increment
|
||||
raise reraise(type(error), error, _stacktrace)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\util.py", line 38, in reraise
|
||||
raise value.with_traceback(tb)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 787, in urlopen
|
||||
response = self._make_request(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 488, in _make_request
|
||||
raise new_e
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 464, in _make_request
|
||||
self._validate_conn(conn)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connectionpool.py", line 1093, in _validate_conn
|
||||
conn.connect()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 741, in connect
|
||||
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\connection.py", line 920, in _ssl_wrap_socket_and_match_hostname
|
||||
ssl_sock = ssl_wrap_socket(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 480, in ssl_wrap_socket
|
||||
ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\urllib3\util\ssl_.py", line 524, in _ssl_wrap_socket_impl
|
||||
return ssl_context.wrap_socket(sock, server_hostname=server_hostname)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 513, in wrap_socket
|
||||
return self.sslsocket_class._create(
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1104, in _create
|
||||
self.do_handshake()
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\ssl.py", line 1375, in do_handshake
|
||||
self._sslobj.do_handshake()
|
||||
urllib3.exceptions.ProtocolError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
During handling of the above exception, another exception occurred:
|
||||
|
||||
Traceback (most recent call last):
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 31, in __init
|
||||
missings, site = self.__GetMissingEpisodesAndSeason(serie.key, mp4_files)
|
||||
File "D:\repo\AniWorld\src\FolderLookup.py", line 137, in __GetMissingEpisodesAndSeason
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
File "D:\repo\AniWorld\src\AniWorld-Downloader\src\aniworld\common\common.py", line 248, in get_season_episode_count
|
||||
response = session.get(base_url, headers=ANIWORLD_HEADERS, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 602, in get
|
||||
return self.request("GET", url, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 589, in request
|
||||
resp = self.send(prep, **send_kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\sessions.py", line 703, in send
|
||||
r = adapter.send(request, **kwargs)
|
||||
File "C:\Users\lukas\anaconda3\envs\AniWorld\lib\site-packages\requests\adapters.py", line 682, in send
|
||||
raise ConnectionError(err, request=request)
|
||||
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, 'Eine vorhandene Verbindung wurde vom Remotehost geschlossen', None, 10054, None))
|
||||
|
||||
@ -1 +0,0 @@
|
||||
Subproject commit a267efa72a12af19df6641ab2ab39e494a1d0ee8
|
||||
@ -1,137 +0,0 @@
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import logging
|
||||
import json
|
||||
import requests
|
||||
import html
|
||||
from urllib.parse import quote
|
||||
from Serie import Serie
|
||||
from aniworld.models import Anime, Episode, NoMachingLanguage
|
||||
from aniworld.config import PROVIDER_HEADERS, INVALID_PATH_CHARS, ANIWORLD_TO, session, DEFAULT_REQUEST_TIMEOUT
|
||||
from aniworld.parser import arguments
|
||||
|
||||
|
||||
# Read timeout from environment variable, default to 600 seconds (10 minutes)
|
||||
timeout = int(os.getenv("DOWNLOAD_TIMEOUT", 600))
|
||||
|
||||
download_error_logger = logging.getLogger("DownloadErrors")
|
||||
download_error_handler = logging.FileHandler("../download_errors.log")
|
||||
download_error_handler.setLevel(logging.ERROR)
|
||||
download_error_logger.addHandler(download_error_handler)
|
||||
|
||||
|
||||
def CreateSerie(searchEntry):
|
||||
return Serie(searchEntry["link"], searchEntry["name"], "aniworld.to", searchEntry["link"], {})
|
||||
|
||||
def search_anime(keyword: str = None) -> str:
|
||||
|
||||
search_url = f"{ANIWORLD_TO}/ajax/seriesSearch?keyword={quote(keyword)}"
|
||||
anime_list = fetch_anime_list(search_url)
|
||||
|
||||
return anime_list
|
||||
|
||||
def fetch_anime_list(url: str) -> list:
|
||||
response = session.get(url, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
response.raise_for_status()
|
||||
|
||||
clean_text = response.text.strip()
|
||||
|
||||
try:
|
||||
decoded_data = json.loads(html.unescape(clean_text))
|
||||
return decoded_data if isinstance(decoded_data, list) else []
|
||||
except json.JSONDecodeError:
|
||||
try:
|
||||
# Remove BOM and problematic characters
|
||||
clean_text = clean_text.encode('utf-8').decode('utf-8-sig')
|
||||
# Remove problematic characters
|
||||
clean_text = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', clean_text)
|
||||
# Parse the new text
|
||||
decoded_data = json.loads(clean_text)
|
||||
return decoded_data if isinstance(decoded_data, list) else []
|
||||
except (requests.RequestException, json.JSONDecodeError) as exc:
|
||||
raise ValueError("Could not get valid anime: ") from exc
|
||||
|
||||
def AniWorld_download_episode(directory, folder, season, episode, key):
|
||||
"""Helper function to download an individual episode."""
|
||||
try:
|
||||
folder_path = os.path.join(directory, folder, f"Season {season}")
|
||||
anime = Anime(
|
||||
episode_list=[Episode(slug=key, season=season, episode=episode)],
|
||||
language="German Dub",
|
||||
output_directory=folder_path
|
||||
)
|
||||
logging.info(f"Downloading anime {key} season {season} episode {episode}")
|
||||
download(anime)
|
||||
logging.info(f"Downloading completed anime {key} season {season} episode {episode}")
|
||||
except KeyError as keye:
|
||||
download_error_logger.error(f"Language not found for anime: {key} season: {season} episode: {episode}")
|
||||
except NoMachingLanguage as ee:
|
||||
download_error_logger.error(f"Language not found for anime: {key} season: {season} episode: {episode}")
|
||||
except Exception as e:
|
||||
logging.error(f"Error downloading episode {episode} of season {season} for anime {key}: {e}")
|
||||
|
||||
def download(anime: Anime): # pylint: disable=too-many-branches
|
||||
for episode in anime:
|
||||
sanitized_anime_title = ''.join(
|
||||
char for char in anime.title if char not in INVALID_PATH_CHARS
|
||||
)
|
||||
|
||||
if episode.season == 0:
|
||||
output_file = (
|
||||
f"{sanitized_anime_title} - "
|
||||
f"Movie {episode.episode:02} - "
|
||||
f"({anime.language}).mp4"
|
||||
)
|
||||
else:
|
||||
output_file = (
|
||||
f"{sanitized_anime_title} - "
|
||||
f"S{episode.season:02}E{episode.episode:03} - "
|
||||
f"({anime.language}).mp4"
|
||||
)
|
||||
|
||||
output_path = os.path.join(anime.output_directory, output_file)
|
||||
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
||||
command = [
|
||||
"yt-dlp",
|
||||
episode.get_direct_link(anime.provider, anime.language),
|
||||
"--fragment-retries", "infinite",
|
||||
#"--concurrent-fragments", "4",
|
||||
"-o", output_path,
|
||||
"--quiet",
|
||||
"--no-warnings",
|
||||
"--progress"
|
||||
]
|
||||
|
||||
if anime.provider in PROVIDER_HEADERS:
|
||||
for header in PROVIDER_HEADERS[anime.provider]:
|
||||
command.extend(["--add-header", header])
|
||||
|
||||
if arguments.only_command:
|
||||
logging.info(
|
||||
f"{anime.title} - S{episode.season}E{episode.episode} - ({anime.language}): "
|
||||
f"{' '.join(str(item) if item is not None else '' for item in command)}"
|
||||
)
|
||||
continue
|
||||
|
||||
try:
|
||||
subprocess.run(command, check=True, timeout=timeout)
|
||||
except subprocess.TimeoutExpired:
|
||||
download_error_logger.error(f"Download timed out after {timeout} seconds: {' '.join(str(item) for item in command)}")
|
||||
except subprocess.CalledProcessError:
|
||||
download_error_logger.error(f"Error running command: {' '.join(str(item) for item in command)}")
|
||||
except KeyboardInterrupt:
|
||||
logging.warning("Download interrupted by user.")
|
||||
output_dir = os.path.dirname(output_path)
|
||||
is_empty = True
|
||||
|
||||
for file_name in os.listdir(output_dir):
|
||||
if re.search(r'\.(part|ytdl|part-Frag\d+)$', file_name):
|
||||
os.remove(os.path.join(output_dir, file_name))
|
||||
else:
|
||||
is_empty = False
|
||||
|
||||
if is_empty or not os.listdir(output_dir):
|
||||
os.rmdir(output_dir)
|
||||
logging.info(f"Removed empty download directory: {output_dir}")
|
||||
|
||||
327
src/Loaders/AniWorldLoader.py
Normal file
327
src/Loaders/AniWorldLoader.py
Normal file
@ -0,0 +1,327 @@
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import logging
|
||||
import json
|
||||
import requests
|
||||
import html
|
||||
from urllib.parse import quote
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from fake_useragent import UserAgent
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.util.retry import Retry
|
||||
|
||||
from src.Loaders.Loader import Loader
|
||||
from src.Loaders.Providers import Providers
|
||||
from yt_dlp import YoutubeDL
|
||||
|
||||
# Read timeout from environment variable, default to 600 seconds (10 minutes)
|
||||
timeout = int(os.getenv("DOWNLOAD_TIMEOUT", 600))
|
||||
|
||||
download_error_logger = logging.getLogger("DownloadErrors")
|
||||
download_error_handler = logging.FileHandler("../../download_errors.log")
|
||||
download_error_handler.setLevel(logging.ERROR)
|
||||
|
||||
noKeyFound_logger = logging.getLogger("NoKeyFound")
|
||||
noKeyFound_handler = logging.FileHandler("../../NoKeyFound.log")
|
||||
noKeyFound_handler.setLevel(logging.ERROR)
|
||||
|
||||
class AniworldLoader(Loader):
|
||||
def __init__(self):
|
||||
self.SUPPORTED_PROVIDERS = ["VOE", "Doodstream", "Vidmoly", "Vidoza", "SpeedFiles", "Streamtape", "Luluvdo"]
|
||||
self.AniworldHeaders = {
|
||||
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
|
||||
"accept-encoding": "gzip, deflate, br, zstd",
|
||||
"accept-language": "de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
|
||||
"cache-control": "max-age=0",
|
||||
"priority": "u=0, i",
|
||||
"sec-ch-ua": '"Chromium";v="136", "Microsoft Edge";v="136", "Not.A/Brand";v="99"',
|
||||
"sec-ch-ua-mobile": "?0",
|
||||
"sec-ch-ua-platform": '"Windows"',
|
||||
"sec-fetch-dest": "document",
|
||||
"sec-fetch-mode": "navigate",
|
||||
"sec-fetch-site": "none",
|
||||
"sec-fetch-user": "?1",
|
||||
"upgrade-insecure-requests": "1",
|
||||
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0"
|
||||
}
|
||||
self.INVALID_PATH_CHARS = ['<', '>', ':', '"', '/', '\\', '|', '?', '*', '&']
|
||||
self.RANDOM_USER_AGENT = UserAgent().random
|
||||
self.LULUVDO_USER_AGENT = "Mozilla/5.0 (Android 15; Mobile; rv:132.0) Gecko/132.0 Firefox/132.0"
|
||||
self.PROVIDER_HEADERS = {
|
||||
"Vidmoly": ['Referer: "https://vidmoly.to"'],
|
||||
"Doodstream": ['Referer: "https://dood.li/"'],
|
||||
"VOE": [f'User-Agent: {self.RANDOM_USER_AGENT}'],
|
||||
"Luluvdo": [
|
||||
f'User-Agent: {self.LULUVDO_USER_AGENT}',
|
||||
'Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Origin: "https://luluvdo.com"',
|
||||
'Referer: "https://luluvdo.com/"'
|
||||
]}
|
||||
self.ANIWORLD_TO = "https://aniworld.to"
|
||||
self.session = requests.Session()
|
||||
|
||||
# Configure retries with backoff
|
||||
retries = Retry(
|
||||
total=5, # Number of retries
|
||||
backoff_factor=1, # Delay multiplier (1s, 2s, 4s, ...)
|
||||
status_forcelist=[500, 502, 503, 504], # Retry for specific HTTP errors
|
||||
allowed_methods=["GET"]
|
||||
)
|
||||
|
||||
adapter = HTTPAdapter(max_retries=retries)
|
||||
self.session.mount("https://", adapter)
|
||||
self.DEFAULT_REQUEST_TIMEOUT = 30
|
||||
|
||||
self._KeyHTMLDict = {}
|
||||
self._EpisodeHTMLDict = {}
|
||||
self.Providers = Providers()
|
||||
|
||||
def Search(self, word: str) -> list:
|
||||
search_url = f"{self.ANIWORLD_TO}/ajax/seriesSearch?keyword={quote(word)}"
|
||||
anime_list = self.fetch_anime_list(search_url)
|
||||
|
||||
return anime_list
|
||||
|
||||
|
||||
def fetch_anime_list(self, url: str) -> list:
|
||||
response = self.session.get(url, timeout=self.DEFAULT_REQUEST_TIMEOUT)
|
||||
response.raise_for_status()
|
||||
|
||||
clean_text = response.text.strip()
|
||||
|
||||
try:
|
||||
decoded_data = json.loads(html.unescape(clean_text))
|
||||
return decoded_data if isinstance(decoded_data, list) else []
|
||||
except json.JSONDecodeError:
|
||||
try:
|
||||
# Remove BOM and problematic characters
|
||||
clean_text = clean_text.encode('utf-8').decode('utf-8-sig')
|
||||
# Remove problematic characters
|
||||
clean_text = re.sub(r'[\x00-\x1F\x7F-\x9F]', '', clean_text)
|
||||
# Parse the new text
|
||||
decoded_data = json.loads(clean_text)
|
||||
return decoded_data if isinstance(decoded_data, list) else []
|
||||
except (requests.RequestException, json.JSONDecodeError) as exc:
|
||||
raise ValueError("Could not get valid anime: ") from exc
|
||||
|
||||
def _GetLanguageKey(self, language: str) -> int:
|
||||
languageCode = 0
|
||||
if (language == "German Dub"):
|
||||
languageCode = 1
|
||||
if (language == "English Sub"):
|
||||
languageCode = 2
|
||||
if (language == "German Sub"):
|
||||
languageCode = 3
|
||||
return languageCode
|
||||
def IsLanguage(self, season: int, episode: int, key: str, language: str = "German Dub") -> bool:
|
||||
"""
|
||||
Language Codes:
|
||||
1: German Dub
|
||||
2: English Sub
|
||||
3: German Sub
|
||||
"""
|
||||
languageCode = self._GetLanguageKey(language)
|
||||
|
||||
episode_soup = BeautifulSoup(self._GetEpisodeHTML(season, episode, key).content, 'html.parser')
|
||||
change_language_box_div = episode_soup.find(
|
||||
'div', class_='changeLanguageBox')
|
||||
languages = []
|
||||
|
||||
if change_language_box_div:
|
||||
img_tags = change_language_box_div.find_all('img')
|
||||
for img in img_tags:
|
||||
lang_key = img.get('data-lang-key')
|
||||
if lang_key and lang_key.isdigit():
|
||||
languages.append(int(lang_key))
|
||||
|
||||
return languageCode in languages
|
||||
|
||||
|
||||
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str, language: str = "German Dub") -> bool:
|
||||
sanitized_anime_title = ''.join(
|
||||
char for char in self.GetTitle(key) if char not in self.INVALID_PATH_CHARS
|
||||
)
|
||||
|
||||
if season == 0:
|
||||
output_file = (
|
||||
f"{sanitized_anime_title} - "
|
||||
f"Movie {episode:02} - "
|
||||
f"({language}).mp4"
|
||||
)
|
||||
else:
|
||||
output_file = (
|
||||
f"{sanitized_anime_title} - "
|
||||
f"S{season:02}E{episode:03} - "
|
||||
f"({language}).mp4"
|
||||
)
|
||||
|
||||
output_path = os.path.join(os.path.join(baseDirectory, serieFolder), output_file)
|
||||
os.makedirs(os.path.dirname(output_path), exist_ok=True)
|
||||
|
||||
for provider in self.SUPPORTED_PROVIDERS:
|
||||
link, header = self._get_direct_link_from_provider(season, episode, key, language)
|
||||
ydl_opts = {
|
||||
'fragment_retries': float('inf'),
|
||||
'outtmpl': output_path,
|
||||
'quiet': True,
|
||||
'no_warnings': True,
|
||||
'progress_with_newline': True
|
||||
}
|
||||
|
||||
if header:
|
||||
ydl_opts['http_headers'] = header
|
||||
|
||||
with YoutubeDL(ydl_opts) as ydl:
|
||||
ydl.download([link])
|
||||
break
|
||||
|
||||
|
||||
def GetSiteKey(self) -> str:
|
||||
return "aniworld.to"
|
||||
|
||||
def GetTitle(self, key: str) -> str:
|
||||
soup = BeautifulSoup(self._GetKeyHTML(key).content, 'html.parser')
|
||||
title_div = soup.find('div', class_='series-title')
|
||||
|
||||
if title_div:
|
||||
return title_div.find('h1').find('span').text
|
||||
|
||||
return ""
|
||||
|
||||
def _GetKeyHTML(self, key: str):
|
||||
if key in self._KeyHTMLDict:
|
||||
return self._KeyHTMLDict[key]
|
||||
|
||||
|
||||
self._KeyHTMLDict[key] = self.session.get(
|
||||
f"{self.ANIWORLD_TO}/anime/stream/{key}",
|
||||
timeout=self.DEFAULT_REQUEST_TIMEOUT
|
||||
)
|
||||
return self._KeyHTMLDict[key]
|
||||
def _GetEpisodeHTML(self, season: int, episode: int, key: str):
|
||||
if key in self._EpisodeHTMLDict:
|
||||
return self._EpisodeHTMLDict[key]
|
||||
|
||||
|
||||
link = (
|
||||
f"{self.ANIWORLD_TO}/anime/stream/{key}/"
|
||||
f"staffel-{season}/episode-{episode}"
|
||||
)
|
||||
html = self.session.get(link, timeout=self.DEFAULT_REQUEST_TIMEOUT)
|
||||
self._EpisodeHTMLDict[key] = html
|
||||
return self._EpisodeHTMLDict[key]
|
||||
|
||||
def _get_provider_from_html(self, season: int, episode: int, key: str) -> dict:
|
||||
"""
|
||||
Parses the HTML content to extract streaming providers,
|
||||
their language keys, and redirect links.
|
||||
|
||||
Returns a dictionary with provider names as keys
|
||||
and language key-to-redirect URL mappings as values.
|
||||
|
||||
Example:
|
||||
|
||||
{
|
||||
'VOE': {1: 'https://aniworld.to/redirect/1766412',
|
||||
2: 'https://aniworld.to/redirect/1766405'},
|
||||
'Doodstream': {1: 'https://aniworld.to/redirect/1987922',
|
||||
2: 'https://aniworld.to/redirect/2700342'},
|
||||
...
|
||||
}
|
||||
|
||||
Access redirect link with:
|
||||
print(self.provider["VOE"][2])
|
||||
"""
|
||||
|
||||
soup = BeautifulSoup(self._GetEpisodeHTML(season, episode, key).content, 'html.parser')
|
||||
providers = {}
|
||||
|
||||
episode_links = soup.find_all(
|
||||
'li', class_=lambda x: x and x.startswith('episodeLink')
|
||||
)
|
||||
|
||||
if not episode_links:
|
||||
return providers
|
||||
|
||||
for link in episode_links:
|
||||
provider_name_tag = link.find('h4')
|
||||
provider_name = provider_name_tag.text.strip() if provider_name_tag else None
|
||||
|
||||
redirect_link_tag = link.find('a', class_='watchEpisode')
|
||||
redirect_link = redirect_link_tag['href'] if redirect_link_tag else None
|
||||
|
||||
lang_key = link.get('data-lang-key')
|
||||
lang_key = int(
|
||||
lang_key) if lang_key and lang_key.isdigit() else None
|
||||
|
||||
if provider_name and redirect_link and lang_key:
|
||||
if provider_name not in providers:
|
||||
providers[provider_name] = {}
|
||||
providers[provider_name][lang_key] = f"{self.ANIWORLD_TO}{redirect_link}"
|
||||
|
||||
|
||||
return providers
|
||||
def _get_redirect_link(self, season: int, episode: int, key: str, language: str = "German Dub") -> str:
|
||||
languageCode = self._GetLanguageKey(language)
|
||||
if (self.IsLanguage(season, episode, key, language)):
|
||||
for provider_name, lang_dict in self._get_provider_from_html(season, episode, key).items():
|
||||
if languageCode in lang_dict:
|
||||
return(lang_dict[languageCode], provider_name)
|
||||
break
|
||||
return None
|
||||
def _get_embeded_link(self, season: int, episode: int, key: str, language: str = "German Dub"):
|
||||
redirect_link, provider_name = self._get_redirect_link(season, episode, key, language)
|
||||
|
||||
embeded_link = self.session.get(
|
||||
redirect_link, timeout=self.DEFAULT_REQUEST_TIMEOUT,
|
||||
headers={'User-Agent': self.RANDOM_USER_AGENT}).url
|
||||
return embeded_link
|
||||
def _get_direct_link_from_provider(self, season: int, episode: int, key: str, language: str = "German Dub") -> str:
|
||||
"""
|
||||
providers = {
|
||||
"Vidmoly": get_direct_link_from_vidmoly,
|
||||
"Vidoza": get_direct_link_from_vidoza,
|
||||
"VOE": get_direct_link_from_voe,
|
||||
"Doodstream": get_direct_link_from_doodstream,
|
||||
"SpeedFiles": get_direct_link_from_speedfiles,
|
||||
"Luluvdo": get_direct_link_from_luluvdo
|
||||
}
|
||||
|
||||
"""
|
||||
embeded_link = self._get_embeded_link(season, episode, key, language)
|
||||
if embeded_link is None:
|
||||
return None
|
||||
|
||||
return self.Providers.GetProvider("VOE").GetLink(embeded_link, self.DEFAULT_REQUEST_TIMEOUT)
|
||||
|
||||
def get_season_episode_count(self, slug : str) -> dict:
|
||||
base_url = f"{self.ANIWORLD_TO}/anime/stream/{slug}/"
|
||||
response = requests.get(base_url, timeout=self.DEFAULT_REQUEST_TIMEOUT)
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
|
||||
season_meta = soup.find('meta', itemprop='numberOfSeasons')
|
||||
number_of_seasons = int(season_meta['content']) if season_meta else 0
|
||||
|
||||
episode_counts = {}
|
||||
|
||||
for season in range(1, number_of_seasons + 1):
|
||||
season_url = f"{base_url}staffel-{season}"
|
||||
response = requests.get(season_url, timeout=self.DEFAULT_REQUEST_TIMEOUT)
|
||||
soup = BeautifulSoup(response.content, 'html.parser')
|
||||
|
||||
episode_links = soup.find_all('a', href=True)
|
||||
unique_links = set(
|
||||
link['href']
|
||||
for link in episode_links
|
||||
if f"staffel-{season}/episode-" in link['href']
|
||||
)
|
||||
|
||||
episode_counts[season] = len(unique_links)
|
||||
|
||||
return episode_counts
|
||||
|
||||
|
||||
|
||||
27
src/Loaders/Loader.py
Normal file
27
src/Loaders/Loader.py
Normal file
@ -0,0 +1,27 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class Loader(ABC):
|
||||
@abstractmethod
|
||||
def Search(self, word: str) -> list:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def IsLanguage(self, season: int, episode: int, key: str, language: str = "German Dub") -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def Download(self, baseDirectory: str, serieFolder: str, season: int, episode: int, key: str) -> bool:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def GetSiteKey(self) -> str:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def GetTitle(self) -> str:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_season_episode_count(self, slug: str) -> dict:
|
||||
pass
|
||||
10
src/Loaders/Loaders.py
Normal file
10
src/Loaders/Loaders.py
Normal file
@ -0,0 +1,10 @@
|
||||
from src.Loaders.AniWorldLoader import AniworldLoader
|
||||
from src.Loaders.Loader import Loader
|
||||
|
||||
class Loaders:
|
||||
|
||||
def __init__(self):
|
||||
self.dict = {"aniworld.to": AniworldLoader()}
|
||||
|
||||
def GetLoader(self, key: str) -> Loader:
|
||||
return self.dict[key]
|
||||
12
src/Loaders/Providers.py
Normal file
12
src/Loaders/Providers.py
Normal file
@ -0,0 +1,12 @@
|
||||
|
||||
|
||||
from src.Loaders.provider.Provider import Provider
|
||||
from src.Loaders.provider.voe import VOE
|
||||
|
||||
class Providers:
|
||||
|
||||
def __init__(self):
|
||||
self.dict = {"VOE": VOE()}
|
||||
|
||||
def GetProvider(self, key: str) -> Provider:
|
||||
return self.dict[key]
|
||||
0
src/Loaders/__init__.py
Normal file
0
src/Loaders/__init__.py
Normal file
BIN
src/Loaders/__pycache__/AniWorldLoader.cpython-310.pyc
Normal file
BIN
src/Loaders/__pycache__/AniWorldLoader.cpython-310.pyc
Normal file
Binary file not shown.
BIN
src/Loaders/__pycache__/Loader.cpython-310.pyc
Normal file
BIN
src/Loaders/__pycache__/Loader.cpython-310.pyc
Normal file
Binary file not shown.
BIN
src/Loaders/__pycache__/Loaders.cpython-310.pyc
Normal file
BIN
src/Loaders/__pycache__/Loaders.cpython-310.pyc
Normal file
Binary file not shown.
BIN
src/Loaders/__pycache__/Providers.cpython-310.pyc
Normal file
BIN
src/Loaders/__pycache__/Providers.cpython-310.pyc
Normal file
Binary file not shown.
BIN
src/Loaders/__pycache__/__init__.cpython-310.pyc
Normal file
BIN
src/Loaders/__pycache__/__init__.cpython-310.pyc
Normal file
Binary file not shown.
7
src/Loaders/provider/Provider.py
Normal file
7
src/Loaders/provider/Provider.py
Normal file
@ -0,0 +1,7 @@
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
|
||||
class Provider(ABC):
|
||||
@abstractmethod
|
||||
def GetLink(self, embededLink: str, DEFAULT_REQUEST_TIMEOUT: int) -> (str, [str]):
|
||||
pass
|
||||
BIN
src/Loaders/provider/__pycache__/Provider.cpython-310.pyc
Normal file
BIN
src/Loaders/provider/__pycache__/Provider.cpython-310.pyc
Normal file
Binary file not shown.
BIN
src/Loaders/provider/__pycache__/voe.cpython-310.pyc
Normal file
BIN
src/Loaders/provider/__pycache__/voe.cpython-310.pyc
Normal file
Binary file not shown.
59
src/Loaders/provider/doodstream.py
Normal file
59
src/Loaders/provider/doodstream.py
Normal file
@ -0,0 +1,59 @@
|
||||
import re
|
||||
import random
|
||||
import time
|
||||
|
||||
from fake_useragent import UserAgent
|
||||
import requests
|
||||
from src.Loaders.provider.Provider import Provider
|
||||
class Doodstream(Provider):
|
||||
|
||||
def __init__(self):
|
||||
self.RANDOM_USER_AGENT = UserAgent().random
|
||||
|
||||
def GetLink(self, embededLink: str, DEFAULT_REQUEST_TIMEOUT: int) -> str:
|
||||
headers = {
|
||||
'User-Agent': self.RANDOM_USER_AGENT,
|
||||
'Referer': 'https://dood.li/'
|
||||
}
|
||||
|
||||
def extract_data(pattern, content):
|
||||
match = re.search(pattern, content)
|
||||
return match.group(1) if match else None
|
||||
|
||||
def generate_random_string(length=10):
|
||||
characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
|
||||
return ''.join(random.choice(characters) for _ in range(length))
|
||||
|
||||
response = requests.get(
|
||||
embededLink,
|
||||
headers=headers,
|
||||
timeout=DEFAULT_REQUEST_TIMEOUT,
|
||||
verify=False
|
||||
)
|
||||
response.raise_for_status()
|
||||
|
||||
pass_md5_pattern = r"\$\.get\('([^']*\/pass_md5\/[^']*)'"
|
||||
pass_md5_url = extract_data(pass_md5_pattern, response.text)
|
||||
if not pass_md5_url:
|
||||
raise ValueError(
|
||||
f'pass_md5 URL not found using {embededLink}.')
|
||||
|
||||
full_md5_url = f"https://dood.li{pass_md5_url}"
|
||||
|
||||
token_pattern = r"token=([a-zA-Z0-9]+)"
|
||||
token = extract_data(token_pattern, response.text)
|
||||
if not token:
|
||||
raise ValueError(f'Token not found using {embededLink}.')
|
||||
|
||||
md5_response = requests.get(
|
||||
full_md5_url, headers=headers, timeout=DEFAULT_REQUEST_TIMEOUT, verify=False)
|
||||
md5_response.raise_for_status()
|
||||
video_base_url = md5_response.text.strip()
|
||||
|
||||
random_string = generate_random_string(10)
|
||||
expiry = int(time.time())
|
||||
|
||||
direct_link = f"{video_base_url}{random_string}?token={token}&expiry={expiry}"
|
||||
# print(direct_link)
|
||||
|
||||
return direct_link
|
||||
51
src/Loaders/provider/filemoon.py
Normal file
51
src/Loaders/provider/filemoon.py
Normal file
@ -0,0 +1,51 @@
|
||||
import re
|
||||
import requests
|
||||
# import jsbeautifier.unpackers.packer as packer
|
||||
|
||||
from aniworld import config
|
||||
|
||||
REDIRECT_REGEX = re.compile(
|
||||
r'<iframe *(?:[^>]+ )?src=(?:\'([^\']+)\'|"([^"]+)")[^>]*>')
|
||||
SCRIPT_REGEX = re.compile(
|
||||
r'(?s)<script\s+[^>]*?data-cfasync=["\']?false["\']?[^>]*>(.+?)</script>')
|
||||
VIDEO_URL_REGEX = re.compile(r'file:\s*"([^"]+\.m3u8[^"]*)"')
|
||||
|
||||
# TODO Implement this script fully
|
||||
|
||||
|
||||
def get_direct_link_from_filemoon(embeded_filemoon_link: str):
|
||||
session = requests.Session()
|
||||
session.verify = False
|
||||
|
||||
headers = {
|
||||
"User-Agent": config.RANDOM_USER_AGENT,
|
||||
"Referer": embeded_filemoon_link,
|
||||
}
|
||||
|
||||
response = session.get(embeded_filemoon_link, headers=headers)
|
||||
source = response.text
|
||||
|
||||
match = REDIRECT_REGEX.search(source)
|
||||
if match:
|
||||
redirect_url = match.group(1) or match.group(2)
|
||||
response = session.get(redirect_url, headers=headers)
|
||||
source = response.text
|
||||
|
||||
for script_match in SCRIPT_REGEX.finditer(source):
|
||||
script_content = script_match.group(1).strip()
|
||||
|
||||
if not script_content.startswith("eval("):
|
||||
continue
|
||||
|
||||
if packer.detect(script_content):
|
||||
unpacked = packer.unpack(script_content)
|
||||
video_match = VIDEO_URL_REGEX.search(unpacked)
|
||||
if video_match:
|
||||
return video_match.group(1)
|
||||
|
||||
raise Exception("No Video link found!")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
url = input("Enter Filemoon Link: ")
|
||||
print(get_direct_link_from_filemoon(url))
|
||||
90
src/Loaders/provider/hanime.py
Normal file
90
src/Loaders/provider/hanime.py
Normal file
@ -0,0 +1,90 @@
|
||||
import re
|
||||
import json
|
||||
import sys
|
||||
import requests
|
||||
from aniworld.config import DEFAULT_REQUEST_TIMEOUT
|
||||
|
||||
|
||||
def fetch_page_content(url):
|
||||
try:
|
||||
response = requests.get(url, timeout=DEFAULT_REQUEST_TIMEOUT)
|
||||
response.raise_for_status()
|
||||
return response.text
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"Failed to fetch the page content: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def extract_video_data(page_content):
|
||||
match = re.search(r'^.*videos_manifest.*$', page_content, re.MULTILINE)
|
||||
if not match:
|
||||
raise ValueError("Failed to extract video manifest from the response.")
|
||||
|
||||
json_str = match.group(0)[match.group(0).find(
|
||||
'{'):match.group(0).rfind('}') + 1]
|
||||
return json.loads(json_str)
|
||||
|
||||
|
||||
def get_streams(url):
|
||||
page_content = fetch_page_content(url)
|
||||
data = extract_video_data(page_content)
|
||||
video_info = data['state']['data']['video']
|
||||
name = video_info['hentai_video']['name']
|
||||
streams = video_info['videos_manifest']['servers'][0]['streams']
|
||||
|
||||
return {"name": name, "streams": streams}
|
||||
|
||||
|
||||
def display_streams(streams):
|
||||
if not streams:
|
||||
print("No streams available.")
|
||||
return
|
||||
|
||||
print("Available qualities:")
|
||||
for i, stream in enumerate(streams, 1):
|
||||
premium_tag = "(Premium)" if not stream['is_guest_allowed'] else ""
|
||||
print(
|
||||
f"{i}. {stream['width']}x{stream['height']}\t"
|
||||
f"({stream['filesize_mbs']}MB) {premium_tag}")
|
||||
|
||||
|
||||
def get_user_selection(streams):
|
||||
try:
|
||||
selected_index = int(input("Select a stream: ").strip()) - 1
|
||||
if 0 <= selected_index < len(streams):
|
||||
return selected_index
|
||||
|
||||
print("Invalid selection.")
|
||||
return None
|
||||
except ValueError:
|
||||
print("Invalid input.")
|
||||
return None
|
||||
|
||||
|
||||
def get_direct_link_from_hanime(url=None):
|
||||
try:
|
||||
if url is None:
|
||||
if len(sys.argv) > 1:
|
||||
url = sys.argv[1]
|
||||
else:
|
||||
url = input("Please enter the hanime.tv video URL: ").strip()
|
||||
|
||||
try:
|
||||
video_data = get_streams(url)
|
||||
print(f"Video: {video_data['name']}")
|
||||
print('*' * 40)
|
||||
display_streams(video_data['streams'])
|
||||
|
||||
selected_index = None
|
||||
while selected_index is None:
|
||||
selected_index = get_user_selection(video_data['streams'])
|
||||
|
||||
print(f"M3U8 URL: {video_data['streams'][selected_index]['url']}")
|
||||
except ValueError as e:
|
||||
print(f"Error: {e}")
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
get_direct_link_from_hanime()
|
||||
35
src/Loaders/provider/loadx.py
Normal file
35
src/Loaders/provider/loadx.py
Normal file
@ -0,0 +1,35 @@
|
||||
import requests
|
||||
import json
|
||||
from urllib.parse import urlparse
|
||||
|
||||
# TODO Doesn't work on download yet and has to be implemented
|
||||
|
||||
|
||||
def get_direct_link_from_loadx(embeded_loadx_link: str):
|
||||
response = requests.head(
|
||||
embeded_loadx_link, allow_redirects=True, verify=False)
|
||||
|
||||
parsed_url = urlparse(response.url)
|
||||
path_parts = parsed_url.path.split("/")
|
||||
if len(path_parts) < 3:
|
||||
raise ValueError("Invalid path!")
|
||||
|
||||
id_hash = path_parts[2]
|
||||
host = parsed_url.netloc
|
||||
|
||||
post_url = f"https://{host}/player/index.php?data={id_hash}&do=getVideo"
|
||||
headers = {"X-Requested-With": "XMLHttpRequest"}
|
||||
response = requests.post(post_url, headers=headers, verify=False)
|
||||
|
||||
data = json.loads(response.text)
|
||||
print(data)
|
||||
video_url = data.get("videoSource")
|
||||
if not video_url:
|
||||
raise ValueError("No Video link found!")
|
||||
|
||||
return video_url
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
url = input("Enter Loadx Link: ")
|
||||
print(get_direct_link_from_loadx(url))
|
||||
39
src/Loaders/provider/luluvdo.py
Normal file
39
src/Loaders/provider/luluvdo.py
Normal file
@ -0,0 +1,39 @@
|
||||
import re
|
||||
|
||||
import requests
|
||||
|
||||
from aniworld import config
|
||||
|
||||
|
||||
def get_direct_link_from_luluvdo(embeded_luluvdo_link, arguments=None):
|
||||
luluvdo_id = embeded_luluvdo_link.split('/')[-1]
|
||||
filelink = (
|
||||
f"https://luluvdo.com/dl?op=embed&file_code={luluvdo_id}&embed=1&referer=luluvdo.com&adb=0"
|
||||
)
|
||||
|
||||
# The User-Agent needs to be the same as the direct-link ones to work
|
||||
headers = {
|
||||
"Origin": "https://luluvdo.com",
|
||||
"Referer": "https://luluvdo.com/",
|
||||
"User-Agent": config.LULUVDO_USER_AGENT
|
||||
}
|
||||
|
||||
if arguments.action == "Download":
|
||||
headers["Accept-Language"] = "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7"
|
||||
|
||||
response = requests.get(filelink, headers=headers,
|
||||
timeout=config.DEFAULT_REQUEST_TIMEOUT)
|
||||
|
||||
if response.status_code == 200:
|
||||
pattern = r'file:\s*"([^"]+)"'
|
||||
matches = re.findall(pattern, str(response.text))
|
||||
|
||||
if matches:
|
||||
return matches[0]
|
||||
|
||||
raise ValueError("No match found")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
url = input("Enter Luluvdo Link: ")
|
||||
print(get_direct_link_from_luluvdo(url))
|
||||
43
src/Loaders/provider/speedfiles.py
Normal file
43
src/Loaders/provider/speedfiles.py
Normal file
@ -0,0 +1,43 @@
|
||||
import re
|
||||
import base64
|
||||
import requests
|
||||
|
||||
from aniworld.config import DEFAULT_REQUEST_TIMEOUT, RANDOM_USER_AGENT
|
||||
|
||||
SPEEDFILES_PATTERN = re.compile(r'var _0x5opu234 = "(?P<encoded_data>.*?)";')
|
||||
|
||||
|
||||
def get_direct_link_from_speedfiles(embeded_speedfiles_link):
|
||||
response = requests.get(
|
||||
embeded_speedfiles_link,
|
||||
timeout=DEFAULT_REQUEST_TIMEOUT,
|
||||
headers={'User-Agent': RANDOM_USER_AGENT}
|
||||
)
|
||||
|
||||
if "<span class=\"inline-block\">Web server is down</span>" in response.text:
|
||||
raise ValueError(
|
||||
"The SpeedFiles server is currently down.\n"
|
||||
"Please try again later or choose a different hoster."
|
||||
)
|
||||
|
||||
match = SPEEDFILES_PATTERN.search(response.text)
|
||||
|
||||
if not match:
|
||||
raise ValueError("Pattern not found in the response.")
|
||||
|
||||
encoded_data = match.group("encoded_data")
|
||||
decoded = base64.b64decode(encoded_data).decode()
|
||||
decoded = decoded.swapcase()[::-1]
|
||||
decoded = base64.b64decode(decoded).decode()[::-1]
|
||||
decoded_hex = ''.join(chr(int(decoded[i:i + 2], 16))
|
||||
for i in range(0, len(decoded), 2))
|
||||
shifted = ''.join(chr(ord(char) - 3) for char in decoded_hex)
|
||||
result = base64.b64decode(shifted.swapcase()[::-1]).decode()
|
||||
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
speedfiles_link = input("Enter Speedfiles Link: ")
|
||||
print(get_direct_link_from_speedfiles(
|
||||
embeded_speedfiles_link=speedfiles_link))
|
||||
2
src/Loaders/provider/streamtape.py
Normal file
2
src/Loaders/provider/streamtape.py
Normal file
@ -0,0 +1,2 @@
|
||||
def get_direct_link_from_streamtape(embeded_streamtape_link: str) -> str:
|
||||
pass
|
||||
34
src/Loaders/provider/vidmoly.py
Normal file
34
src/Loaders/provider/vidmoly.py
Normal file
@ -0,0 +1,34 @@
|
||||
import re
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from aniworld.config import DEFAULT_REQUEST_TIMEOUT, RANDOM_USER_AGENT
|
||||
|
||||
|
||||
def get_direct_link_from_vidmoly(embeded_vidmoly_link: str):
|
||||
response = requests.get(
|
||||
embeded_vidmoly_link,
|
||||
headers={'User-Agent': RANDOM_USER_AGENT},
|
||||
timeout=DEFAULT_REQUEST_TIMEOUT
|
||||
)
|
||||
html_content = response.text
|
||||
soup = BeautifulSoup(html_content, 'html.parser')
|
||||
scripts = soup.find_all('script')
|
||||
|
||||
file_link_pattern = r'file:\s*"(https?://.*?)"'
|
||||
|
||||
for script in scripts:
|
||||
if script.string:
|
||||
match = re.search(file_link_pattern, script.string)
|
||||
if match:
|
||||
file_link = match.group(1)
|
||||
return file_link
|
||||
|
||||
raise ValueError("No direct link found.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
link = input("Enter Vidmoly Link: ")
|
||||
print('Note: --referer "https://vidmoly.to"')
|
||||
print(get_direct_link_from_vidmoly(embeded_vidmoly_link=link))
|
||||
29
src/Loaders/provider/vidoza.py
Normal file
29
src/Loaders/provider/vidoza.py
Normal file
@ -0,0 +1,29 @@
|
||||
import re
|
||||
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from aniworld.config import DEFAULT_REQUEST_TIMEOUT, RANDOM_USER_AGENT
|
||||
|
||||
|
||||
def get_direct_link_from_vidoza(embeded_vidoza_link: str) -> str:
|
||||
response = requests.get(
|
||||
embeded_vidoza_link,
|
||||
headers={'User-Agent': RANDOM_USER_AGENT},
|
||||
timeout=DEFAULT_REQUEST_TIMEOUT
|
||||
)
|
||||
|
||||
soup = BeautifulSoup(response.content, "html.parser")
|
||||
|
||||
for tag in soup.find_all('script'):
|
||||
if 'sourcesCode:' in tag.text:
|
||||
match = re.search(r'src: "(.*?)"', tag.text)
|
||||
if match:
|
||||
return match.group(1)
|
||||
|
||||
raise ValueError("No direct link found.")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
link = input("Enter Vidoza Link: ")
|
||||
print(get_direct_link_from_vidoza(embeded_vidoza_link=link))
|
||||
101
src/Loaders/provider/voe.py
Normal file
101
src/Loaders/provider/voe.py
Normal file
@ -0,0 +1,101 @@
|
||||
import re
|
||||
import base64
|
||||
import json
|
||||
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.util.retry import Retry
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
from fake_useragent import UserAgent
|
||||
from src.Loaders.provider.Provider import Provider
|
||||
|
||||
class VOE(Provider):
|
||||
|
||||
def __init__(self):
|
||||
self.RANDOM_USER_AGENT = UserAgent().random
|
||||
self.Header = {
|
||||
"User-Agent": self.RANDOM_USER_AGENT
|
||||
}
|
||||
def GetLink(self, embededLink: str, DEFAULT_REQUEST_TIMEOUT: int) -> (str, [str]):
|
||||
self.session = requests.Session()
|
||||
|
||||
# Configure retries with backoff
|
||||
retries = Retry(
|
||||
total=5, # Number of retries
|
||||
backoff_factor=1, # Delay multiplier (1s, 2s, 4s, ...)
|
||||
status_forcelist=[500, 502, 503, 504], # Retry for specific HTTP errors
|
||||
allowed_methods=["GET"]
|
||||
)
|
||||
|
||||
adapter = HTTPAdapter(max_retries=retries)
|
||||
self.session.mount("https://", adapter)
|
||||
DEFAULT_REQUEST_TIMEOUT = 30
|
||||
|
||||
response = self.session.get(
|
||||
embededLink,
|
||||
headers={'User-Agent': self.RANDOM_USER_AGENT},
|
||||
timeout=DEFAULT_REQUEST_TIMEOUT
|
||||
)
|
||||
|
||||
redirect = re.search(r"https?://[^'\"<>]+", response.text)
|
||||
if not redirect:
|
||||
raise ValueError("No redirect found.")
|
||||
|
||||
redirect_url = redirect.group(0)
|
||||
parts = redirect_url.strip().split("/")
|
||||
self.Header["Referer"] = f"{parts[0]}//{parts[2]}/"
|
||||
|
||||
response = self.session.get(redirect_url, headers={'User-Agent': self.RANDOM_USER_AGENT})
|
||||
html = response.content
|
||||
|
||||
extracted = self.extract_voe_from_script(html)
|
||||
if extracted:
|
||||
return extracted, self.Header
|
||||
|
||||
b64match = re.search(r"var a168c='([^']+)'", html)
|
||||
if b64match:
|
||||
decoded = base64.b64decode(b64match.group(1)).decode()[::-1]
|
||||
return json.loads(decoded)["source"], self.Header
|
||||
|
||||
hls = re.search(r"'hls': '(?P<hls>[^']+)'", html)
|
||||
if hls:
|
||||
return base64.b64decode(hls.group("hls")).decode(), self.Header
|
||||
def shift_letters(self, input_str):
|
||||
result = ''
|
||||
for c in input_str:
|
||||
code = ord(c)
|
||||
if 65 <= code <= 90:
|
||||
code = (code - 65 + 13) % 26 + 65
|
||||
elif 97 <= code <= 122:
|
||||
code = (code - 97 + 13) % 26 + 97
|
||||
result += chr(code)
|
||||
return result
|
||||
|
||||
|
||||
def replace_junk(self, input_str):
|
||||
junk_parts = ['@$', '^^', '~@', '%?', '*~', '!!', '#&']
|
||||
for part in junk_parts:
|
||||
input_str = re.sub(re.escape(part), '_', input_str)
|
||||
return input_str
|
||||
|
||||
|
||||
def shift_back(self, s, n):
|
||||
return ''.join(chr(ord(c) - n) for c in s)
|
||||
|
||||
|
||||
def decode_voe_string(self, encoded):
|
||||
step1 = self.shift_letters(encoded)
|
||||
step2 = self.replace_junk(step1).replace('_', '')
|
||||
step3 = base64.b64decode(step2).decode()
|
||||
step4 = self.shift_back(step3, 3)
|
||||
step5 = base64.b64decode(step4[::-1]).decode()
|
||||
return json.loads(step5)
|
||||
|
||||
|
||||
def extract_voe_from_script(self, html):
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
script = soup.find("script", type="application/json")
|
||||
return self.decode_voe_string(script.text[2:-2])["source"]
|
||||
|
||||
|
||||
|
||||
77
src/Main.py
77
src/Main.py
@ -1,36 +1,28 @@
|
||||
import sys
|
||||
import os
|
||||
import logging
|
||||
import AniWorldLoader
|
||||
from src.Loaders import AniWorldLoader
|
||||
import SerieList
|
||||
import SerieScanner
|
||||
from src.Loaders.Loaders import Loaders
|
||||
from src.Serie import Serie
|
||||
|
||||
# Configure logging
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
|
||||
logging.basicConfig(level=logging.FATAL, format='%(asctime)s - %(levelname)s - %(funcName)s - %(message)s')
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setLevel(logging.INFO)
|
||||
console_handler.setLevel(logging.ERROR)
|
||||
console_handler.setFormatter(logging.Formatter(
|
||||
"%(asctime)s - %(levelname)s - %(funcName)s - %(message)s")
|
||||
)
|
||||
logging.getLogger().addHandler(console_handler)
|
||||
logging.getLogger("urllib3.connectionpool").setLevel(logging.INFO)
|
||||
logging.getLogger('charset_normalizer').setLevel(logging.INFO)
|
||||
logging.getLogger().setLevel(logging.INFO)
|
||||
for h in logging.root.handlers:
|
||||
logging.root.removeHandler(h)
|
||||
|
||||
error_logger = logging.getLogger("ErrorLog")
|
||||
error_handler = logging.FileHandler("../errors.log")
|
||||
error_handler.setLevel(logging.ERROR)
|
||||
error_logger.addHandler(error_handler)
|
||||
logging.getLogger("urllib3.connectionpool").setLevel(logging.ERROR)
|
||||
logging.getLogger('charset_normalizer').setLevel(logging.ERROR)
|
||||
logging.getLogger().setLevel(logging.ERROR)
|
||||
for h in logging.getLogger().handlers:
|
||||
logging.getLogger().removeHandler(h)
|
||||
|
||||
noKeyFound_logger = logging.getLogger("NoKeyFound")
|
||||
noKeyFound_handler = logging.FileHandler("../NoKeyFound.log")
|
||||
noKeyFound_handler.setLevel(logging.ERROR)
|
||||
noKeyFound_logger.addHandler(noKeyFound_handler)
|
||||
|
||||
noGerFound_logger = logging.getLogger("noGerFound")
|
||||
noGerFound_handler = logging.FileHandler("../noGerFound.log")
|
||||
noGerFound_handler.setLevel(logging.ERROR)
|
||||
noGerFound_logger.addHandler(noGerFound_handler)
|
||||
|
||||
class NoKeyFoundException(Exception):
|
||||
"""Exception raised when an anime key cannot be found."""
|
||||
@ -42,11 +34,14 @@ class MatchNotFoundError(Exception):
|
||||
|
||||
class SeriesApp:
|
||||
def __init__(self, directory_to_search: str):
|
||||
|
||||
print("Please wait while initializing...")
|
||||
self.directory_to_search = directory_to_search
|
||||
self.SerieScanner = SerieScanner.SerieScanner(directory_to_search)
|
||||
self.Loaders = Loaders()
|
||||
loader = self.Loaders.GetLoader(key="aniworld.to")
|
||||
self.SerieScanner = SerieScanner.SerieScanner(directory_to_search, loader)
|
||||
|
||||
self.List = SerieList.SerieList(self.directory_to_search)
|
||||
print("Please wait while initializing...")
|
||||
self.__InitList__()
|
||||
|
||||
def __InitList__(self):
|
||||
@ -67,10 +62,9 @@ class SeriesApp:
|
||||
self.display_series()
|
||||
while True:
|
||||
selection = input(
|
||||
"\nSelect series by number (e.g. '1', '1,2' or 'all') or type 'rescan' to refresh: ").strip().lower()
|
||||
"\nSelect series by number (e.g. '1', '1,2' or 'all') or type 'exit' to return: ").strip().lower()
|
||||
|
||||
if selection == "rescan":
|
||||
self.rescan()
|
||||
if selection == "exit":
|
||||
return None
|
||||
|
||||
selected_series = []
|
||||
@ -110,9 +104,10 @@ class SeriesApp:
|
||||
|
||||
for season, episodes in serie.episodeDict.items():
|
||||
for episode in episodes:
|
||||
|
||||
if serie.site == "aniworld.to":
|
||||
AniWorldLoader.AniWorld_download_episode(self.directory_to_search, serie.folder, season, episode, serie.key)
|
||||
loader = self.Loaders.GetLoader(key="aniworld.to")
|
||||
if loader.IsLanguage(season, episode, serie.key):
|
||||
print(f"\ndownload {serie.folder} {season} {episode}\n")
|
||||
loader.Download(self.directory_to_search, serie.folder, season, episode, serie.key)
|
||||
|
||||
downloaded += 1
|
||||
total_downloaded += 1
|
||||
@ -123,11 +118,6 @@ class SeriesApp:
|
||||
sys.stdout.flush()
|
||||
print("\nDownload complete!\n")
|
||||
|
||||
def rescan(self):
|
||||
"""Rescan and refresh the series list."""
|
||||
print("\nRescanning series...\n")
|
||||
self.SerieScanner.Scan()
|
||||
self.__InitList__()
|
||||
|
||||
def search_mode(self):
|
||||
"""Search for a series and allow user to select an option."""
|
||||
@ -143,9 +133,9 @@ class SeriesApp:
|
||||
print(f"{i}. {result}")
|
||||
|
||||
while True:
|
||||
selection = input("\nSelect an option by number or type 'start' to return: ").strip().lower()
|
||||
selection = input("\nSelect an option by number or type '<enter>' to return: ").strip().lower()
|
||||
|
||||
if selection == "start":
|
||||
if selection == "":
|
||||
return
|
||||
|
||||
try:
|
||||
@ -153,7 +143,7 @@ class SeriesApp:
|
||||
if 0 <= index < len(results):
|
||||
chosen_name = results[index]
|
||||
|
||||
self.List.add(AniWorldLoader.CreateSerie(chosen_name))
|
||||
self.List.add(Serie(chosen_name["link"], chosen_name["name"], "aniworld.to", chosen_name["link"], {}))
|
||||
return
|
||||
else:
|
||||
print("Invalid selection. Try again.")
|
||||
@ -163,11 +153,20 @@ class SeriesApp:
|
||||
def run(self):
|
||||
"""Main function to run the app."""
|
||||
while True:
|
||||
action = input("\nChoose action ('search' or 'local'): ").strip().lower()
|
||||
action = input("\nChoose action ('s' for search, 'i' for init or 'd' for download): ").strip().lower()
|
||||
|
||||
if action == "search":
|
||||
if action == "s":
|
||||
self.search_mode()
|
||||
elif action == "local":
|
||||
if action == "i":
|
||||
|
||||
print("\nRescanning series...\n")
|
||||
|
||||
self.SerieScanner.Reinit()
|
||||
self.SerieScanner.Scan()
|
||||
|
||||
self.List = SerieList.SerieList(self.directory_to_search)
|
||||
self.__InitList__()
|
||||
elif action == "d":
|
||||
selected_series = self.get_user_selection()
|
||||
if selected_series:
|
||||
self.download_series(selected_series)
|
||||
|
||||
@ -9,6 +9,7 @@ class SerieList:
|
||||
self.load_series()
|
||||
|
||||
def add(self, serie: Serie):
|
||||
if (not self.contains(serie.key)):
|
||||
dataPath = os.path.join(self.directory, serie.folder, "data")
|
||||
animePath = os.path.join(self.directory, serie.folder)
|
||||
os.makedirs(animePath, exist_ok=True)
|
||||
@ -16,6 +17,12 @@ class SerieList:
|
||||
serie.save_to_file(dataPath)
|
||||
self.folderDict[serie.folder] = serie;
|
||||
|
||||
def contains(self, key: str) -> bool:
|
||||
for k, value in self.folderDict.items():
|
||||
if value.key == key:
|
||||
return True
|
||||
return False
|
||||
|
||||
def load_series(self):
|
||||
""" Scan folders and load data files """
|
||||
logging.info(f"Scanning anime folders in: {self.directory}")
|
||||
|
||||
@ -1,21 +1,24 @@
|
||||
import os
|
||||
import re
|
||||
import logging
|
||||
from collections import defaultdict
|
||||
from Serie import Serie
|
||||
import json
|
||||
import traceback
|
||||
from GlobalLogger import setupLogger, error_logger, noKeyFound_logger, noGerFound_logger
|
||||
from GlobalLogger import error_logger, noKeyFound_logger
|
||||
from Exceptions import NoKeyFoundException, MatchNotFoundError
|
||||
import requests
|
||||
from aniworld.common import get_season_episode_count
|
||||
from src.Loaders.Loader import Loader
|
||||
|
||||
|
||||
class SerieScanner:
|
||||
def __init__(self, basePath: str):
|
||||
def __init__(self, basePath: str, loader: Loader):
|
||||
self.directory = basePath
|
||||
self.folderDict: dict[str, Serie] = {} # Proper initialization
|
||||
self.loader = loader
|
||||
logging.info(f"Initialized Loader with base path: {self.directory}")
|
||||
|
||||
def Reinit(self):
|
||||
self.folderDict: dict[str, Serie] = {} # Proper initialization
|
||||
|
||||
|
||||
def is_null_or_whitespace(self, s):
|
||||
return s is None or s.strip() == ""
|
||||
def Scan(self):
|
||||
@ -101,12 +104,10 @@ class SerieScanner:
|
||||
episodes_dict[season].append(episode)
|
||||
else:
|
||||
episodes_dict[season] = [episode]
|
||||
|
||||
return episodes_dict
|
||||
|
||||
|
||||
def __GetMissingEpisodesAndSeason(self, key: str, mp4_files: []):
|
||||
expected_dict = get_season_episode_count(key) # key season , value count of episodes
|
||||
expected_dict = self.loader.get_season_episode_count(key) # key season , value count of episodes
|
||||
filedict = self.__GetEpisodesAndSeasons(mp4_files)
|
||||
episodes_dict = {}
|
||||
for season, expected_count in expected_dict.items():
|
||||
|
||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user