Choix de la langue VF/VOSTFR sur la fiche titre

- Episode : nouveau champ version (vf/vostfr)
- French-Manga : épisodes listés pour chaque langue disponible
  (VOSTFR puis VF) au lieu d'un choix automatique, fragment
  #ep=<version>-<num> déjà résolu par extract_embed_links
- Vostfree : langue déduite du titre h1 ou du slug de la fiche
- UI : filtre VOSTFR/VF/Tout (défaut VOSTFR), badge par épisode,
  téléchargement de saison limité à la langue filtrée, compteur
  d'épisodes unique, version incluse dans le nom de fichier
This commit is contained in:
Roman
2026-09-22 11:58:10 +00:00
parent 9148b5fb6a
commit affc97c527
5 changed files with 92 additions and 23 deletions
+15 -16
View File
@@ -259,29 +259,28 @@ class FrenchMangaScraper(SourceScraper):
if season_match:
season = int(season_match.group(1))
numbers: set[float] = set()
info = data.get("info") or {}
episodes: list[Episode] = []
for version in versions:
numbers: set[float] = set()
for number_text in data.get(version) or {}:
try:
numbers.add(float(number_text))
except ValueError:
logger.warning("french_manga : numéro d'épisode invalide %r", number_text)
info = data.get("info") or {}
episodes: list[Episode] = []
for number in sorted(numbers):
number_text = str(int(number)) if number.is_integer() else str(number)
episode_info = info.get(number_text) or info.get(str(int(number)))
label = episode_info.get("title") if isinstance(episode_info, dict) else None
version = next((v for v in versions if number_text in (data.get(v) or {})), versions[0])
episodes.append(
Episode(
number=number,
title=label,
url=f"{page_url}#{config['episodes']['fragment_prefix']}={version}-{number_text}",
season=season,
for number in sorted(numbers):
number_text = str(int(number)) if number.is_integer() else str(number)
episode_info = info.get(number_text) or info.get(str(int(number)))
label = episode_info.get("title") if isinstance(episode_info, dict) else None
episodes.append(
Episode(
number=number,
title=label,
url=f"{page_url}#{config['episodes']['fragment_prefix']}={version}-{number_text}",
season=season,
version=version,
)
)
)
if not episodes:
raise ScrapeError(f"french_manga : aucun épisode trouvé pour {source_id}")
return episodes