Skip to content

French DDL Support#360

Draft
rix1337 wants to merge 29 commits into
rix1337:mainfrom
riourik:main
Draft

French DDL Support#360
rix1337 wants to merge 29 commits into
rix1337:mainfrom
riourik:main

Conversation

@rix1337
Copy link
Copy Markdown
Owner

@rix1337 rix1337 commented May 10, 2026

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.

riourik added 18 commits May 7, 2026 18:25
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.
@rix1337
Copy link
Copy Markdown
Owner Author

rix1337 commented May 10, 2026

@riourik please confirm the newly integrated pages work as expected. I’ll clean the PR up to merge it upstream

@rix1337 rix1337 marked this pull request as draft May 10, 2026 15:48
@rix1337 rix1337 added enhancement New feature or request help wanted Extra attention is needed labels May 10, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread quasarr/search/sources/mx.py Outdated

MOVIX_API = "https://api.movix.cash/api"
TMDB_API = "https://api.themoviedb.org/3"
TMDB_KEY = "f3d757824f08ea2cff45eb8f47ca3a1e"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Contributor

@daddy-cool daddy-cool May 25, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#367 should be able to resolve the need for direct TMDB access

Comment thread quasarr/__init__.py
Comment on lines +313 to 314
except Exception:
update_available = None
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

Comment thread hostnames.txt Outdated
@@ -0,0 +1 @@
mx = movix.cash
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

hostnames are not supposed to be included

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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

Comment thread quasarr/__init__.py Outdated

message = "!!! UPDATE AVAILABLE !!!"
link = "https://github.com/rix1337/Quasarr/releases/latest"
link = "https://github.com/riourik/Quasarrfr/releases/latest"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs to be reverted for upstreaming

Comment thread quasarr/__init__.py Outdated
https://github.com/rix1337/Quasarr
----
Quasarrfr {version.get_version()} by riourik
https://github.com/riourik/Quasarrfr
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs to be reverted for upstreaming

Comment thread quasarr/__init__.py Outdated

print(f"""┌────────────────────────────────────┐
Quasarr {version.get_version()} by RiX
Quasarr 4.3.7 by RiX
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this needs to be reverted for upstreaming

Source Movix/Darkiworld pour Quasarrfr.

Flow :
1. IMDb ID → TMDB → titre français
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no hostnames

Comment thread quasarr/providers/version.py Outdated
return __version__

api_url = "https://api.github.com/repos/rix1337/Quasarr/releases/latest"
api_url = "https://api.github.com/repos/riourik/Quasarrfr/releases/latest"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

revert

Comment thread quasarr/providers/version.py Outdated
import sys

__version__ = "4.3.7"
__version__ = "0.1.4"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

revert

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>'
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is the quoteattr needed?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@daddy-cool french release titles contain more special chars. This is valid, it just never happens in the German or English scopes

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
@riourik
Copy link
Copy Markdown

riourik commented May 18, 2026

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.

@rix1337
Copy link
Copy Markdown
Owner Author

rix1337 commented May 18, 2026

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.

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.

riourik added 3 commits May 18, 2026 07:24
…e Dockerfile

fix(.gitignore): ajoute hostnames.txt à ignorer
fix(hostnames): supprime le fichier hostnames.txt
@daddy-cool
Copy link
Copy Markdown
Contributor

daddy-cool commented May 20, 2026

I think I found a way to get the TMDB Id without accessing TMDB itself, I will try and setup a PR

@daddy-cool
Copy link
Copy Markdown
Contributor

daddy-cool commented May 20, 2026

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

riourik and others added 7 commits May 23, 2026 12:31
…tilisateur et suppression de l'ancienne implémentation
…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>
@daddy-cool
Copy link
Copy Markdown
Contributor

daddy-cool commented May 25, 2026

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

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.

@rix1337
Copy link
Copy Markdown
Owner Author

rix1337 commented May 25, 2026

Awesome progress guys!

@daddy-cool
Copy link
Copy Markdown
Contributor

@riourik #367 is merged!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request help wanted Extra attention is needed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants