[resolu] MKV Merge et RunProgram()

Programmation d'applications complexes
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

[resolu] MKV Merge et RunProgram()

Message 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  
Dernière modification par Ar-S le ven. 29/juil./2011 22:58, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MKV Merge et RunProgram()

Message 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...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MKV Merge et RunProgram()

Message par djes »

Télécharge l'excellent filemon et regarde comment se comportent les programmes.
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: MKV Merge et RunProgram()

Message par case »

fais voir ton code de la partie ou tu crée le param$
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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  


~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MKV Merge et RunProgram()

Message par djes »

Je ne crois pas qu'il faille mettre de " autour des autres paramètres que les chemins...
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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.
Dernière modification par Ar-S le ven. 29/juil./2011 21:59, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: MKV Merge et RunProgram()

Message 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"
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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é.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: MKV Merge et RunProgram()

Message par djes »

copie-colle la chaîne et fais un essai en direct dans une console
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
case
Messages : 1546
Inscription : lun. 10/sept./2007 11:13

Re: MKV Merge et RunProgram()

Message 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
Dernière modification par case le ven. 29/juil./2011 22:40, modifié 1 fois.
ImageImage
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: MKV Merge et RunProgram()

Message 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:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre