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

murphy
 2010-02-11 18:35
#132716 #132716
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Guest Habanero
[...]
Da kann leider nicht programmieren und mir den Code zurechtschreiben, aus diesem Grund hab ich mich ans Forum gewand.
[...]

Das mag jetzt gehässig klingen, aber es handelt sich hier um ein Forum für Perlprogrammierer. Normalerweise setze ich also bei jemandem, der hier eine Frage stellt, zumindest minimalen Lernwillen im Bezug auf Perl voraus. Und ich halte es nicht für zuviel verlangt, kurz nachzudenken um aus dem ursprünglichen Skript und meinem Ansatz etwas neues zu bauen, was wieder eine einzelne Zeichenkette statt einer Argumentliste für den Aufruf der externen Programme verwendet. Dazu muss man, denke ich, nichteinmal programmieren können, sondern lediglich eine kleine Transferleistung erbringen — und vielleicht könnte man dadurch sogar etwas über das Programmieren lernen.

Ich habe auch kein Problem damit, Dir das Skript entsprechend umzuschreiben, aber davon, dass Dir alles vorgekaut wird, lernst Du halt nix — nur wenn Du es unbedingt so haben möchtest, bitteschön:
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
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+0x(.*)$/) {
            $uid = $1;
            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, '--set', "prev-uid=$prev_uid" if (defined $prev_uid);
    push @options, '--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 $?"
    }
}
When C++ is your hammer, every problem looks like your thumb.

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