-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathnascode
More file actions
258 lines (214 loc) · 10.8 KB
/
Copy pathnascode
File metadata and controls
258 lines (214 loc) · 10.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#!/bin/bash
###########################################################
# NAScode — Transcodage vidéo intelligent pour NAS
# Version modulaire - Point d'entrée principal
###########################################################
#
# Convertit des bibliothèques vidéo en AV1 (SVT-AV1) ou HEVC (x265) selon le
# mode choisi (film / serie / adaptatif / gaming / adaptatif-vmaf), avec
# décision de codec audio "smart", VMAF optionnel et transferts asynchrones.
#
# Architecture : ~45 modules sourcés depuis lib/ dans l'ordre de leurs
# dépendances (voir la section "CHARGEMENT DES MODULES" ci-dessous, chaque
# `source` est annoté de ses dépendances et effets de bord éventuels).
#
###########################################################
set -euo pipefail
# Restreindre les permissions des fichiers temporaires créés par le processus.
# Sans umask restrictif, les logs FFmpeg (chemins de fichiers) sont lisibles
# par tous les utilisateurs du système.
umask 0077
###########################################################
# DÉTERMINATION DU RÉPERTOIRE DU SCRIPT
###########################################################
# Le SCRIPT_DIR est le répertoire contenant ce script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="$SCRIPT_DIR/lib"
###########################################################
# CHARGEMENT DES MODULES
###########################################################
# Vérifier que le répertoire lib existe
if [[ ! -d "$LIB_DIR" ]]; then
echo "ERROR / ERREUR : lib directory not found / Répertoire lib introuvable : $LIB_DIR"
echo "Make sure all modules are present in lib/ / Assurez-vous que tous les modules sont présents dans lib/"
exit 1
fi
# Auto-charger un fichier d'environnement local (optionnel) AVANT l'i18n.
# Remarque: implémentation dans lib/env.sh (sans `source` du .env).
# Ordre important : un NASCODE_LANG défini dans .env.local doit être visible
# quand i18n.sh charge la locale (il lit NASCODE_LANG à son sourcing). env.sh
# n'émet aucun message traduit, le placer avant i18n est donc sans risque.
if [[ -f "$LIB_DIR/env.sh" ]]; then
# shellcheck disable=SC1090
source "$LIB_DIR/env.sh"
if declare -f _nascode_autoload_env >/dev/null 2>&1; then
_nascode_autoload_env "$SCRIPT_DIR"
fi
fi
# Charger l'internationalisation (avant tout message utilisateur).
# Note: i18n.sh charge automatiquement la locale selon NASCODE_LANG ou --lang
source "$LIB_DIR/i18n.sh"
# Charger les modules dans l'ordre des dépendances
source "$LIB_DIR/constants.sh" # Constantes globales (pas de dépendances, overridables)
source "$LIB_DIR/ui.sh" # Codes couleurs (pas de dépendances)
source "$LIB_DIR/ui_options.sh" # Formatage options UI (dépend de ui.sh)
source "$LIB_DIR/detect.sh" # Détection outils/système (dépend de rien, modifie PATH)
source "$LIB_DIR/config.sh" # Configuration (dépend de colors pour erreurs)
source "$LIB_DIR/codec_profiles.sh" # Profils codecs (dépend de config pour VIDEO_CODEC)
source "$LIB_DIR/svtav1_essential.sh" # SVT-AV1-Essential détection (Phase B, scaffolding)
source "$LIB_DIR/segmenter.sh" # Segmentation/concat propres (Phase C)
source "$LIB_DIR/utils.sh" # Utilitaires (dépend de detect pour HAS_*)
source "$LIB_DIR/logging.sh" # Logs (dépend de config pour EXECUTION_TIMESTAMP)
source "$LIB_DIR/notify.sh" # Notifications externes (Discord, etc.) — best-effort
source "$LIB_DIR/progress.sh" # Slots progression (dépend de config pour EXECUTION_TIMESTAMP)
source "$LIB_DIR/lock.sh" # Verrous (dépend de colors, config)
source "$LIB_DIR/system.sh" # Système (dépend de colors, config, utils)
source "$LIB_DIR/off_peak.sh" # Heures creuses (dépend de colors, config)
source "$LIB_DIR/args.sh" # Arguments (dépend de colors, config, off_peak pour parse_off_peak_range)
source "$LIB_DIR/index.sh" # Index fichiers (dépend de ui, utils)
source "$LIB_DIR/counters.sh" # Compteurs persistants (dépend de config)
source "$LIB_DIR/queue.sh" # Queue (dépend de index, counters, ui, config, utils, logging)
source "$LIB_DIR/vmaf.sh" # VMAF (dépend de colors, config, utils, logging)
source "$LIB_DIR/vmaf_predictive.sh" # Phase C : encode rapide + VMAF par segment (dépend de vmaf.sh)
source "$LIB_DIR/auto_boost.sh" # Phase C : orchestration auto-boost-lite (dépend de segmenter + vmaf_predictive)
source "$LIB_DIR/media_probe.sh" # Propriétés média (dépend de utils)
source "$LIB_DIR/complexity.sh" # Analyse complexité pour mode adaptatif (dépend de media_probe)
source "$LIB_DIR/audio_decision.sh" # Décision audio smart (dépend de config, codec_profiles)
source "$LIB_DIR/audio_params.sh" # Paramètres audio (dépend de config, utils, audio_decision)
source "$LIB_DIR/video_params.sh" # Paramètres vidéo (pix_fmt/downscale/bitrate/suffix)
source "$LIB_DIR/stream_mapping.sh" # Mapping streams (sous-titres)
source "$LIB_DIR/skip_decision.sh" # Logique skip/passthrough/full (dépend de codec_profiles, ui)
source "$LIB_DIR/conversion_prep.sh" # Préparation conversion (dépend de utils, ui, media_probe)
source "$LIB_DIR/adaptive_mode.sh" # Mode adaptatif (dépend de complexity, video_params, skip_decision)
source "$LIB_DIR/transcode_video.sh" # Encodage vidéo (params, VBV, filtres)
source "$LIB_DIR/ffmpeg_pipeline.sh" # Pipeline FFmpeg (exécution unifiée)
source "$LIB_DIR/conversion.sh" # Orchestration conversion (dépend de tout ci-dessus)
source "$LIB_DIR/processing.sh" # Traitement (dépend de conversion, queue, off_peak)
source "$LIB_DIR/summary.sh" # Résumé final (dépend de ui, utils, vmaf)
source "$LIB_DIR/finalize.sh" # Finalisation (dépend de summary, ui, config, utils, vmaf)
source "$LIB_DIR/transfer.sh" # Transferts asynchrones (dépend de finalize, config)
source "$LIB_DIR/exports.sh" # Exports (dépend de tout)
###########################################################
# FONCTION PRINCIPALE
###########################################################
main() {
# Configurer les traps pour le nettoyage
setup_traps
# Chrono global (temps total d'exécution du script)
# Défini une seule fois, et utilisé dans le résumé final.
if [[ -z "${START_TS_TOTAL:-}" ]]; then
START_TS_TOTAL="$(date +%s)"
fi
# Parser les arguments de la ligne de commande
parse_arguments "$@"
# Détection runtime du binaire SVT-AV1-Essential (Phase B, opt-in).
# Si --essential / --no-essential n'a pas été passé en CLI, on auto-active
# selon que le binaire est dispo dans le PATH (ou SVTAV1_ESSENTIAL_BIN).
# Best-effort, silencieux si pas de binaire.
if declare -f detect_svtav1_essential >/dev/null; then
detect_svtav1_essential >/dev/null 2>&1 || true
fi
# Configurer les paramètres selon le mode de conversion
set_conversion_mode_parameters
# Mode fichier unique : traiter directement sans index/queue
if [[ -n "${SINGLE_FILE:-}" ]]; then
# Convertir en chemin absolu (robuste aux espaces)
local single_file_input="$SINGLE_FILE"
if ! SINGLE_FILE="$(abspath_path "$single_file_input")"; then
print_error "$(msg MSG_MAIN_PATH_INVALID "$single_file_input")"
exit 1
fi
# Valider l'entrée
if [[ ! -f "$SINGLE_FILE" ]]; then
print_error "$(msg MSG_MAIN_FILE_NOT_EXIST "$SINGLE_FILE")"
exit 1
fi
# SOURCE = dossier contenant le fichier (pour les chemins relatifs)
SOURCE="$(dirname "$SINGLE_FILE")"
# Vérifications minimales
check_lock
check_dependencies
initialize_directories
init_async_transfers
# Vérification interactive du suffixe de sortie (cohérent avec le mode batch)
check_output_suffix
detect_hwaccel
check_vmaf
export_variables
# Notification de démarrage (Discord) — best-effort.
if declare -f notify_event &>/dev/null; then
notify_event run_started || true
elif declare -f notify_event_run_started &>/dev/null; then
notify_event_run_started || true
fi
# Conversion directe du fichier unique
if [[ "$NO_PROGRESS" != true ]]; then
print_conversion_start 1
fi
convert_file "$SINGLE_FILE" "$OUTPUT_DIR"
cleanup_transfers
if [[ "$DRYRUN" != true ]]; then
show_summary
fi
return
fi
# Vérifier que SOURCE existe avant de convertir en chemin absolu
if [[ ! -d "$SOURCE" ]]; then
print_error "$(msg MSG_MAIN_DIR_NOT_EXIST "$SOURCE")"
exit 1
fi
SOURCE=$(cd "$SOURCE" && pwd)
# Protection : si la source est elle-même dans les exclusions, le run ne peut pas produire de fichiers.
# On sort explicitement pour éviter un comportement perçu comme un blocage.
if is_excluded "$SOURCE"; then
print_error "$(msg MSG_MAIN_SOURCE_EXCLUDED "$SOURCE")"
exit 1
fi
# Vérifications initiales
check_lock
check_dependencies
initialize_directories
# Initialiser le système de transferts asynchrones
init_async_transfers
# Vérifications interactives
check_plexignore
check_output_suffix
# Détecter le hwaccel avant d'indexer / construire la queue
detect_hwaccel
# Vérifier si VMAF est activé et disponible
check_vmaf
# Construire la file d'attente (peut poser des questions sur l'index)
build_queue
# Notification de démarrage (Discord) — best-effort.
# Placée ici pour inclure l'aperçu de la file (après les paramètres actifs).
if declare -f notify_event &>/dev/null; then
notify_event run_started || true
elif declare -f notify_event_run_started &>/dev/null; then
notify_event_run_started || true
fi
# Exporter les variables et fonctions pour les sous-shells
export_variables
# --- Après toutes les questions interactives ---
# Afficher les informations heures creuses si activé
show_off_peak_startup_info
# Si mode heures creuses, attendre le début des heures creuses avant de continuer
if ! check_off_peak_before_processing; then
print_warning "$(msg MSG_MAIN_STOP_BEFORE_PROC)"
exit 0
fi
# Préparer la queue dynamique, lancer le traitement et attendre la fin
prepare_dynamic_queue
# Attendre la fin de tous les transferts en cours
cleanup_transfers
# Afficher le résumé final
if [[ "$DRYRUN" == true ]]; then
dry_run_compare_names
print_header "$(msg MSG_MAIN_DRYRUN_DONE)" "$GREEN"
else
show_summary
fi
}
###########################################################
# POINT D'ENTRÉE
###########################################################
main "$@"