Skip to content

Commit 8c51973

Browse files
committed
- huge speed improvements
- fixed tests
1 parent d96d738 commit 8c51973

File tree

5 files changed

+52
-34
lines changed

5 files changed

+52
-34
lines changed

eporner_api/eporner_api.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
from urllib.parse import urljoin
2424
from functools import cached_property
2525
from typing import Generator, Union, Optional
26-
from base_api.base import BaseCore, setup_logger
2726
from base_api.modules.config import RuntimeConfig
27+
from base_api.base import BaseCore, setup_logger, Helper
2828

2929
"""
3030
Copyright (c) 2024-2025 Johannes Habel
@@ -58,7 +58,7 @@
5858

5959

6060
class Video:
61-
def __init__(self, url: str, enable_html_scraping: bool = False, core: Optional[BaseCore] = None):
61+
def __init__(self, url: str, enable_html_scraping: bool = True, core: Optional[BaseCore] = None):
6262
self.core = core
6363
self.url = url
6464
self.enable_html = enable_html_scraping
@@ -360,8 +360,9 @@ def download(self, quality, path, callback=None, mode=Encoding.mp4_h264, no_titl
360360

361361

362362

363-
class Pornstar:
363+
class Pornstar(Helper):
364364
def __init__(self, url: str, enable_html_scraping: bool = False, core: Optional[BaseCore] = None):
365+
super().__init__(core=core, video=Video)
365366
self.core = core
366367
self.url = url
367368
self.enable_html_scraping = enable_html_scraping
@@ -371,21 +372,18 @@ def __init__(self, url: str, enable_html_scraping: bool = False, core: Optional[
371372
def enable_logging(self, log_file: str, level, log_ip: str = None, log_port: int = None):
372373
self.logger = setup_logger(name="EPorner API - [Pornstar]", log_file=log_file, level=level, http_ip=log_ip, http_port=log_port)
373374

374-
def videos(self, pages: int = 0) -> Generator[Video, None, None]:
375+
def videos(self, pages: int = 0, videos_concurrency: int = None, pages_concurrency: int = None) -> Generator[Video, None, None]:
375376
if pages == 0:
376-
pages = int(self.video_amount) / 37 # One page contains 37 videos
377+
video_amount = str(self.video_amount).replace(",", "")
378+
pages = round(int(video_amount)) / 37 # One page contains 37 videos
377379

378-
urls = []
379-
for page in range(1, pages):
380-
response = self.core.fetch(urljoin(self.url + "/", str(page)))
381-
extraction = REGEX_SCRAPE_VIDEO_URLS.findall(response)
382-
for url in extraction:
383-
url = f"https://www.eporner.com{url}"
384-
url = url.replace("EPTHBN/", "")
385-
urls.append(url)
380+
videos_concurrency = videos_concurrency or self.core.config.videos_concurrency
381+
pages_concurrency = pages_concurrency or self.core.config.pages_concurrency
386382

387-
for url in urls:
388-
yield Video(url, enable_html_scraping=self.enable_html_scraping)
383+
pages = round(pages) # Dont ask
384+
page_urls = [urljoin(f"{self.url}/", str(page)) for page in range(1, pages + 1)]
385+
yield from self.iterator(page_urls=page_urls, extractor=extractor, pages_concurrency=pages_concurrency,
386+
videos_concurrency=videos_concurrency)
389387

390388
@cached_property
391389
def name(self) -> str:
@@ -491,8 +489,9 @@ def biography(self) -> str:
491489
return REGEX_PORNSTAR_BIOGRAPHY.search(self.html_content).group(1)
492490

493491

494-
class Client:
492+
class Client(Helper):
495493
def __init__(self, core: Optional[BaseCore] = None):
494+
super().__init__(core, video=Video)
496495
self.core = core or BaseCore(config=RuntimeConfig())
497496
self.core.initialize_session()
498497
self.core.session.headers.update(headers)
@@ -517,19 +516,18 @@ def search_videos(self, query: str, sorting_gay: Union[str, Gay], sorting_order:
517516
json_data = json.loads(response)
518517
for video_ in json_data.get("videos", []): # Don't know why this works lmao
519518
id_ = video_["url"]
520-
print(id_)
521519
yield Video(id_, enable_html_scraping, core=self.core)
522520

523-
def get_videos_by_category(self, category: Union[str, Category], enable_html_scraping: bool = False)\
524-
-> Generator[Video, None, None]:
525-
for page in range(100):
526-
self.logger.debug(f"Iterating category page ->: {page}")
527-
response = self.core.fetch(f"{ROOT_URL}cat/{category}/{page}")
528-
extraction = REGEX_SCRAPE_VIDEO_URLS.findall(response)
529-
for url in extraction:
530-
url = f"https://www.eporner.com{url}"
531-
url = url.replace("EPTHBN/", "")
532-
yield Video(url, enable_html_scraping=enable_html_scraping, core=self.core)
521+
def get_videos_by_category(self, category: Union[str, Category], enable_html_scraping: bool = False,
522+
videos_concurrency: int = None, pages_concurrency: int = None) -> Generator[Video, None, None]:
523+
524+
page_urls = [f"{ROOT_URL}cat/{category}/{page}" for page in range(1, 100)]
525+
526+
videos_concurrency = videos_concurrency or self.core.config.videos_concurrency
527+
pages_concurrency = pages_concurrency or self.core.config.pages_concurrency
528+
yield from self.iterator(page_urls=page_urls, videos_concurrency=videos_concurrency,
529+
pages_concurrency=pages_concurrency, extractor=extractor)
530+
533531

534532
def get_pornstar(self, url: str, enable_html_scraping: bool = True) -> Pornstar:
535533
self.logger.info(f"Returning Pornstar object for: {url} HTML Scraping -> {enable_html_scraping}")

eporner_api/modules/consts.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,15 @@
4242

4343
headers = {
4444
"Referer": "https://www.eporner.com/"
45-
}
45+
}
46+
47+
48+
def extractor(content: str):
49+
video_urls = []
50+
extraction = REGEX_SCRAPE_VIDEO_URLS.findall(content)
51+
for url in extraction:
52+
url = f"https://www.eporner.com{url}"
53+
url = url.replace("EPTHBN/", "")
54+
video_urls.append(url)
55+
56+
return video_urls

eporner_api/tests/test_category.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
import time
22

33
from ..eporner_api import Client, Category
4+
from base_api import BaseCore
5+
core = BaseCore()
6+
core.config.pages_concurrency = 1
7+
core.config.videos_concurrency = 1
48

59

610
def test_category():
7-
videos_1 = Client().get_videos_by_category(category=Category.JAPANESE)
8-
videos_2 = Client().get_videos_by_category(category=Category.HD)
9-
videos_3 = Client().get_videos_by_category(category=Category.BLONDE)
11+
videos_1 = Client(core).get_videos_by_category(category=Category.JAPANESE)
12+
videos_2 = Client(core).get_videos_by_category(category=Category.HD)
13+
videos_3 = Client(core).get_videos_by_category(category=Category.BLONDE)
1014

1115
for idx, video in enumerate(videos_1):
1216
if idx == 3:

eporner_api/tests/test_pornstar.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,18 @@
11
from ..eporner_api import Client
22
import time
33
url = "https://www.eporner.com/pornstar/riley-reid/"
4-
pornstar = Client().get_pornstar(url, enable_html_scraping=True)
4+
from base_api import BaseCore
5+
core = BaseCore()
6+
core.config.pages_concurrency = 1
7+
core.config.videos_concurrency = 1
8+
9+
pornstar = Client(core).get_pornstar(url, enable_html_scraping=True)
10+
511

612
def test_videos():
713
videos = pornstar.videos(pages=1)
814

915
for idx, video in enumerate(videos):
10-
time.sleep(5) # Lmao
1116
assert isinstance(video.title, str) and len(video.title) > 3
1217
if idx == 5:
1318
break

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "Eporner_API"
7-
version = "1.9.2"
7+
version = "1.9.3"
88
description = "A Python API for the Porn Site Eporner.com"
99
readme = "README.md"
1010
requires-python = ">=3.6"

0 commit comments

Comments
 (0)