diff --git a/poetry.lock b/poetry.lock index 1168c9d..9e2f39b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -282,14 +282,14 @@ six = ">=1.13.0" [[package]] name = "dateparser" -version = "1.1.5" +version = "1.1.6" description = "Date parsing library designed to parse dates from HTML pages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "dateparser-1.1.5-py2.py3-none-any.whl", hash = "sha256:ceb159f1b4a9df54ed6209e91298097deafde476037f8611b4cb2b1cb8b31c58"}, - {file = "dateparser-1.1.5.tar.gz", hash = "sha256:107f3cc87a60770e10d111349adc1504224a6b60753a47a64b0ec842ab85b5a9"}, + {file = "dateparser-1.1.6-py2.py3-none-any.whl", hash = "sha256:c47b6e4b8c4b2b2a21690111b6571b6991295ba327ec6503753abeebf5e80696"}, + {file = "dateparser-1.1.6.tar.gz", hash = "sha256:e703db1815270c020552f4b3e3a981937b48b2cbcfcef5347071b74788dd9214"}, ] [package.dependencies] @@ -361,14 +361,14 @@ test = ["pytest (>=6)"] [[package]] name = "faker" -version = "15.3.4" +version = "16.4.0" description = "Faker is a Python package that generates fake data for you." category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "Faker-15.3.4-py3-none-any.whl", hash = "sha256:c2a2ff9dd8dfd991109b517ab98d5cb465e857acb45f6b643a0e284a9eb2cc76"}, - {file = "Faker-15.3.4.tar.gz", hash = "sha256:2d5443724f640ce07658ca8ca8bbd40d26b58914e63eec6549727869aa67e2cc"}, + {file = "Faker-16.4.0-py3-none-any.whl", hash = "sha256:5420467fad3fa582094057754e5e81326cb1f51ab822bf9df96c077cfb35ae49"}, + {file = "Faker-16.4.0.tar.gz", hash = "sha256:dcffdca8ec9a715982bcd5f53ee688dc4784cd112f9910f8f7183773eb3ec276"}, ] [package.dependencies] @@ -637,14 +637,14 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] [[package]] @@ -820,14 +820,14 @@ files = [ [[package]] name = "packaging" -version = "22.0" +version = "23.0" description = "Core utilities for Python packages" category = "dev" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, - {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, + {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, + {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, ] [[package]] @@ -1166,14 +1166,14 @@ files = [ [[package]] name = "redis" -version = "4.4.0" +version = "4.4.2" description = "Python client for Redis database and key-value store" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "redis-4.4.0-py3-none-any.whl", hash = "sha256:cae3ee5d1f57d8caf534cd8764edf3163c77e073bdd74b6f54a87ffafdc5e7d9"}, - {file = "redis-4.4.0.tar.gz", hash = "sha256:7b8c87d19c45d3f1271b124858d2a5c13160c4e74d4835e28273400fa34d5228"}, + {file = "redis-4.4.2-py3-none-any.whl", hash = "sha256:e6206448e2f8a432871d07d432c13ed6c2abcf6b74edb436c99752b1371be387"}, + {file = "redis-4.4.2.tar.gz", hash = "sha256:a010f6cb7378065040a02839c3f75c7e0fb37a87116fb4a95be82a95552776c7"}, ] [package.dependencies] @@ -1343,14 +1343,14 @@ importlib-metadata = {version = ">=1.0", markers = "python_version < \"3.8\""} [[package]] name = "sentry-sdk" -version = "1.12.1" +version = "1.13.0" description = "Python client for Sentry (https://sentry.io)" category = "main" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.12.1.tar.gz", hash = "sha256:5bbe4b72de22f9ac1e67f2a4e6efe8fbd595bb59b7b223443f50fe5802a5551c"}, - {file = "sentry_sdk-1.12.1-py2.py3-none-any.whl", hash = "sha256:9f0b960694e2d8bb04db4ba6ac2a645040caef4e762c65937998ff06064f10d6"}, + {file = "sentry-sdk-1.13.0.tar.gz", hash = "sha256:72da0766c3069a3941eadbdfa0996f83f5a33e55902a19ba399557cfee1dddcc"}, + {file = "sentry_sdk-1.13.0-py2.py3-none-any.whl", hash = "sha256:b7ff6318183e551145b5c4766eb65b59ad5b63ff234dffddc5fb50340cad6729"}, ] [package.dependencies] @@ -1379,6 +1379,7 @@ rq = ["rq (>=0.6)"] sanic = ["sanic (>=0.8)"] sqlalchemy = ["sqlalchemy (>=1.2)"] starlette = ["starlette (>=0.19.1)"] +starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] [[package]] @@ -1700,14 +1701,14 @@ test = ["pytest (>=4.3)", "pytest-mock (>=3.3)"] [[package]] name = "urllib3" -version = "1.26.13" +version = "1.26.14" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "urllib3-1.26.13-py2.py3-none-any.whl", hash = "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc"}, - {file = "urllib3-1.26.13.tar.gz", hash = "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"}, + {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, + {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, ] [package.extras] @@ -1770,4 +1771,4 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "2.0" python-versions = "^3.7" -content-hash = "55c532d6efbba349d32200a9c181141efd8242f0f9a20223cac14f433e4d059e" +content-hash = "986b9cfc1e566b769ed3eda035cc3b1c25eb7c8b1b278cbe054be801f68d75cf" diff --git a/pynyaata/bridge/animeultime.py b/pynyaata/bridge/animeultime.py index d093bbd..bd4c6a5 100644 --- a/pynyaata/bridge/animeultime.py +++ b/pynyaata/bridge/animeultime.py @@ -29,7 +29,7 @@ class AnimeUltime(Bridge): ( f"{self.base_url}/" f"{'search' if query else 'history'}-0-1/" - f"{page_date.strftime('%m%Y') if query else ''}" + f"{page_date.strftime('%m%Y') if not query else ''}" ), ) @@ -62,15 +62,16 @@ class AnimeUltime(Bridge): tds = tr.find_all("td") - torrents.append( - RemoteFile( - bridge=self.__class__.__name__, - id=tds[0].a["href"].split("/")[1].split("-")[0], - category=tds[1].get_text(), - name=tds[0].get_text(), - link=f"{self.base_url}{tds[0].a['href']}", + if tds: + torrents.append( + RemoteFile( + bridge=self.__class__.__name__, + id=tds[0].a["href"].split("/")[1].split("-")[0], + category=tds[1].get_text(), + name=tds[0].get_text(), + link=f"{self.base_url}/{tds[0].a['href']}", + ) ) - ) elif history and "Historique" in history.get_text(): h3s = html.findAll("h3") @@ -87,7 +88,7 @@ class AnimeUltime(Bridge): id=tds[0].a["href"].split("/")[-2], category=tds[4].get_text(), name=tds[0].get_text(), - link=f"{self.base_url}{tds[0].a['href']}", + link=f"{self.base_url}/{tds[0].a['href']}", date=parse(h3s[i].get_text()[:-3], ["%A %d %B %Y"]), ) ) @@ -98,7 +99,7 @@ class AnimeUltime(Bridge): id=player["data-serie"], category=title.get_text(), name=history.get_text(), - link=f"{self.base_url}file-0-1/{player['data-serie']}", + link=f"{self.base_url}/file-0-1/{player['data-serie']}", date=tables[0].find_all("tr")[1].find_all("td")[1].get_text(), ) ) diff --git a/pyproject.toml b/pyproject.toml index e1e8a59..8e1d13e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ pynyaata = 'pynyaata:run' [tool.poetry.dependencies] python = "^3.7" beautifulsoup4 = "4.11.1" -dateparser = "1.1.5" +dateparser = "1.1.6" flask = "2.2.2" flask-httpauth = "4.7.0" flask-sqlalchemy = "3.0.2" @@ -24,9 +24,9 @@ flask-wtf = "1.0.1" pg8000 = "1.29.4" pydantic = "1.10.4" pymysql = "1.0.2" -redis = "4.4.0" +redis = "4.4.2" requests = "2.28.1" -sentry-sdk = {extras = ["flask"], version = "1.12.1"} +sentry-sdk = {extras = ["flask"], version = "1.13.0"} [tool.poetry.group.dev.dependencies] diff --git a/tests/bridge/test_animeultime.py b/tests/bridge/test_animeultime.py new file mode 100644 index 0000000..ab0445f --- /dev/null +++ b/tests/bridge/test_animeultime.py @@ -0,0 +1,135 @@ +# flake8: noqa: E501 +from datetime import datetime, timedelta + +from pynyaata.bridge.animeultime import AnimeUltime +from pynyaata.types import RemoteFile + +from pytest import mark + + +def test_search_url(): + previous_month = datetime.now() - timedelta(days=30) + + assert ( + AnimeUltime().search_url() + == f"http://www.anime-ultime.net/history-0-1/{datetime.now().strftime('%m%Y')}" + ) + + assert ( + AnimeUltime().search_url("", 2) + == f"http://www.anime-ultime.net/history-0-1/{previous_month.strftime('%m%Y')}" + ) + + assert ( + AnimeUltime().search_url("test", 1) == "http://www.anime-ultime.net/search-0-1/" + ) + + assert ( + AnimeUltime().search_url("test", 2) == "http://www.anime-ultime.net/search-0-1/" + ) + + +@mark.asyncio +async def test_search(): + remotes = [ + RemoteFile( + bridge="AnimeUltime", + id=4631, + category="OAV", + name="Akuma no Riddle: Shousha wa Dare? Nukiuchi Test", + link="http://www.anime-ultime.net/file-0-1/4631-Akuma-no-Riddle-Shousha-wa-Dare-Nukiuchi-Test", + ), + RemoteFile( + bridge="AnimeUltime", + id=4250, + category="OAV", + name="Baka to Test to shoukanjuu (spécial Noël)", + link="http://www.anime-ultime.net/file-0-1/4250-Baka-to-Test-to-shoukanjuu-special-Noel", + ), + RemoteFile( + bridge="AnimeUltime", + id=3057, + category="OAV", + name="Baka to Test to shoukanjuu (spéciaux)", + link="http://www.anime-ultime.net/file-0-1/3057-Baka-to-Test-to-shoukanjuu-speciaux", + ), + RemoteFile( + bridge="AnimeUltime", + id=5453, + category="OAV", + name="Baka to Test to Shoukanjuu Mini Anime", + link="http://www.anime-ultime.net/file-0-1/5453-Baka-to-Test-to-Shoukanjuu-Mini-Anime", + ), + RemoteFile( + bridge="AnimeUltime", + id=2458, + category="Episode", + name="Baka to Test to shoukanjuu ni! [Saison 2]", + link="http://www.anime-ultime.net/file-0-1/2458-Baka-to-Test-to-shoukanjuu-ni-Saison-2", + ), + RemoteFile( + bridge="AnimeUltime", + id=1887, + category="Episode", + name="Baka to Test to shoukanjuu [Saison 1]", + link="http://www.anime-ultime.net/file-0-1/1887-Baka-to-Test-to-shoukanjuu-Saison-1", + ), + RemoteFile( + bridge="AnimeUltime", + id=2320, + category="OAV", + name="Baka to Test to Shoukanjuu: Matsuri", + link="http://www.anime-ultime.net/file-0-1/2320-Baka-to-Test-to-Shoukanjuu-Matsuri", + ), + RemoteFile( + bridge="AnimeUltime", + id=4463, + category="OAV", + name="Baka to Test to Shoukanjuu: Spinout! Sore ga Bokura no Nichijou", + link="http://www.anime-ultime.net/file-0-1/4463-Baka-to-Test-to-Shoukanjuu-Spinout-Sore-ga-Bokura-no-Nichijou", + ), + RemoteFile( + bridge="AnimeUltime", + id=5069, + category="OAV", + name="Shinmai Maou no Testament Burst OAV [Interdit -16 ans]", + link="http://www.anime-ultime.net/file-0-1/5069-Shinmai-Maou-no-Testament-Burst-OAV-Interdit--16-ans", + ), + RemoteFile( + bridge="AnimeUltime", + id=5487, + category="OAV", + name="Shinmai Maou no Testament Departures [Interdit -16 ans]", + link="http://www.anime-ultime.net/file-0-1/5487-Shinmai-Maou-no-Testament-Departures-Interdit--16-ans", + ), + RemoteFile( + bridge="AnimeUltime", + id=4830, + category="OAV", + name="Shinmai Maou no Testament OAD [Interdit -16 ans]", + link="http://www.anime-ultime.net/file-0-1/4830-Shinmai-Maou-no-Testament-OAD-Interdit--16-ans", + ), + RemoteFile( + bridge="AnimeUltime", + id=3449, + category="Film", + name="Robot Contest [J-Film]", + link="http://www.anime-ultime.net/file-0-1/3449-Robot-Contest-J-Film", + ), + RemoteFile( + bridge="AnimeUltime", + id=2879, + category="OST", + name="Baka to Test to shoukanjuu ni! [Saison 2]", + link="http://www.anime-ultime.net/file-0-1/2879-Baka-to-Test-to-shoukanjuu-ni-Saison-2", + ), + RemoteFile( + bridge="AnimeUltime", + id=1926, + category="OST", + name="Baka to Test to shoukanjuu [Saison 1]", + link="http://www.anime-ultime.net/file-0-1/1926-Baka-to-Test-to-shoukanjuu-Saison-1", + ), + ] + + assert await AnimeUltime().search("test") == remotes diff --git a/tests/bridge/test_nyaa.py b/tests/bridge/test_nyaa.py index 102d277..5b0f5c7 100644 --- a/tests/bridge/test_nyaa.py +++ b/tests/bridge/test_nyaa.py @@ -1,7 +1,7 @@ # flake8: noqa: E501 from typing import List -from pynyaata.bridge.nyaa import Nyaa +from pynyaata.bridge.nyaa import Nyaa, EraiRaws from pynyaata.types import Color, RemoteFile from pytest import mark @@ -39,6 +39,26 @@ def test_search_url(): == "https://nyaa.si?f=0&c=1_3&q=%28test+vf%29%7C%28test+vostfr%29%7C%28test+multi%29%7C%28test+fre%29&s=size&o=desc&p=2" ) + assert ( + EraiRaws().search_url() + == "https://nyaa.si/user/Erai-raws?f=0&c=1_2&q=+fre&s=id&o=desc&p=1" + ) + + assert ( + EraiRaws().search_url("", 2) + == "https://nyaa.si/user/Erai-raws?f=0&c=1_2&q=+fre&s=id&o=desc&p=2" + ) + + assert ( + EraiRaws().search_url("test", 1) + == "https://nyaa.si/user/Erai-raws?f=0&c=1_2&q=test+fre&s=size&o=desc&p=1" + ) + + assert ( + EraiRaws().search_url("test", 2) + == "https://nyaa.si/user/Erai-raws?f=0&c=1_2&q=test+fre&s=size&o=desc&p=2" + ) + @mark.asyncio async def test_search(requests_mock: Mocker): @@ -47,7 +67,7 @@ async def test_search(requests_mock: Mocker): Nyaa().search_url(), text=requests.get("https://nyaa.si/user/Chaussette33").text ) - remotes: List[RemoteFile] = [ + remotes = [ RemoteFile( bridge="Nyaa", id=1080919,