Subliminal : corriger “list object has no attribute lower”

Si Subliminal plante avec l’erreur AttributeError: 'list' object has no attribute 'lower', le problème vient généralement d’une valeur que Python traite comme une liste alors que le code attend une chaîne de caractères.

En clair : le code essaie d’appliquer .lower() à une liste. Or .lower() sert à convertir une chaîne en minuscules. Une liste, elle, n’a pas cette méthode. Python ne négocie pas. Il plante.

À l’époque, la solution consistait à modifier directement le fichier subtitle.py dans les sources de Subliminal. Aujourd’hui, ce n’est plus la meilleure approche. Avant de patcher un paquet Python à la main, il faut vérifier la version installée, mettre à jour proprement, puis isoler l’environnement.

Distingo, le livret à 2%

Comprendre l’erreur

Le message ressemble à ceci :

AttributeError: 'list' object has no attribute 'lower'Code language: JavaScript (javascript)

Dans les anciennes versions de Subliminal, l’erreur pouvait apparaître lors du calcul des correspondances entre les informations détectées dans le fichier vidéo et celles du sous-titre.

Le cas classique concernait une ligne de ce type :

if video.format and 'format' in guess and guess['format'].lower() == video.format.lower():
    matches.add('format')Code language: JavaScript (javascript)

Le code suppose ici que guess['format'] contient une chaîne. Mais certaines versions de dépendances peuvent retourner une liste. Exemple :

['HDTV', 'x264']Code language: JSON / JSON with Comments (json)

Dans ce cas, Python ne peut pas exécuter :

guess['format'].lower()Code language: CSS (css)

Il faut donc soit mettre à jour Subliminal et ses dépendances, soit adapter le code pour gérer les deux cas : chaîne simple ou liste.

Commencer par vérifier votre version de Python

Avant de corriger quoi que ce soit, vérifiez la version de Python utilisée par votre commande subliminal :

python --version
python3 --version

Vérifiez aussi quel exécutable Subliminal est lancé :

which subliminal
subliminal --version

Sur un NAS Synology ou un vieux serveur, vous pouvez parfois avoir plusieurs installations en parallèle : une version système, une version installée avec pip, une version dans un environnement virtuel, et parfois une version fournie par un paquet tiers.

Quand vous cherchez à corriger l’erreur, vous devez patcher ou mettre à jour la version réellement utilisée. Sinon, vous réparez un cadavre pendant que le vrai programme continue de planter ailleurs. Ambiance.

Distingo, le livret à 2%

Solution recommandée : réinstaller Subliminal proprement avec pipx

La méthode la plus propre consiste à installer Subliminal dans un environnement isolé avec pipx. Cela évite de polluer le Python système, ce qui est particulièrement important sur un serveur ou un NAS.

Sur Debian ou Ubuntu :

sudo apt update
sudo apt install pipx

pipx ensurepath

Fermez puis rouvrez votre session shell, ou rechargez votre profil :

source ~/.profile

Installez ensuite Subliminal :

pipx install subliminal

Vérifiez l’installation :

subliminal --version
subliminal --help

Relancez ensuite votre commande de téléchargement de sous-titres.

subliminal download -l en /chemin/vers/video.mkv

Si vous aviez une tâche cron, pensez à mettre à jour le chemin de l’exécutable. Avec pipx, il se trouve souvent dans :

~/.local/bin/subliminalCode language: JavaScript (javascript)

Mettre à jour une installation pip existante

Si vous utilisez déjà pip ou pip3, commencez par identifier l’installation active :

python3 -m pip show subliminal
python3 -m pip show guessit
python3 -m pip show babelfish

Mettez ensuite Subliminal et ses dépendances à jour :

python3 -m pip install --user --upgrade subliminal guessit babelfish

Si votre système refuse les installations globales, n’insistez pas avec sudo pip. Utilisez plutôt pipx ou un environnement virtuel. Modifier le Python système à coups de sudo pip, c’est le genre de raccourci qui finit en soirée logs.

Alternative : utiliser un environnement virtuel Python

Sur un serveur, vous pouvez aussi créer un environnement virtuel dédié à Subliminal :

python3 -m venv ~/venvs/subliminal
source ~/venvs/subliminal/bin/activate

python -m pip install --upgrade pip
python -m pip install subliminalCode language: JavaScript (javascript)

Vérifiez ensuite la commande :

