selfhtml.de - Alles für den Webmaster!

 

Empfehlung:

wix.com

Kostenlose Homepage

Besuchen Sie auch:

Jobs:

Skript für automatisches File-Linking mit Matroska

Autor: habanero
Datum: 07.02.2010 13:32:46

Hallo,

eins vorweg: Ich hab noch nie nur eine Zeile Code programmiert.

Ich sortiere gerade u.a. Serien um sie auf meinen HTPC zu kopieren. Ich muxe alles in MKV (Matroska), welches die Möglichkeit bietet, 2 Files miteinander zu verlinken. Diese werden dann hintereinander abgespielt, dennoch kann man jede Datei auch einzeln auswählen. Das verlinken per Hand und GUI zu machen dauert ewig, daher wollte ich alle Dateien (jede Episode hat 1 oder 2 Dateien) in einen Ordner packen und in dieser Reihen folge autmatisch verlinken lassen.

Dazu muss z. B. von Datei 2 eine Segment-UID (SID) in die Kopfdaten der Datei 1 eingefügt werden. Dann die SID von datei 3 in die Kopfdaten von Datei 2. Das ganze kann man machen mit mkvmerge (neu muxen) oder mkvpropedit (nur ändern der Kopfdaten).

Problem: Das muxen per Kommandozeile und manuellem Einfügen der SID ist kein Problem, ich würde das aber gern für den kompletten Ordner automatisch machen lassen. Der Entwickler mailte mir dazu, dass man per mkvinfo.exe die SID von z. B. der Datei 2 auslesen lassen muss und diese dann in mkvpropedit (oder mkvmerge) einfügen lassen muss.

Und hier fängt mein Problem an: Wie bringe ich es fertig, dass mkvinfo.exe automatisch die SID ausließt und an mkvpropedit (oder mkvmerge) weitergibt und das für alle Dateien im Ordner?

Der Entwickler hat mir diesen (ungetesteten, schnell getippten Code geschrieben), nur weiß ich da ich nicht programmieren kann, damit nichts anzufangen.

[CODE]my @files = sort glob "*.mkv";

# Segment-UID via mkvinfo auslesen
my @segment_uids;
foreach my $filename (@files) {
  my $uid = `mkvinfo --ui-language en "$filename" | grep -i '+ Segment
UID:'`;
  chomp $uid;
  $uid =~ s/.*:s+//;
  push @segment_uids, $uid;
}

# Ueber alle Dateien iterieren und Felder setzen
foreach my $idx (0..scalar(@files) - 1) {
  my @options;
  push @options, "--set 'next-uid=" . $segment_uids[$idx + 1] . "'" if
($idx + 1 < scalar(@files));
  push @options, "--set 'prev-uid=" . $segment_uids[$idx - 1] . "'" if
($idx > 0);

  system qq|mkvpropedit "$files[$idx]" --edit info | . join(" ",
@options);
}[/CODE]

Kann mir hier jemand helfen wie ich das am besten bewerkstelligen kann?

btw.
Hallo,

eins vorweg: Ich hab noch nie nur eine Zeile Code programmiert.

Ich sortiere gerade u.a. Serien um sie auf meinen HTPC zu kopieren. Ich muxe alles in MKV (Matroska), welches die Möglichkeit bietet, 2 Files miteinander zu verlinken. Diese werden dann hintereinander abgespielt, dennoch kann man jede Datei auch einzeln auswählen. Das verlinken per Hand und GUI zu machen dauert ewig, daher wollte ich alle Dateien (jede Episode hat 1 oder 2 Dateien) in einen Ordner packen und in dieser Reihen folge autmatisch verlinken lassen.

Dazu muss z. B. von Datei 2 eine Segment-UID (SID) in die Kopfdaten der Datei 1 eingefügt werden. Dann die SID von datei 3 in die Kopfdaten von Datei 2. Das ganze kann man machen mit mkvmerge (neu muxen) oder mkvpropedit (nur ändern der Kopfdaten).

Problem: Das muxen per Kommandozeile und manuellem Einfügen der SID ist kein Problem, ich würde das aber gern für den kompletten Ordner automatisch machen lassen. Der Entwickler mailte mir dazu, dass man per mkvinfo.exe die SID von z. B. der Datei 2 auslesen lassen muss und diese dann in mkvpropedit (oder mkvmerge) einfügen lassen muss.

Und hier fängt mein Problem an: Wie bringe ich es fertig, dass mkvinfo.exe automatisch die SID ausließt und an mkvpropedit (oder mkvmerge) weitergibt und das für alle Dateien im Ordner?

Der Entwickler hat mir diesen (ungetesteten, schnell getippten Code geschrieben), nur weiß ich da ich nicht programmieren kann, damit nichts anzufangen.

[CODE]my @files = sort glob "*.mkv";

# Segment-UID via mkvinfo auslesen
my @segment_uids;
foreach my $filename (@files) {
  my $uid = `mkvinfo --ui-language en "$filename" | grep -i '+ Segment
UID:'`;
  chomp $uid;
  $uid =~ s/.*:s+//;
  push @segment_uids, $uid;
}

# Ueber alle Dateien iterieren und Felder setzen
foreach my $idx (0..scalar(@files) - 1) {
  my @options;
  push @options, "--set 'next-uid=" . $segment_uids[$idx + 1] . "'" if
($idx + 1 < scalar(@files));
  push @options, "--set 'prev-uid=" . $segment_uids[$idx - 1] . "'" if
($idx > 0);

  system qq|mkvpropedit "$files[$idx]" --edit info | . join(" ",
@options);
}[/CODE]

Kann mir hier jemand helfen wie ich das am besten bewerkstelligen kann?

btw.
Ich verwende die Windows-Version der Programme.



Re: Skript für automatisches File-Linking mit Matroska

Autor: moll
Datum: 12.02.2010 15:51:56

> [CODE]my @files = sort glob "*.mkv";
>
> # Segment-UID via mkvinfo auslesen
> my @segment_uids;
> foreach my $filename (@files) {
>   my $uid = `mkvinfo --ui-language en
> "$filename" | grep -i '+ Segment
> UID:'`;
>   chomp $uid;
>   $uid =~ s/.*:s+//;
>   push @segment_uids, $uid;
> }
>
> # Ueber alle Dateien iterieren und Felder setzen
> foreach my $idx (0..scalar(@files) - 1) {
>   my @options;
>   push @options, "--set 'next-uid=" .
> $segment_uids[$idx + 1] . "'" if
> ($idx + 1 < scalar(@files));
>   push @options, "--set 'prev-uid=" .
> $segment_uids[$idx - 1] . "'" if
> ($idx > 0);
>
>   system qq|mkvpropedit "$files[$idx]"
> --edit info | . join(" ",
> @options);
> }[/CODE]
>
> Kann mir hier jemand helfen wie ich das am besten
> bewerkstelligen kann?
>
> btw.
> Ich verwende die Windows-Version der Programme.

Hallo,
erst mal brauchst du 'nen Perlinterpreter und außerdem die Unixtools für Windows, weil da u.a. grep verwendet wird.
Wenn du beides installiert hast, dann schreibst du den Code in eine Datei mit der Endung .pl und teilst Windows mit, dass es bei es *.pl Dateien den Perl Interpreter verwenden soll.
Anschließend rufts du dein Skript auf und schaust mal was passiert.
Gruß Moll

http://www.chip.de/downloads/ActivePerl-for-Windows_12995284.html
http://www.filewatcher.com/m/UnxUpdates.zip.878847.0.0.html