fix: episodes loading in dropdown
- Fix ZT get_episodes: find episode links by text pattern instead of URL - Episodes now load into #player-container instead of tiny dropdown div - Scroll to player container after episodes load
This commit is contained in:
@@ -135,26 +135,29 @@ class ZoneTelechargementDownloader(BaseSeriesSite):
|
|||||||
soup = BeautifulSoup(html, "lxml")
|
soup = BeautifulSoup(html, "lxml")
|
||||||
|
|
||||||
episodes = []
|
episodes = []
|
||||||
|
seen_urls = set()
|
||||||
|
|
||||||
# ZT typically lists episodes in a table or list of links
|
# ZT lists episodes as <a> tags inside <b> inside div.postinfo
|
||||||
# Links often look like: /telecharger-series/.../saison-X-episode-Y.html
|
# Text matches "Episode X" pattern, URLs go through dl-protect
|
||||||
links = soup.find_all("a", href=re.compile(r"episode-\d+"))
|
for link in soup.find_all("a"):
|
||||||
|
text = link.get_text(strip=True)
|
||||||
|
ep_match = re.search(r"episode\s*(\d+)", text, re.I)
|
||||||
|
if not ep_match:
|
||||||
|
continue
|
||||||
|
|
||||||
for i, link in enumerate(links):
|
|
||||||
href = link.get("href", "")
|
href = link.get("href", "")
|
||||||
if not href.startswith("http"):
|
if not href or href in seen_urls:
|
||||||
href = urljoin(self.base_url, href)
|
continue
|
||||||
|
|
||||||
title = link.get_text(strip=True)
|
|
||||||
ep_match = re.search(r"episode\s*(\d+)", title.lower())
|
|
||||||
ep_number = int(ep_match.group(1)) if ep_match else i + 1
|
|
||||||
|
|
||||||
|
seen_urls.add(href)
|
||||||
|
ep_number = int(ep_match.group(1))
|
||||||
episodes.append(
|
episodes.append(
|
||||||
{"episode_number": ep_number, "url": href, "title": title}
|
{"episode_number": ep_number, "url": href, "title": text}
|
||||||
)
|
)
|
||||||
|
|
||||||
# Sort by episode number
|
# Sort by episode number
|
||||||
episodes.sort(key=lambda x: x["episode_number"])
|
episodes.sort(key=lambda x: x["episode_number"])
|
||||||
|
logger.info(f"Found {len(episodes)} episodes on {anime_url}")
|
||||||
return episodes
|
return episodes
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|||||||
@@ -82,13 +82,12 @@
|
|||||||
<i class="fas fa-layer-group"></i> Saison complete
|
<i class="fas fa-layer-group"></i> Saison complete
|
||||||
</button>
|
</button>
|
||||||
<button class="sr-dropdown-item"
|
<button class="sr-dropdown-item"
|
||||||
hx-get="/api/anime/episodes?url={{ first_url | urlencode }}&lang={{ default_lang }}"
|
hx-get="/api/anime/episodes?url={{ first_url | urlencode }}&lang={{ default_lang }}&html=1"
|
||||||
hx-target="#dl-episodes-{{ loop.index }}"
|
hx-target="#player-container"
|
||||||
hx-swap="innerHTML"
|
hx-swap="innerHTML"
|
||||||
hx-on::after-request="openDropdown = null">
|
hx-on::after-request="openDropdown = null; document.getElementById('player-container').scrollIntoView({behavior: 'smooth'})">
|
||||||
<i class="fas fa-list-ol"></i> Choisir des episodes
|
<i class="fas fa-list-ol"></i> Choisir des episodes
|
||||||
</button>
|
</button>
|
||||||
<div id="dl-episodes-{{ loop.index }}"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="sr-btn sr-btn-follow"
|
<button class="sr-btn sr-btn-follow"
|
||||||
|
|||||||
@@ -61,13 +61,12 @@
|
|||||||
<i class="fas fa-layer-group"></i> Saison complete
|
<i class="fas fa-layer-group"></i> Saison complete
|
||||||
</button>
|
</button>
|
||||||
<button class="sr-dropdown-item"
|
<button class="sr-dropdown-item"
|
||||||
hx-get="/api/anime/episodes?url={{ first_url | urlencode }}&lang={{ default_lang }}"
|
hx-get="/api/anime/episodes?url={{ first_url | urlencode }}&lang={{ default_lang }}&html=1"
|
||||||
hx-target="#dl-episodes-{{ loop.index }}"
|
hx-target="#player-container"
|
||||||
hx-swap="innerHTML"
|
hx-swap="innerHTML"
|
||||||
hx-on::after-request="openDropdown = null">
|
hx-on::after-request="openDropdown = null; document.getElementById('player-container').scrollIntoView({behavior: 'smooth'})">
|
||||||
<i class="fas fa-list-ol"></i> Choisir des episodes
|
<i class="fas fa-list-ol"></i> Choisir des episodes
|
||||||
</button>
|
</button>
|
||||||
<div id="dl-episodes-{{ loop.index }}"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="sr-btn sr-btn-follow"
|
<button class="sr-btn sr-btn-follow"
|
||||||
|
|||||||
Reference in New Issue
Block a user