~/venvs/subliminal/bin/subliminal --version
~/venvs/subliminal/bin/subliminal download -l en /chemin/vers/video.mkvCode language: JavaScript (javascript)

Dans une tâche cron, appelez l’exécutable complet :

/home/votre-utilisateur/venvs/subliminal/bin/subliminal download -l en /chemin/vers/video.mkv

C’est plus verbeux, mais plus fiable. Cron n’a pas toujours le même PATH que votre session interactive.

Activer le mode debug

Si l’erreur continue, lancez Subliminal en mode debug pour obtenir une trace plus utile :

subliminal --debug download -l en /chemin/vers/video.mkv

Le mode debug permet de voir quelle vidéo est analysée, quels fournisseurs sont interrogés, et à quel moment l’erreur se produit.

Si le bug apparaît uniquement sur un fichier précis, testez avec un autre fichier vidéo. Vous pourrez ainsi distinguer un vrai bug de dépendance d’un souci de nommage ou de métadonnées sur une vidéo particulière.

Vérifier le nom du fichier vidéo

Subliminal s’appuie sur les informations extraites du nom du fichier. Si le nom est trop exotique, les dépendances chargées de l’analyse peuvent renvoyer des données inattendues.

Un nom propre ressemble plutôt à ceci :

Serie.S01E03.1080p.WEB-DL.x264.mkvCode language: CSS (css)

Un nom plus risqué ressemble plutôt à ceci :

Mon fichier video final version ok vraiment final [copie] !!!.mkvCode language: CSS (css)

Avant de patcher du Python, renommez donc temporairement le fichier avec un nom plus standard, puis relancez Subliminal. C’est bête, mais souvent efficace.

Cas Synology : attention aux anciennes installations

Sur un NAS Synology, l’erreur apparaît souvent sur une installation ancienne, parfois en Python 2.7, avec plusieurs copies de Subliminal réparties dans le système.

Vous pouvez chercher les installations existantes avec :

find / -type f -name "subtitle.py" 2>/dev/null
find / -type f -name "subliminal" 2>/dev/nullCode language: JavaScript (javascript)

Exemples de chemins possibles sur d’anciennes installations :

/usr/lib/python2.7/site-packages/subliminal/subtitle.py
/volume1/@appstore/subliminal/env/lib/python2.7/site-packages/subliminal/subtitle.py

Mais ne modifiez pas un fichier au hasard. Vérifiez d’abord quelle commande est réellement utilisée :

which subliminal
head -n 1 "$(which subliminal)"Code language: JavaScript (javascript)

La première ligne du script indique souvent l’interpréteur Python appelé. Cela vous évite de corriger une installation morte.

Dernier recours : patcher subtitle.py à la main

Si vous ne pouvez pas mettre à jour Subliminal, et seulement dans ce cas, vous pouvez appliquer une rustine manuelle. C’est utile sur un vieux NAS Synology bloqué sur une version ancienne.

Commencez par sauvegarder le fichier :

cp /usr/lib/python2.7/site-packages/subliminal/subtitle.py \
   /usr/lib/python2.7/site-packages/subliminal/subtitle.py.bak

Adaptez évidemment le chemin si votre fichier se trouve ailleurs.

Ouvrez le fichier :

nano /usr/lib/python2.7/site-packages/subliminal/subtitle.py

Cherchez la section qui compare le format détecté. Sur les anciennes versions, vous pouviez trouver une ligne proche de celle-ci :

if video.format and 'format' in guess and guess['format'].lower() == video.format.lower():
    matches.add('format')Code language: JavaScript (javascript)

Remplacez-la par une version qui accepte une chaîne ou une liste :

if video.format and 'format' in guess:
    guess_format = guess['format'] if isinstance(guess['format'], list) else [guess['format']]

    if any(item.lower() == video.format.lower() for item in guess_format):
        matches.add('format')Code language: PHP (php)

Attention à l’indentation. Python y tient beaucoup. Un espace de travers, et vous aurez remplacé une erreur par une autre. Beau progrès, mais pas celui qu’on veut.

Relancez ensuite Subliminal :

subliminal --debug download -l en /chemin/vers/video.mkv

Version plus défensive du patch

Si votre ancienne installation retourne parfois des valeurs non textuelles, vous pouvez utiliser une version un peu plus défensive :

if video.format and 'format' in guess:
    guess_format = guess['format']

    if not isinstance(guess_format, list):
        guess_format = [guess_format]

    if any(str(item).lower() == video.format.lower() for item in guess_format):
        matches.add('format')Code language: PHP (php)

