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.
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.
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 :
Besoin d'un coup de main ?
Ce bug qui traîne depuis des semaines, ce plugin qui casse votre mise en page, cette fonctionnalité que personne n'arrive à implémenter proprement — c'est exactement ce que je règle au quotidien depuis 20 ans.
Parlons de votre problème →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
- Vérifiez
python3 --version. - Vérifiez
which subliminal. - Lancez
subliminal --version. - Testez avec
subliminal --debug. - Renommez temporairement le fichier vidéo avec un nom standard.
- Mettez à jour Subliminal et ses dépendances.
- Installez Subliminal avec
pipxsi possible. - Appelez le chemin complet de l’exécutable dans cron.
- Ne patchez
subtitle.pyqu’en dernier recours.
Articles connexes
Ces guides complètent bien ce dépannage autour de Subliminal, Synology et des sous-titres :
- NAS Synology : télécharger automatiquement les sous-titres avec Subliminal
- Téléchargez automatiquement les sous-titres de vos vidéos avec FlexGet et Subliminal
- Synology : lire des vidéos avec des fichiers de sous-titres en DLNA sur la Freebox
- NAS Synology : regarder les vidéos du NAS directement sur la Freebox en DLNA
- Introduction à CRON : les tâches automatisées
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
Marre des agences qui sous-traitent ?
Avec moi, vous parlez directement au développeur qui fait le travail. Pas d'intermédiaire, pas de promesses creuses. Juste du code propre et un interlocuteur joignable.
Travaillons directement ensemble →

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.
Je t’en prie Agat’ :)
Oui, de temps en temps
findfait des siennes, cela dépend des OS. J’utilise plus souventlocatesous Ubuntu.Merci pour la rentrée, c’est reparti !
Et toi ?