Compare commits
2 Commits
master
...
a767c8c35a
Author | SHA1 | Date | |
---|---|---|---|
a767c8c35a | |||
7fd2a00938 |
@ -16,8 +16,9 @@ jobs:
|
||||
- name: 🔍 Sélectionner les projets à publier
|
||||
id: detect
|
||||
env:
|
||||
DEVPI_URL: ${{ vars.DEVPI_URL }}
|
||||
DEVPI_USERNAME: ${{ secrets.DEVPI_USERNAME }}
|
||||
REGISTRY_URL: ${{ vars.REGISTRY_URL }}
|
||||
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
|
||||
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
run: |
|
||||
set +e # Ne pas interrompre le script en cas d'erreur
|
||||
git fetch origin master --depth=2 || true
|
||||
@ -50,8 +51,8 @@ jobs:
|
||||
fi
|
||||
done
|
||||
|
||||
API_URL="https://$DEVPI_URL/$DEVPI_USERNAME/dev/$NAME/$VERSION"
|
||||
STATUS_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" "$API_URL")
|
||||
API_URL="https://$REGISTRY_USERNAME:$REGISTRY_PASSWORD@$REGISTRY_URL/api/v1/packages/$REGISTRY_USERNAME/pypi/$NAME/$VERSION"
|
||||
STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$API_URL")
|
||||
|
||||
if [ "$STATUS_CODE" = "404" ]; then
|
||||
echo "📦 $NAME version $VERSION n'existe pas (HTTP $STATUS_CODE)"
|
||||
@ -72,18 +73,18 @@ jobs:
|
||||
- name: 🚀 Publier les projets sélectionnés
|
||||
if: steps.detect.outputs.selected_projects != ''
|
||||
env:
|
||||
DEVPI_URL: ${{ vars.DEVPI_URL }}
|
||||
DEVPI_USERNAME: ${{ secrets.DEVPI_USERNAME }}
|
||||
DEVPI_PASSWORD: ${{ secrets.DEVPI_PASSWORD }}
|
||||
REGISTRY_URL: ${{ vars.REGISTRY_URL }}
|
||||
REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }}
|
||||
REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }}
|
||||
run: |
|
||||
for dir in ${{ steps.detect.outputs.selected_projects }}; do
|
||||
echo "🚀 Publication de $dir"
|
||||
cd "$dir"
|
||||
python3 setup.py sdist
|
||||
twine upload \
|
||||
--repository-url https://$DEVPI_URL/$DEVPI_USERNAME/dev \
|
||||
-u "$DEVPI_USERNAME" \
|
||||
-p "$DEVPI_PASSWORD" \
|
||||
--repository-url https://$REGISTRY_URL/api/packages/$REGISTRY_USERNAME/pypi \
|
||||
-u "$REGISTRY_USERNAME" \
|
||||
-p "$REGISTRY_PASSWORD" \
|
||||
dist/* || exit 1
|
||||
cd -
|
||||
done
|
||||
|
10
README.md
10
README.md
@ -2,8 +2,6 @@
|
||||
|
||||
Ce dépôt contient plusieurs projets Python que vous pouvez installer et utiliser avec `pipx`.
|
||||
|
||||
Dépôt PyPi → [🔗 devpi.netdldata.net](https://devpi.netdldata.net/lionel/dev)
|
||||
|
||||
## Installation de pipx
|
||||
|
||||
Si `pipx` n'est pas installé, vous pouvez l'installer en utilisant les commandes suivantes selon votre distribution :
|
||||
@ -37,7 +35,7 @@ pipx ensurepath
|
||||
Un outil pour encoder des vidéos de manière récursive en utilisant HandBrake. Il permet de traiter des fichiers vidéo dans un répertoire donné, en utilisant des presets définis pour le transcodage. Il génère également un résumé des opérations effectuées dans un fichier Excel.
|
||||
|
||||
```bash
|
||||
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple HandBrake-recursive
|
||||
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" HandBrake-recursive
|
||||
```
|
||||
|
||||
### proxmox_export_disk
|
||||
@ -45,7 +43,7 @@ pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple HandBrak
|
||||
Un script pour exporter des informations sur les disques depuis Proxmox. Il récupère les détails des disques des machines virtuelles et des conteneurs sur un serveur Proxmox, et exporte ces informations dans un fichier Excel ou ODS.
|
||||
|
||||
```bash
|
||||
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple proxmox-export-disk
|
||||
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" proxmox-export-disk
|
||||
```
|
||||
|
||||
### tree_stream
|
||||
@ -53,7 +51,7 @@ pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple proxmox-
|
||||
Un utilitaire pour afficher la structure des répertoires sous forme de flux. Il permet de visualiser l'arborescence des fichiers et des dossiers avec des informations supplémentaires sur les fichiers vidéo, comme les flux et les chapitres.
|
||||
|
||||
```bash
|
||||
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple tree-stream
|
||||
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" tree-stream
|
||||
```
|
||||
|
||||
### multiplex
|
||||
@ -62,5 +60,5 @@ Un script Python pour assembler des pistes vidéo, audio et sous-titres issues d
|
||||
Il gère la priorité des pistes françaises, la définition des pistes par défaut, la gestion des chapitres et le renommage intelligent des pistes.
|
||||
|
||||
```bash
|
||||
pipx install --index-url https://devpi.netdldata.net/lionel/dev/+simple multiplex
|
||||
pipx install --pip-args="--extra-index-url https://git.netdldata.net/api/packages/lionel/pypi/simple/" multiplex
|
||||
```
|
||||
|
@ -51,7 +51,7 @@ def find_episode_file(source_dir, saison, episode):
|
||||
:param episode: Numéro de l'épisode
|
||||
:return: Chemin du fichier trouvé ou None
|
||||
"""
|
||||
pattern = re.compile(rf"s{int(saison):02d}\s*[ex]{int(episode):02d}", re.IGNORECASE)
|
||||
pattern = re.compile(rf"s{int(saison):02d}[ex]{int(episode):02d}", re.IGNORECASE)
|
||||
p = Path(source_dir)
|
||||
# On récupère tous les fichiers mkv ou mp4 en une seule liste
|
||||
files = list(p.glob("*.mkv")) + list(p.glob("*.mp4"))
|
||||
@ -73,7 +73,15 @@ def find_first_video_track_index(mkv_file):
|
||||
return idx
|
||||
return None
|
||||
|
||||
def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir, chapitre):
|
||||
def has_named_chapters(chapters):
|
||||
"""
|
||||
Détermine si une liste de chapitres contient des noms réels (autres que des génériques).
|
||||
"""
|
||||
import re
|
||||
pattern = re.compile(r'(?i)^\s*(chapter|chapitre)\s*\d+\s*$')
|
||||
return any(not pattern.match(c.name or '') for c in chapters)
|
||||
|
||||
def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir):
|
||||
"""
|
||||
Traite un épisode en combinant les pistes vidéo et audio/sous-titres de deux sources.
|
||||
|
||||
@ -83,7 +91,6 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
|
||||
:param saison: Numéro de saison
|
||||
:param serie_name: Nom de la série
|
||||
:param dest_dir: Répertoire de sortie
|
||||
:param chapitre: Indique quels chapitres inclure dans le fichier final
|
||||
:return: None
|
||||
"""
|
||||
# Affiche une ligne bleue pour la lisibilité dans le terminal
|
||||
@ -161,14 +168,27 @@ def process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, des
|
||||
final_mkv.add_track(track)
|
||||
|
||||
# Traitement des chapitres
|
||||
if chapitre in ('v', 'video'):
|
||||
try:
|
||||
chapters_1 = (source_1_mkv._info_json.get('chapters'))[0].get('num_entries')
|
||||
except (AttributeError, IndexError):
|
||||
chapters_1 = 0
|
||||
try:
|
||||
chapters_2 = (source_2_mkv._info_json.get('chapters'))[0].get('num_entries')
|
||||
except (AttributeError, IndexError):
|
||||
chapters_2 = 0
|
||||
|
||||
valid_1 = chapters_1 >= 4
|
||||
valid_2 = chapters_2 >= 4
|
||||
|
||||
if valid_1 and len(chapters_1) >= len(chapters_2):
|
||||
source_2_mkv.no_chapters()
|
||||
elif chapitre in ('a', 'audio'):
|
||||
elif valid_2:
|
||||
source_1_mkv.no_chapters()
|
||||
else:
|
||||
source_1_mkv.no_chapters()
|
||||
source_2_mkv.no_chapters()
|
||||
|
||||
|
||||
# Éffacer tous les tags
|
||||
source_1_mkv.no_global_tags()
|
||||
source_2_mkv.no_global_tags()
|
||||
@ -207,7 +227,6 @@ def main():
|
||||
parser.add_argument("-n", "--nom", required=True, help="Nom de la série")
|
||||
parser.add_argument("-s", "--saison", required=True, help="Numéro de la saison")
|
||||
parser.add_argument("-d", "--dest", required=True, help="Répertoire de sortie")
|
||||
parser.add_argument("-c", "--chapitre", choices=['n', 'non', 'v', 'video', 'a', 'audio'], default='a', help="Gestion des chapitres : 'n'/'non' pour aucun, 'v'/'video' pour source vidéo, 'a'/'audio' pour source audio (par défaut 'a')")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
@ -224,10 +243,9 @@ def main():
|
||||
|
||||
serie_name = args.nom
|
||||
saison = args.saison
|
||||
chapitre = args.chapitre
|
||||
|
||||
# Chemin de sortie
|
||||
dest_dir = f"{args.dest}/{serie_name}/Saison {saison}"
|
||||
dest_dir = args.dest
|
||||
Path(dest_dir).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Compte le nombre de fichiers dans chaque répertoire source
|
||||
@ -236,7 +254,7 @@ def main():
|
||||
|
||||
for i in range(1, max(count1, count2) + 1):
|
||||
episode = f"{i:02}"
|
||||
process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir, chapitre)
|
||||
process_episode(episode, source_dir_1, source_dir_2, saison, serie_name, dest_dir)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
|
@ -2,7 +2,7 @@ from setuptools import setup
|
||||
|
||||
setup(
|
||||
name='multiplex',
|
||||
version='0.1.2',
|
||||
version='0.1.1',
|
||||
description='Un script pour multiplexer les fichiers vidéo avec mkvmerge.',
|
||||
py_modules=['multiplex'],
|
||||
install_requires=[
|
||||
|
Reference in New Issue
Block a user