Cette variante convertit chaque élément en chaîne avant d’appeler .lower(). Elle reste une rustine, pas une stratégie de maintenance.

Pourquoi il vaut mieux éviter de modifier site-packages

Modifier directement un fichier dans site-packages pose trois problèmes.

  • La modification disparaît lors d’une mise à jour du paquet.
  • Vous ne savez plus facilement ce qui vient du projet officiel et ce qui vient de votre rustine.
  • Le correctif reste local, donc impossible à reproduire proprement sur une autre machine.

Si vous devez vraiment patcher, documentez le changement dans un fichier texte à côté de votre script, ou mieux, gardez une copie du diff.

diff -u subtitle.py.bak subtitle.py > subliminal-lower-list.patchCode language: CSS (css)

Vous pourrez ainsi réappliquer ou comprendre le correctif plus tard.

Exemple de commande propre pour télécharger des sous-titres

Pour télécharger des sous-titres anglais pour une vidéo :

subliminal download -l en /volume1/video/Serie.S01E03.1080p.WEB-DL.x264.mkv

Pour demander du français :

subliminal download -l fr /volume1/video/Film.2024.1080p.WEB-DL.mkv

Pour scanner récursivement un dossier complet, testez d’abord sur un petit répertoire. Ensuite seulement, branchez la commande à une tâche cron.

Checklist de correction

  1. Vérifiez python3 --version.
  2. Vérifiez which subliminal.
  3. Lancez subliminal --version.
  4. Testez avec subliminal --debug.
  5. Renommez temporairement le fichier vidéo avec un nom standard.
  6. Mettez à jour Subliminal et ses dépendances.
  7. Installez Subliminal avec pipx si possible.
  8. Appelez le chemin complet de l’exécutable dans cron.
  9. Ne patchez subtitle.py qu’en dernier recours.

Articles connexes

Ces guides complètent bien ce dépannage autour de Subliminal, Synology et des sous-titres :

FAQ

Que signifie “list object has no attribute lower” ?

Cette erreur signifie que Python essaie d’appeler la méthode .lower() sur une liste. Or cette méthode existe pour les chaînes de caractères, pas pour les listes.

Faut-il modifier directement subtitle.py ?

Non, pas en premier. Mettez d’abord Subliminal à jour, puis installez-le proprement avec pipx ou dans un environnement virtuel. Le patch manuel doit rester un dernier recours.

Pourquoi l’erreur arrive surtout sur les vieux NAS Synology ?

Parce que beaucoup d’anciennes installations Synology utilisent de vieux paquets Python, parfois en Python 2.7, avec des dépendances figées. Subliminal peut alors recevoir des données dans un format inattendu.

Comment savoir quelle version de Subliminal est utilisée ?

Utilisez which subliminal, puis subliminal --version. Si vous utilisez cron, indiquez le chemin complet de l’exécutable pour éviter les surprises liées au PATH.

Le mode debug peut-il aider ?

Oui. Lancez subliminal --debug download -l en fichier.mkv. Vous verrez plus précisément à quel moment Subliminal plante et sur quel fichier ou fournisseur.

Sources

Demandez à l'IA son opinion
Gravatar for Matt Biscay

Je suis Matt Biscay, développeur WordPress & WooCommerce certifié chez Codeable, administrateur système et enseignant.

J’aide les entreprises à créer, optimiser et fiabiliser leurs sites WordPress avec une approche technique propre : performance, sécurité, maintenance, développement sur mesure et résolution de problèmes complexes.

Sur Skyminds, je partage des tutoriels WordPress, WooCommerce, Linux et administration système, avec des solutions testées sur des cas réels et pensées pour durer.

Découvrez mes services WordPress et WooCommerce.

2 pensées sur “Subliminal : corriger “list object has no attribute lower””

  1. Nickel cette astuce. Ca a résolu mon problème, même sous Ubuntu 18.04.
    Par contre, j’ai utilisé locate car find me remontait des trucs bizarres et le fichier en question se trouvait dans /usr/local/lib

    Merci beaucoup Matt.
    Et bonne rentrée.

    Reply
    • Je t’en prie Agat’ :)

      Oui, de temps en temps find fait des siennes, cela dépend des OS. J’utilise plus souvent locate sous Ubuntu.

      Merci pour la rentrée, c’est reparti !

      Et toi ?

      Reply

Opinions