French DDL Support#360
Conversation
Adds a new search source that queries the Movix API to find French DDL download links (1Fichier, Send) sourced from Darkiworld. Flow: IMDb ID → TMDB title resolution → Movix search → Darkiworld links → decode to real 1Fichier URL → JDownloader via Quasarr. Requires 'mx = movix.cash' entry in Quasarr Hostnames settings.
…r.io Builds the Python wheel from source, packages it into a Docker image, and pushes to ghcr.io/riourik/quasarrfr:latest on every push to main.
- "show" → "tv" (API requiert "movie" ou "tv", pas "show") - TV download endpoint requiert season+episode en params → ajout dans _get_links - feed() skip les séries (impossible sans season/episode) - _build_releases: inclut S01E01 dans le titre pour les séries - _resolve_imdb: retourne "tv" au lieu de "show" - debug log amélioré avec l'erreur API en cas d'échec
- Remplace les espaces par des points dans le titre (safe_title) - Supprime les caractères spéciaux (:, ', (), ) qui cassent le parser - Supprime les crochets autour de l'année et du host - Simplifie lang_tag (pas de crochets, pas d'espaces)
- Banner: Quasarrfr by riourik + URL github.com/riourik/Quasarrfr - Version: 0.0.3 - get_latest_version pointe vers le repo riourik/Quasarrfr
- Fonction sanitize() supprime tous les caractères spéciaux et double-points - quality sans parenthèses (ex: WEB.1080p.x265 au lieu de WEB.1080p.(x265)) - host (1Fichier) inclus dans le titre - Format: Titre.Annee.SxxExx.Qualite.Movix.Host.Langue
Les URLs 1Fichier contenant & cassaient le XML du NZB (Invalid NZB: Unable to parse). Utilisation de sax_utils.quoteattr() pour échapper correctement title, url, password, imdb_id et source_key.
- Version check silencieux si pas de release GitHub (404) - Lien de mise a jour pointe vers riourik/Quasarrfr
La convention scene n'inclut pas l'annee pour les series (seulement films). Sonarr interpretait l'annee comme partie du titre et ne pouvait pas matcher. - Serie: Titre.S09E01.WEB.1080p.Movix.1Fichier.TrueFrench - Film: Titre.2026.WEB.1080p.Movix.1Fichier.TrueFrench
Sans downloads/sources/mx.py, Quasarr ne trouvait pas de handler pour
envoyer le lien 1Fichier a JDownloader ("Could not find matching source").
L'URL 1Fichier etant deja decodee lors de la recherche, on la retourne
directement sans fetch supplementaire.
Blu-Ray -> BluRay, TrueFrench-FRENCHAD -> TrueFrenchFRENCHAD Le tiret dans la qualite etait interprete par Radarr/Sonarr comme separateur de release group (convention scene: BluRay sans tiret).
… 0.1.1 WEB -> WEBDL, HDLight -> HDTV, Blu-Ray -> BluRay, REMUX BLURAY -> BluRay.REMUX Resolution et codec extraits separement (1080p, x265, etc.) Radarr/Sonarr ne reconnaissait pas les noms de qualite bruts de Movix.
_resolve_imdb retourne maintenant le TMDB ID en plus du titre. _best_match utilise le TMDB ID en priorite apres l'IMDb ID, evitant de retourner le mauvais film quand plusieurs resultats ont un titre similaire.
|
@riourik please confirm the newly integrated pages work as expected. I’ll clean the PR up to merge it upstream |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 74930f4731
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| MOVIX_API = "https://api.movix.cash/api" | ||
| TMDB_API = "https://api.themoviedb.org/3" | ||
| TMDB_KEY = "f3d757824f08ea2cff45eb8f47ca3a1e" |
There was a problem hiding this comment.
Remove hard-coded TMDB API key from source module
Embedding a concrete TMDB API key in the repository creates an exposed shared credential that can be abused, rotated, or rate-limited outside your control; once that happens, IMDb→TMDB resolution and trending lookups for this source will start failing in production. This should be sourced from runtime config/secret storage instead of a committed constant.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Quasarr already has an internal get_localized_title() function used by other sources to resolve a title from an IMDb ID. However, the Movix API requires the TMDB ID (not just the title) as a parameter in the download endpoint (tmdbId), to make sure it returns links for the correct film. The built-in IMDb helper doesn't provide that. TMDB is therefore needed specifically for the ID, not just for title resolution.
There was a problem hiding this comment.
#367 should be able to resolve the need for direct TMDB access
| except Exception: | ||
| update_available = None |
There was a problem hiding this comment.
Preserve logging when version checks raise exceptions
This catches all update-check errors and suppresses them without any log entry, so transient GitHub/network failures become invisible and operators cannot tell whether update checks are broken or simply up-to-date. The previous behavior emitted a clear diagnostic and manual-check link; removing that observability makes production troubleshooting significantly harder.
Useful? React with 👍 / 👎.
| @@ -0,0 +1 @@ | |||
| mx = movix.cash | |||
There was a problem hiding this comment.
hostnames are not supposed to be included
There was a problem hiding this comment.
@riourik hostnames are supposed to be dynamic, never hardcoded
if you need help with expanding the code to support mx let me know.
Should be quite straightforward
|
|
||
| message = "!!! UPDATE AVAILABLE !!!" | ||
| link = "https://github.com/rix1337/Quasarr/releases/latest" | ||
| link = "https://github.com/riourik/Quasarrfr/releases/latest" |
There was a problem hiding this comment.
this needs to be reverted for upstreaming
| https://github.com/rix1337/Quasarr | ||
| ---- | ||
| Quasarrfr {version.get_version()} by riourik | ||
| https://github.com/riourik/Quasarrfr |
There was a problem hiding this comment.
this needs to be reverted for upstreaming
|
|
||
| print(f"""┌────────────────────────────────────┐ | ||
| Quasarr {version.get_version()} by RiX | ||
| Quasarr 4.3.7 by RiX |
There was a problem hiding this comment.
this needs to be reverted for upstreaming
| Source Movix/Darkiworld pour Quasarrfr. | ||
|
|
||
| Flow : | ||
| 1. IMDb ID → TMDB → titre français |
There was a problem hiding this comment.
can't you get the french title via the existing IMDB api?
I'm interested in supporting TMDB but this would require each user to setup their own TMDB API key
There was a problem hiding this comment.
Yeah TMDB support will be an issue
I don’t think we can easily support it
| from quasarr.search.sources.helpers.search_release import SearchRelease | ||
| from quasarr.search.sources.helpers.search_source import AbstractSearchSource | ||
|
|
||
| MOVIX_API = "https://api.movix.cash/api" |
| return __version__ | ||
|
|
||
| api_url = "https://api.github.com/repos/rix1337/Quasarr/releases/latest" | ||
| api_url = "https://api.github.com/repos/riourik/Quasarrfr/releases/latest" |
| import sys | ||
|
|
||
| __version__ = "4.3.7" | ||
| __version__ = "0.1.4" |
| password_a = sax_utils.quoteattr(password) | ||
| imdb_a = sax_utils.quoteattr(imdb_id) | ||
| source_a = sax_utils.quoteattr(source_key) | ||
| return f'<nzb><file title={title_a} url={url_a} size_mb="{size_mb}" password={password_a} imdb_id={imdb_a} source_key={source_a}/></nzb>' |
There was a problem hiding this comment.
why is the quoteattr needed?
There was a problem hiding this comment.
quoteattr is needed to escape special characters (quotes, ampersands, etc.) in XML attributes when building the NZB file. Titles and URLs can contain characters that would break the XML otherwise.
There was a problem hiding this comment.
@daddy-cool french release titles contain more special chars. This is valid, it just never happens in the German or English scopes
There was a problem hiding this comment.
alright, however this does should not apply to IMDB_ID, URL, Source-Key or Size since those should never include any quotes to begin with.
If its just for the XML I would be prefer just doing one sax_utils.quoteattr() on the final string before returning it instead of on each field of the string.
…ant le premier résultat que si aucun ID n'est fourni
|
It works overall, but there are still some bugs with identification for certain series and films. I'd prefer to finalize it before going further with the PR. I'm working and have kids so that go slowly when I have free time. |
No worried, I am just very open for an expansion like this. you can also try and maintain a fork but together we are stronger. |
…ynamique dans le message de démarrage
…e Dockerfile fix(.gitignore): ajoute hostnames.txt à ignorer fix(hostnames): supprime le fichier hostnames.txt
|
I think I found a way to get the TMDB Id without accessing TMDB itself, I will try and setup a PR |
|
I got #367 working, it allows to query metadata directly from Radarr which includes IMDB to TMDB resolution. However, it seems to only work for Movies and not Shows as Shows would probably need to be handled by Sonarr, yet Sonarr only provides TVDB based lookups from what I can tell. I will look into this further |
…l'interface utilisateur
…tilisateur et suppression de l'ancienne implémentation
…S du bouton de sauvegarde de la clé TMDB
… warn au lieu de debug dans la source Movix
… des erreurs dans la source Movix
…500/404 - _decode_link: embed_url peut être un dict (hôte Send) → extraire .lien - _decode_link: liens directs http/movix: retournés sans appel decode (fix 404) - _resolve_imdb: retourne l'année (4-tuple) pour le matching - _best_match: 4 niveaux — imdb_id → tmdb_id → nom+année → fallback générique - _best_match: fallback générique uniquement si aucun ID fourni (fix faux positifs) - search(): accès direct tmdb_id si titre absent de l'index Movix - _get: interception 500 silencieuse (debug au lieu de error) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ode dans les liens sans données
I got IMDB->TMDB ID lookups working for movies via Radarr, and for TV Shows IMDB->TMDB ID lookups work via Sonarr! (I added TVDB ID lookups too) @riourik Once #367 is merged you can refactor this PR to drop the TMDB API and use the Radarr/Sonarr based lookups instead :) any source that requires radarr should set requires_radarr=True and for sonarr requires_sonarr=True, so don't forget to add that to the MX search source so that Quasarr prompts users to add the necessary URL and API key for their Radarr/Sonarr instances. |
|
Awesome progress guys! |
This is a desired addition to Quasarr by adding support for at least one popular French hostname in search and download functions.
TODO before merge:
Revert any changes to versioning and project naming structures of the fork.
WIP:
Support search based on tmdb id without requiring the official tmdb api.