Thread Skript für automatisches File-Linking mit Matroska (49 answers)
Opened by Habanero at 2010-02-07 13:33

murphy
 2010-02-11 22:49
#132752 #132752
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
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.

View full thread Skript für automatisches File-Linking mit Matroska