Thread Skript für automatisches File-Linking mit Matroska
(49 answers)
Opened by Habanero at 2010-02-07 13:33
Da auch schon erwähnt wurde, dass die "0x" Präfixes in den UIDs, die mkvinfo ausspuckt von mkvpropset nicht verstanden werden, denke ich eher, dass man die alle entfernen muss. Vielleicht so:
Code (perl): (dl
)
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 use 5.010; use strict; use warnings; # Dateien auflisten und sortieren my @files = sort glob '*.mkv'; # Segment-UIDs via mkvinfo auslesen my @uids = map { my $file = $_; open my $mkvinfo, '-|', qq/mkvinfo --ui-language en "$file"/ or die "Couldn't run mkvinfo on $file: $!"; my $uid; while (my $_ = <$mkvinfo>) { if (/\+ Segment UID:\s+(.*)$/) { $uid = $1; $uid =~ s/\s*0x//g; last; } } close $mkvinfo or die "Error running mkvinfo on $file: $!"; warn "Couldn't determine UID for $file" unless (defined $uid); $uid } @files; # Ueber alle Dateien iterieren und Felder setzen for ($[ .. $#files) { my $file = $files[$_]; my $prev_uid = ($_ - 1 >= $[ ? $uids[$_ - 1] : undef); my $next_uid = ($_ + 1 <= $#uids ? $uids[$_ + 1] : undef); my @options; push @options, qq/--set prev-uid="$prev_uid"/ if (defined $prev_uid); push @options, qq/--set next-uid="$next_uid"/ if (defined $next_uid); if (@options) { system(qq/mkvpropedit "$file" --edit info @options/) == 0 or die "Couldn't run mkvpropedit on $file: status $?" } } Zeile 17 hat hier wieder die alte Form, dafür löscht aber Zeile 19 alle Sequenzen bestehend aus beliebig vielen Leerzeichen und der Zeichenkombination "0x" aus der UID, die mkvinfo ausgibt. Zusätzlich wurden die Zeilen 40 und 41 sicherheitshalber angepasst um die UIDs als Eingaben für mkvpropedit mit Anführungszeichen zu umgeben. Außerdem werden jetzt bereits in den Zeilen 40 und 41 mehrere Kommandozeilenparameter für mkvpropedit in jeweils einem String zusammengefasst, allerdings ist das völlig unerheblich, da in Zeile 44 sowieso alles in einen einzelnen String verwandelt wird und danach das Unescaping der Windowsshell und das Tokenizing der Standard-C-Bibliothek von Windows auf diesen String losgeht, wobei beides keinen klaren Regeln folgt und man beten muss, dass es funktioniert ;-) (Ist leicht übertrieben, aber die Behandlung von Kommandozeilenparametern unter Windows ist in der Tat eine Krankheit verglichen zu der unter Unix. Ferner ist sie wirklich schlecht spezifiziert.) When C++ is your hammer, every problem looks like your thumb.
|