Etant amateur de série en VO sous titré, j'ai pas mal de fichiers video accompagnés des sous titres en .srt
- Mavideo.avi
- Mavideo.srt
Sur ma freebox V6, la gestion des SRT est naze. La solution consiste à créer un fichier .MKV regroupant Video et Sous titre.
Ainsi ça marche super bien sur la box.
J'utilise donc le (très bon) logiciel MKVmerge GUI pour me créer mes mkv.
Comme je suis une feignasse et que je veux pas me faire toutes les manipes les une après les autres, j'ai décidé de créer un "générateur de tâche" reprenant les commandes de MKVmerge (sans le GUI) afin de lancer la conversion de tout un répertoire à la fois.
Voilà ce que génère une tâche avec MKVmerge GUI
Code : Tout sélectionner
"C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe" -o "F:\\Film\\fichierDestinnation.mkv" --forced-track 0:no --forced-track 1:no -A 1 -D 0 -S -T --no-global-tags --no-chapters "F:\\Film\\Source.avi" --language 0:fre --track-name 0:Sous-titre FR --default-track 0:yes --forced-track 0:no -S 0 -d -a -T --no-global-tags --no-chapters "F:\\Film\\Source.srt" --track-order 0:0,0:1,1:0
Que je fasse :
Code : Tout sélectionner
prog$ = "C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe"
; param$ c'est le reste
MKVmerge = RunProgram(prog$ + Param$,"", GetPathPart(prog$), #PB_Program_Open|#PB_Program_Read)
; ou MKVmerge = RunProgram(prog$ , Param$, GetPathPart(prog$), #PB_Program_Open|#PB_Program_Read)
Sortie$ = ""
If MKVmerge
While ProgramRunning(MKVmerge)
If AvailableProgramOutput(MKVmerge)
Sortie$ + ReadProgramString(MKVmerge) + Chr(10)
EndIf
Wend
Sortie$ + Chr(13)
Sortie$ + "Code de retour : " + Str(ProgramExitCode(MKVmerge)) + Chr(13)
CloseProgram(MKVmerge) ; Ferme la connection vers le programme
Debug Sortie$
Else
Debug "Impossible d'ouvrir "+prog$
EndIf
---- EDIT ---- CODE FONCTIONEL
Code : Tout sélectionner
Global NewList AVI.s()
; Parametres conversion
prog$=Chr(34)+"C:\Program Files (x86)\MKVtoolnix\MKVmerge.exe"+Chr(34)
opt$=" -o " ; Ici pas de chr(34)
; Ajout des " par replacestring
; C'est plus lisible que de mettre dans la sources x dizaines de chr(34)
Opt2$ = " ?--forced-track? ?0:no? ?--forced-track? ?1:no? ?-a? ?1? ?-d? ?0? ?-S? ?-T? ?--no-global-tags? ?--no-chapters? "
Opt2$ = ReplaceString(Opt2$,"?",Chr(34))
Opt3$ = " ?--language? ?0:fre? ?--track-name? ?0:Sous-titre FR? ?--default-track? ?0:yes? ?--forced-track? ?0:no? ?-s? ?0? ?-D? ?-A? ?-T? ?--no-global-tags? ?--no-chapters? "
Opt3$ = ReplaceString(Opt3$,"?",Chr(34))
Opt4$ = " ?--track-order? ?0:0,0:1,1:0?"
Opt4$ = ReplaceString(Opt4$,"?",Chr(34))
Procedure ListeFilms()
ClearList(AVI())
Directory$ = PathRequester("Repertoire à lister",GetCurrentDirectory())
If Directory$
If ExamineDirectory(0,Directory$,"*.avi")
While NextDirectoryEntry(0)
If DirectoryEntryType(0) = #PB_DirectoryEntry_File
fichier$=DirectoryEntryName(0)
If fichier$<>"." And fichier$<>".."
AddElement(AVI())
AVI() = Directory$+fichier$
Debug AVI()
EndIf
EndIf
Wend
FinishDirectory(0)
EndIf
Else
ProcedureReturn #False
EndIf
EndProcedure
Procedure.s SetFileExtension (Fichier.s,Nouvelle_Extension.s)
Protected.s Extension
; Test fichier
If Len(Fichier)<5 ; 5 = min pour nom de fichier + extension (a.avi par exemple)
ProcedureReturn
EndIf
Extension.s = GetExtensionPart(Fichier)
; test si extension existe
If Extension = ""
ProcedureReturn
EndIf
; on remplace l'extension
Fichier_Sortie.s = Left(Fichier,Len(Fichier)-3)+Nouvelle_Extension
Fichier_Sortie = Chr(34)+Fichier_Sortie+Chr(34)
ProcedureReturn Fichier_Sortie
EndProcedure
;- /// PROGRAMME ///
ListeFilms()
ResetList(AVI())
ForEach AVI()
; Parsing des double slash
AVI$ = AVI() ; On garde AVI() intact
AVI$ = Chr(34)+AVI$+Chr(34)
AVI$ = ReplaceString(AVI$,"\","\\")
MKV$ = SetFileExtension(AVI(),"mkv")
MKV$ = ReplaceString(MKV$,"\","\\")
SRT$ = SetFileExtension(AVI(),"srt")
SRT$ = ReplaceString(SRT$,"\","\\")
Param$ = opt$ + MKV$ + Opt2$ + AVI$ + Opt3$ + SRT$ + Opt4$
MKVconvert$ = prog$ + Param$
MKVmerge = RunProgram(MKVconvert$, "", GetPathPart(prog$), #PB_Program_Open|#PB_Program_Read) ; je te haie RunProgram !
Sortie$ = ""
If MKVmerge
While ProgramRunning(MKVmerge)
If AvailableProgramOutput(MKVmerge)
Sortie$ + ReadProgramString(MKVmerge) + Chr(10)
EndIf
Wend
Sortie$ + Chr(13) + Chr(13)
Sortie$ + "Code de retour : " + Str(ProgramExitCode(MKVmerge)) + Chr(13)
CloseProgram(MKVmerge) ; Ferme la connection vers le programme
Debug Sortie$
Else
Debug "Impossible d'ouvrir "+prog$
EndIf
Debug MKVconvert$
SetClipboardText(MKVconvert$)
Next