Ajouter un nouveau site WordPress dans un répertoire, sans conflit avec le site principal photo

Nginx : créer un nouveau site WordPress dans un sous-répertoire, sans conflit avec le site principal

Dernièrement, j’ai développé un nouveau site WordPress pour une cliente dont l’hébergement ne prévoit pas de staging site, ce qui est un peu ballot.

Plutôt que d’utiliser son hébergeur, je me suis dit que j’allais travailler sur la nouvelle version depuis un répertoire sous SkyMinds.

Le problème s’est assez rapidement posé : les diverses règles de configuration de SkyMinds (à la racine du domaine) entrent en conflit avec le nouveau site qui se trouve dans un répertoire. Il est donc nécessaire d’ajuster la configuration du bloc serveur NginX.

J’ai bien sûr effectué quelques recherches sur le net et après moults tests, il s’avère que la plupart des configurations nginx que l’on y trouve sont erronées. En relisant les docs, j’ai fini par trouver une solution satisfaisante.

Des erreurs 404, 403 ou 500

Je mentionnais à l’instant les configurations erronées – elles ne permettent pas au nouveau site d’afficher les pages correctement : erreur 404 pour les pages, erreur 404 pour la partie administration ou alors erreur 403 ou même 500…

Le plus surprenant est que l’on retrouve quasiment ces mêmes configurations dans tous les tutoriels. Cela fonctionnait peut-être à une époque mais plus maintenant avec les dernières versions de WordPress et NginX.

La configuration qui fonctionne

Voici donc la configuration que j’ai concoctée et qui permet d’avoir un autre site WordPress (comme par exemple https://example.com/nouveau-site/) lorsqu’un site WordPress (de type https://example.com) existe déjà à la racine du domaine. Le but est donc d’avoir deux sites fonctionnels qui n’entrent pas en conflit au niveau de la gestion des règles.

On édite le server block de notre domaine :

nano /etc/nginx/sites-available/example.com

Dans la partie server de la configuration, on ajoute :


# Script name : Add new WP site in subfolder
# Author : Matt Biscay
# Author URI : https://www.skyminds.net/?p=29604

# Add new location point with rewrite rule
location @nouveausite{
rewrite . /nouveau-site/index.php last;
}

# Add subfolder config
location  /nouveau-site {
         root /home/example/public_html/nouveau-site;
         index index.php;
         try_files $uri $uri/ @nouveausite;
}Langage du code : PHP (php)

Sauvegardez le fichier. On teste la nouvelle configuration:

nginx -t

et on relance nginx et PHP:

service nginx restart 
service php7.2-fpm restartLangage du code : CSS (css)

Et voilà, le nouveau site dans son répertoire devrait maintenant être fonctionnel, sans conflit avec le site principal.

La Casa de Papel saison 2 photo

La Casa de Papel saison 2

La seconde saison de La Casa de Papel est disponible sur Netflix !

La saison 2 de La Casa de Papel démarre exactement là où s’était achevée la saison 1. Nos braqueurs préférés se trouvent donc toujours dans la fabrique de papier, aidés par le Professeur de l’extérieur.

Pour ne pas spoiler l’histoire, les paragraphes suivants sont cachés. Il suffit de les survoler avec votre souris pour les lire.

Nous retrouvons donc le Professeur, traumatisé par la découverte par la police de la demeure où les braqueurs avaient minutieusement préparé tout leur plan.

 

La situation s’annonce dramatique d’autant qu’avant de quitter la maison, toute l’équipe a laissé bien en évidence de nombreux déchets qui contiennent des traces ADN. Tout est là pour que la police remonte facilement la trace jusqu’aux noms de tous les braqueurs.

L’inspecteur Raquel Murillo parviendra-t-elle à percer le mystère de cette bande armée?

Neuf épisodes sont prévus dans cette seconde saison, qui se trouve être très bien ficelée, avec un rythme beaucoup plus soutenu que la saison précédente.

Hautement recommandée ! A regarder comme des braqueurs de banque.

Subliminal : résoudre l'erreur "AttributeError: list object has no attribute lower" photo

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.

Comprendre l’erreur

Le message ressemble à ceci :

AttributeError: 'list' object has no attribute 'lower'Langage du code : 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')Langage du code : 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']Langage du code : JSON / JSON avec commentaires (json)

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

guess['format'].lower()Langage du code : 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 :

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/subliminalLangage du code : 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 subliminalLangage du code : JavaScript (javascript)

Vérifiez ensuite la commande :

~/venvs/subliminal/bin/subliminal --version
~/venvs/subliminal/bin/subliminal download -l en /chemin/vers/video.mkvLangage du code : 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.mkvLangage du code : CSS (css)

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

Mon fichier video final version ok vraiment final [copie] !!!.mkvLangage du code : 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/nullLangage du code : 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)"Langage du code : 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')Langage du code : 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')Langage du code : 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')Langage du code : 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.patchLangage du code : 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