Page 1 sur 2

[resolu] MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:01
par Ar-S
Salut,

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
Je réussi à recréer automatiquement ce schéma, j'aimerai donc lancer cette commande avec runprogram() mais j'ai un sale retour d'erreur "source file 1 could not be found"

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
Si vous auriez un idée d'où peu venir ce dysfonctionnement.


---- 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  

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:07
par djes
Les fichiers sont bien dans le même dossier que mkvmerge? Ou donnes-tu le chemin complet? S'il y a des espaces, tu ajouter un chr(34) de chaque côté du nom...

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:23
par Ar-S
Les chr(34) sont présent. Et j'indique les chemins complets de tous les fichiers (exe, MKVdestinnation, AVIsource, SRTsource).
C'est à s'arracher les cheveux.

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:25
par djes
Télécharge l'excellent filemon et regarde comment se comportent les programmes.

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:29
par case
fais voir ton code de la partie ou tu crée le param$

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:40
par Ar-S
Voilà même le code complet, je l'ai pas mis car je ne sais pas si beaucoup de monde en aura l'utilité, mais au cas ou le voici.

Code : Tout sélectionner

Global NewList AVI.s()

; Parametres conversion
prog$=Chr(34)+"L:\_PROG\PureBasic4.51\Examples\MKV Converter\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$
  
  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) + 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
  
  
  
  MKVconvert$ = prog$ + Param$
  Debug MKVconvert$
  SetClipboardText(MKVconvert$)
  
Next  



Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:42
par Ar-S
et le message d'erreur :
Erreur : The source file '0' could not be opened successfully, or retrieving its size by seeking to the end did not work.
Code de retour : 2

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:46
par djes
Je ne crois pas qu'il faille mettre de " autour des autres paramètres que les chemins...

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:54
par Ar-S
Pourtant la tâche si elle est générée par MKVmerge GUI en comporte autour de tous les paramètres.
je vais ré-essayer sans mais je crois l'avoir déjà fait.

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:54
par case
j'allais le dire tu met bien trop de guillemets
et pourquoi met tu des \\ a la place des \ dans les noms de fichiers ?


Impossible d'ouvrir "L:\_PROG\PureBasic4.51\Examples\MKV Converter\MKVtoolnix\MKVmerge.exe"
"L:\_PROG\PureBasic4.51\Examples\MKV Converter\MKVtoolnix\MKVmerge.exe" -o "c:\\ceci est un test\\le fichier.mkv" "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "c:\\ceci est un test\\le fichier.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" "c:\\ceci est un test\\le fichier.srt" "--track-order" "0:0,0:1,1:0"

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 21:59
par Ar-S
C'est la synthaxe utilisée par MKVmerge.
J'ai essayé sans les chr(34) pour les options et sans les //

Même pâté.

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 22:02
par djes
copie-colle la chaîne et fais un essai en direct dans une console

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 22:08
par Ar-S
En copiant la ligne de commande dans ma console (cmd)

Code : Tout sélectionner

"C:\Program Files (x86)\MKVtoolnix\mkvmerge.exe" -o "F:\\FilmZ\\etcetc\\FichierDestination.mkv"  "--forced-track" "0:no" "--forced-track" "1:no" "-a" "1" "-d" "0" "-S" "-T" "--no-global-tags" "--no-chapters" "F:\\FilmZ\\etcetc\\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:\\FilmZ\\etcetc\\soustitre.srt" "--track-order" "0:0,0:1,1:0"
ça marche...

Donc ma synthaxe avec chr(34) et // est bonne.

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 22:39
par case

Code : Tout sélectionner

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? "
?-s? et pas ?-S? c'est pas le même switch

Re: MKV Merge et RunProgram()

Publié : ven. 29/juil./2011 22:40
par Ar-S

Code : Tout sélectionner

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))
Bon le soucis a l'air de venir simplement de runprogram()...
Car si je lance le prog, il ne convertit rien et affiche ces messages d'erreurs, sauf que je lui dit de copier la dernière ligne de commande dans le clipboard.
Si je colle le contenu du clipboard dans la fenêtre CMD, l'encodage se fait.
J'ai toujours trouvé la commande RunProgram() mal foutue.. Ce soucis confirme cette aversion. :cry: