2323from urllib .parse import urljoin
2424from functools import cached_property
2525from typing import Generator , Union , Optional
26- from base_api .base import BaseCore , setup_logger
2726from base_api .modules .config import RuntimeConfig
27+ from base_api .base import BaseCore , setup_logger , Helper
2828
2929"""
3030Copyright (c) 2024-2025 Johannes Habel
5858
5959
6060class 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 } " )
0 commit comments