full rework

This commit is contained in:
Lukas Pupka-Lipinski 2025-06-22 19:59:48 +02:00
parent 3faa6f9a40
commit ad61784744
30 changed files with 928 additions and 979 deletions

View File

@ -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

View File

@ -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}")

View 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
View 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
View 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
View 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
View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View 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

Binary file not shown.

View 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

View 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))

View 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()

View 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))

View 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))

View 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))

View File

@ -0,0 +1,2 @@
def get_direct_link_from_streamtape(embeded_streamtape_link: str) -> str:
pass

View 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))

View 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
View 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"]

View File

@ -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)

View File

@ -8,7 +8,8 @@ class SerieList:
self.folderDict: dict[str, Serie] = {} # Proper initialization
self.load_series()
def add(self, serie:Serie):
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}")

View File

@ -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():