Add Filmpalast series catalog browsing
This commit is contained in:
@@ -43,6 +43,7 @@ DEFAULT_BASE_URL = "https://filmpalast.to"
|
||||
DEFAULT_TIMEOUT = 20
|
||||
DEFAULT_PREFERRED_HOSTERS = ["voe", "vidoza", "streamtape", "doodstream", "mixdrop"]
|
||||
SERIES_HINT_PREFIX = "series://filmpalast/"
|
||||
SERIES_VIEW_PATH = "/serien/view"
|
||||
SEASON_EPISODE_RE = re.compile(r"\bS\s*(\d{1,2})\s*E\s*(\d{1,3})\b", re.IGNORECASE)
|
||||
GLOBAL_SETTING_LOG_URLS = "debug_log_urls"
|
||||
GLOBAL_SETTING_DUMP_HTML = "debug_dump_html"
|
||||
@@ -229,6 +230,7 @@ class FilmpalastPlugin(BasisPlugin):
|
||||
self._genre_page_count_cache: Dict[str, int] = {}
|
||||
self._alpha_to_url: Dict[str, str] = {}
|
||||
self._alpha_page_count_cache: Dict[str, int] = {}
|
||||
self._series_page_count_cache: Dict[int, int] = {}
|
||||
self._requests_available = REQUESTS_AVAILABLE
|
||||
self._default_preferred_hosters: List[str] = list(DEFAULT_PREFERRED_HOSTERS)
|
||||
self._preferred_hosters: List[str] = list(self._default_preferred_hosters)
|
||||
@@ -497,7 +499,7 @@ class FilmpalastPlugin(BasisPlugin):
|
||||
return max_page
|
||||
|
||||
def capabilities(self) -> set[str]:
|
||||
return {"genres", "alpha"}
|
||||
return {"genres", "alpha", "series_catalog"}
|
||||
|
||||
def _parse_alpha_links(self, soup: BeautifulSoupT) -> Dict[str, str]:
|
||||
alpha: Dict[str, str] = {}
|
||||
@@ -571,6 +573,45 @@ class FilmpalastPlugin(BasisPlugin):
|
||||
titles.sort(key=lambda value: value.casefold())
|
||||
return titles
|
||||
|
||||
def _series_view_url(self) -> str:
|
||||
return _absolute_url(SERIES_VIEW_PATH)
|
||||
|
||||
def series_catalog_page_count(self, page: int = 1) -> int:
|
||||
if not self._requests_available:
|
||||
return 1
|
||||
cache_key = int(page or 1)
|
||||
if cache_key in self._series_page_count_cache:
|
||||
return max(1, int(self._series_page_count_cache.get(cache_key, 1)))
|
||||
base_url = self._series_view_url()
|
||||
if not base_url:
|
||||
return 1
|
||||
try:
|
||||
soup = _get_soup(base_url, session=get_requests_session("filmpalast", headers=HEADERS))
|
||||
except Exception:
|
||||
return 1
|
||||
pages = self._extract_last_page(soup)
|
||||
self._series_page_count_cache[cache_key] = max(1, pages)
|
||||
return self._series_page_count_cache[cache_key]
|
||||
|
||||
def series_catalog_page(self, page: int) -> List[str]:
|
||||
if not self._requests_available:
|
||||
return []
|
||||
base_url = self._series_view_url()
|
||||
if not base_url:
|
||||
return []
|
||||
page = max(1, int(page or 1))
|
||||
url = base_url if page == 1 else urljoin(base_url.rstrip("/") + "/", f"page/{page}")
|
||||
try:
|
||||
soup = _get_soup(url, session=get_requests_session("filmpalast", headers=HEADERS))
|
||||
except Exception:
|
||||
return []
|
||||
hits = self._parse_listing_hits(soup)
|
||||
return self._apply_hits_to_title_index(hits)
|
||||
|
||||
def series_catalog_has_more(self, page: int) -> bool:
|
||||
total = self.series_catalog_page_count(page)
|
||||
return page < total
|
||||
|
||||
def genres(self) -> List[str]:
|
||||
if not self._requests_available:
|
||||
return []
|
||||
|
||||
Reference in New Issue
Block a user