diff --git a/IPTVPlayer/hosts/hostzaluknijcc.py b/IPTVPlayer/hosts/hostzaluknijcc.py index 6c5b7138..785bb45b 100644 --- a/IPTVPlayer/hosts/hostzaluknijcc.py +++ b/IPTVPlayer/hosts/hostzaluknijcc.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Last Modified: 27.04.2026 - damagic +# Last Modified: 01.05.2026 - damagic ################################################### import re import json @@ -31,6 +31,7 @@ def __init__(self): self.MAIN_URL = gettytul() self.cacheLinks = {} self.cacheDescriptions = {} + self.cacheDetails = {} self.MENU = [ {"category": "list_items", "title": "Filmy Premiery", "url": self.getFullUrl("filmy-online/sort:premiere/")}, {"category": "list_items", "title": "Filmy Nowe Linki", "url": self.getFullUrl("filmy-online/sort:link/")}, @@ -43,7 +44,6 @@ def __init__(self): def getPage(self, baseUrl, addParams=None, post_data=None, max_retries=5): if addParams is None: addParams = dict(self.defaultParams) - addParams["cloudflare_params"] = { "cookie_file": addParams["cookiefile"], "User-Agent": self.HEADER.get("User-Agent"), @@ -51,11 +51,9 @@ def getPage(self, baseUrl, addParams=None, post_data=None, max_retries=5): "timeout": 30, "use_mye2iserver": True } - for attempt in range(max_retries): if attempt > 0: time.sleep(2) - try: sts, data = self.cm.getPageCFProtection(baseUrl, addParams, post_data) if sts and data and len(data) > 1000: @@ -63,9 +61,7 @@ def getPage(self, baseUrl, addParams=None, post_data=None, max_retries=5): return sts, data except Exception as e: printDBG("Zaluknij.getPage - attempt %d exception: %s" % (attempt + 1, str(e))) - printDBG("Zaluknij.getPage - attempt %d failed for %s" % (attempt + 1, baseUrl)) - return False, "" def fixIconUrl(self, icon_url): @@ -73,32 +69,88 @@ def fixIconUrl(self, icon_url): icon_url = icon_url.replace("thumb", "big") return icon_url + def extractMovieDetails(self, data): + details = {"categories": [], "version": "", "quality": "", "year": ""} + year = self.cm.ph.getSearchGroups(data, r'(\d{4})') + if year: + details["year"] = year[0] + cat_pattern = r'
  • ([^<]+)
  • ' + categories = re.findall(cat_pattern, data) + if categories: + details["categories"] = categories + table_parts = self.cm.ph.getDataBeetwenNodes(data, (""), ("")) + if table_parts and len(table_parts) > 1: + table = table_parts[1] + rows = self.cm.ph.getAllItemsBeetwenNodes(table, (""), ("")) + versions = set() + qualities = set() + for row in rows: + if ""), ("")) + if len(cells) >= 4: + if "link-to-video" in cells[1]: + if len(cells) > 2: + version = self.cleanHtmlStr(cells[2]) + if version and version not in ["", "Wersja"]: + versions.add(version) + if len(cells) > 3: + quality = self.cleanHtmlStr(cells[3]) + if quality and quality not in ["", "Jakość"]: + qualities.add(quality) + if versions: + details["version"] = ", ".join(sorted(versions)) + if qualities: + details["quality"] = ", ".join(sorted(qualities)) + return details + def getArticleContent(self, cItem): printDBG("Zaluknij.getArticleContent [%s]" % cItem) - url = cItem.get("url", "") title = cItem.get("title", "") icon = cItem.get("icon", self.DEFAULT_ICON_URL) - if not url: return [] - - if url in self.cacheDescriptions: - desc = self.cacheDescriptions[url] - if desc: - return [{"title": title, "text": desc, "images": [{"title": "", "url": icon}], "other_info": {"custom_items_list": []}}] - - sts, data = self.getPage(url, max_retries=3) - if sts: - desc = self.cm.ph.getSearchGroups(data, r'([^<]+)') - if not desc: - desc = self.cm.ph.getSearchGroups(data, r'([^<]+)') + if not desc: + desc = self.cm.ph.getSearchGroups(data, r'([^<]+)') if desc: desc = desc[0] else: desc = "" - - data = re.findall(r'href="([^"]+)">\W(s\d+e\d+)', data, re.DOTALL) - for url, episode_num in data: + episodes = re.findall(r'href="([^"]+)">\W(s\d+e\d+)', data, re.DOTALL) + for url, episode_num in episodes: params = dict(cItem) title = cItem["title"] title = re.sub(r"\s*\[\]\s*", "", title) title = title.strip() - params.update({"good_for_fav": True, "title": "%s [%s]" % (title, episode_num.upper()), "url": self.getFullUrl(url), "icon": icon, "desc": desc}) self.addVideo(params) @@ -183,43 +232,35 @@ def listEpisodesDirect(self, cItem): sts, htm = self.getPage(cItem["url"]) if not sts: return - nextPage = self.cm.ph.getSearchGroups(htm, r"""href=['"]([^"']+)["'](?: data-pagenumber='\d+'>|>)Nast""") if nextPage: nextPage = nextPage[0] - data = self.cm.ph.getAllItemsBeetwenMarkers(htm, 'role="listitem', "") or self.cm.ph.getAllItemsBeetwenMarkers(htm, 'class="col-sm-4">', "") - for item in data: url = self.cm.ph.getSearchGroups(item, 'href="([^"]+)') if not url: continue url = url[0] - icon = self.cm.ph.getSearchGroups(item, 'src="([^"]+)') if icon: icon = self.getFullUrl(icon[0]) else: icon = self.DEFAULT_ICON_URL - title = self.cm.ph.getSearchGroups(item, 'title="([^"]+)') if title: title = self.cleanHtmlStr(title[0]) else: title = "Brak tytułu" title = re.sub(r"\s*\[\]\s*", "", title) - meta_line = self.cm.ph.getSearchGroups(item, r'(S\d+\s*E\d+)') if meta_line: meta_line = self.cleanHtmlStr(meta_line[0]) title = "%s [%s]" % (title, meta_line) title = re.sub(r"\s*\[\]\s*", "", title) title = title.strip() - params = dict(cItem) params.update({"good_for_fav": True, "category": "video", "title": title.replace("amp;", ""), "url": url, "icon": icon}) self.addVideo(params) - if nextPage: params = dict(cItem) next_url = cItem["url"].split("?")[0] + nextPage.replace("amp;", "") @@ -286,24 +327,20 @@ def getLinksForVideo(self, cItem): cacheTab = self.cacheLinks.get(cacheKey, []) if len(cacheTab): return cacheTab - retTab = [] url = cItem["url"] sts, data = self.getPage(url, max_retries=3) if not sts: return [] - desc = self.cm.ph.getSearchGroups(data, r'([^<]+)') if desc: self.cacheDescriptions[url] = self.cleanHtmlStr(desc[0]) - link_list_div = "" link_list_parts = self.cm.ph.getDataBeetwenNodes(data, ("", "link-list"), ("")) if link_list_parts and len(link_list_parts) > 1: link_list_div = link_list_parts[1] if not link_list_div: link_list_div = data - table_parts = self.cm.ph.getDataBeetwenNodes(link_list_div, (""), ("")) if table_parts and len(table_parts) > 1: table = table_parts[1] @@ -349,7 +386,6 @@ def getLinksForVideo(self, cItem): elif quality and quality not in ["", "Jakość"]: name += " [%s]" % quality retTab.append({"name": name, "url": strwithmeta(player_url, {"Referer": url}), "need_resolve": 1}) - if not retTab: data_links = self.cm.ph.getAllItemsBeetwenMarkers(data, 'link-to-video">', "None") for item in data_links: @@ -359,7 +395,6 @@ def getLinksForVideo(self, cItem): hostname = self.up.getHostName(video_url) short_name = hostname.split('.')[0] if '.' in hostname else hostname retTab.append({"name": short_name.capitalize(), "url": strwithmeta(video_url, {"Referer": gettytul()}), "need_resolve": 1}) - if len(retTab): self.cacheLinks[cacheKey] = retTab return retTab