Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

[gelöst] Filme nach Größe sortieren

Alles rund um die verschiedenen Konsolen und shells sowie die Programmierung unter Linux

Moderator: Moderatoren

Antworten
Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

[gelöst] Filme nach Größe sortieren

Beitrag von gm2601 » 18. Okt 2019, 14:04

Hallo Shell-gurus,

kann man aus einer Sammlung von Filmen der Formate "mpg, avi, mp4, mkv" eine Liste generieren, in der die Titel und deren Spieldauer nach Größe abfallend sortiert sind? Die Filme sind obendrein in mehreren Verzeichnissen.
Mit "mediainfo" finde ich beide Angaben, wenn auch "Duration" mehrfach vorkommt. Für eine Filmart in einem Verzeichnis habe ich einen Zweizeiler pro Film geschafft, aber für alle und obendrein sortiert, scheitere ich mit meinem minimalen Syntaxkenntnissen kläglich.

Wer kann (shell)zaubern?
Zuletzt geändert von gm2601 am 23. Okt 2019, 12:39, insgesamt 1-mal geändert.
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

Werbung:
abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: Filme nach Größe sortieren

Beitrag von abgdf » 18. Okt 2019, 17:39

Funktioniert das? (Filme und Skript im selben Verzeichnis.)

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

sub getFilesnames {
    my @sufs = qw(mpg avi mp4 mkv);
    my @files;
    my ($i, $u);
    for $i (@sufs) {
        my @a = <*$i>;
        for $u (@a) {
            push(@files, $u);
        }
    }
    return @files;
}

sub printTimes {
    my $hours = shift;
    my $minutes = shift;
    my $seconds = shift;
    print "Hours: $hours\n";
    print "Minutes: $minutes\n";
    print "Seconds: $seconds\n\n";
}

sub getSortedIndices {
    my @a = @_;
    my @b = (0 .. $#a);
    my $i;
    my $u;
    my $temp;
    my $temp2;
    for $i (0 .. $#a) {
        for $u (0 .. $#a) {
            if ($a[$u] < $a[$i]) {
                $temp = $a[$i];
                $a[$i] = $a[$u];
                $a[$u] = $temp;
                $temp2 = $b[$i];
                $b[$i] = $b[$u];
                $b[$u] = $temp2;
            }
        }
    }
    return @b;
}


sub getSeconds {
    my $tstr = shift;
    $tstr =~ s/ //g;
    my $hours;
    my $minutes;
    my $seconds;
    my $allseconds;
    my @a = split(/h/, $tstr);
    if ($#a > 0) {
        $hours = shift(@a);
        $tstr = join("h", @a);
    } else {
        $hours = 0;
    }
    @a = split(/min/, $tstr);
    if ($#a >= 0 && $a[0] !~ m/s$/) {
        $minutes = shift(@a);
        $tstr = join("min", @a);
    } else {
        $minutes = 0;
    }
    @a = split(/s/, $tstr);
    if ($#a >= 0) {
        $seconds = shift(@a);
    } else {
        $seconds = 0;
    }
    # printTimes($hours, $minutes, $seconds);
    $allseconds = 3600 * $hours + 60 +$minutes + $seconds;
    return $allseconds;
}

sub getDurations {
    my @files = @_;
    my @seconds;
    my @timestrings;
    my @mediainfo;
    my $minfo;
    my $i;
    my @a;
    my $secs;
    my $tstr;
    for $i (@files) {
        @mediainfo = `mediainfo \"$i\" | grep Duration`;
        $minfo = shift(@mediainfo);
        chomp($minfo);
        @a = split(/: /, $minfo);
        $tstr = pop(@a);
        push(@timestrings, $tstr);
        $secs = getSeconds($tstr);
        push(@seconds, $secs);
    }
    my $r1 = \@timestrings;
    my $r2 = \@seconds;
    return ($r1, $r2);
}

my @files = getFilesnames();
my @durations = getDurations(@files);
my @timestrings = @{$durations[0]};
my @seconds = @{$durations[1]};
my @newIndices = getSortedIndices(@seconds);
my $i;

print "\nFilms, sorted by length: Film, seconds\n\n";
for $i (0 .. $#files) {
    print "\"$files[$newIndices[$i]]\"\t\t\t$timestrings[$newIndices[$i]]\n";
}
print "\n";
Ach so, mehrere Verzeichnisse. Na ja, müßte man halt noch mit dem Modul "File::Find" arbeiten.

Wahrscheinlich glaubst Du, das geht einfach mit sowas wie "find filme | mediainfo | grep Duration | sort reverse", aber so einfach ist das nicht.

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: Filme nach Größe sortieren

Beitrag von gm2601 » 19. Okt 2019, 10:25

Mon Dieu, :ops:

sieht für mich furchtbar kryptisch aus und, ich kann es nicht einmal testen, denn ich scheitere, als User wie als root, am "chmod" mit all meinen Versuchen die Datei ausführbar zu machen. :ops:

Vermute, es liegt an dem mir unbekannten Pluszeichen, das ich nicht wegbekomme:

Code: Alles auswählen

ll /run/media/
insgesamt 0
drwxr-x---+  3 root root 60 19. Okt 09:34 guenter
Der anschließende Mountpoint heißt SILBER (schlicht Farbe und Label der 1TB-USB-Diks)
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

josef-wien
Ultimate Guru
Ultimate Guru
Beiträge: 5339
Registriert: 23. Sep 2008, 17:09

Re: Filme nach Größe sortieren

Beitrag von josef-wien » 19. Okt 2019, 12:41

guenter = ein Verzeichnis
Eigentümer = root = darf Verzeichnisinhalt lesen, Dateien anlegen/löschen, das Verzeichnis betreten
Gruppe = root = darf Verzeichnisinhalt lesen, das Verzeichnis betreten
Rest der Welt = darf gar nichts
+ = zusätzlich sind ACL-Berechtigungen definiert:

Code: Alles auswählen

getfacl guenter

P. S. Fummelst Du am Verzeichnis herum?

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: Filme nach Größe sortieren

Beitrag von gm2601 » 19. Okt 2019, 13:06

abgdf hat geschrieben:
18. Okt 2019, 17:39
Funktioniert das? (Filme und Skript im selben Verzeichnis.)
Großartig seit mir Josef das mit "perl Sort_film" erklärt hat. (nanu, wo ist das jetzt geblieben?)
An meine zweite Platte, voll und mit Verzeichnissen, habe ich mich noch nicht hingewagt.

Winzigkeit, nicht interessant für mich, aber vielleicht für den Perfektionisten: Die Tabs nach den Titeln sind nicht gleich verteilt.
Bitte nicht als Mecker betrachten!


josef-wien hat geschrieben:
19. Okt 2019, 12:41
"guenter" ist ein Verzeichnis.
[..]
+ = Zusätzlich sind ACL-Berechtigungen definiert:
Soweit hatte ich mir das bisher auch gedacht, aber "chmod" ließ mich Im Regen stehen.

Code: Alles auswählen

getfacl guenter
Hier der output:

Code: Alles auswählen

guenter@Emil-3:/run/media> getfacl guenter/
# file: guenter/
# owner: root
# group: root
user::rwx
user:guenter:r-x
group::---
mask::r-x
other::r-x

guenter@Emil-3:/run/media> getfacl guenter/SILBER/Sort_film 
# file: guenter/SILBER/Sort_film
# owner: guenter
# group: users
user::rw-
group::r--
other::r--
auch wenn ich immer noch nicht verstehe, warum ich der Perl-Datei auf der USB-Disk "execute" nicht geben konnte, in $HOME ging das problemlos.

Nachtrag zu Deiner Frage nach "fummeln am Verzeichnis"
Ja, was tut man nicht in seiner Verzweiflung, wenn etwas nicht geht und man hat keine Idee warum.
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: Filme nach Größe sortieren

Beitrag von abgdf » 19. Okt 2019, 14:43

gm2601 hat geschrieben:
19. Okt 2019, 13:06
Großartig seit mir Josef das mit "perl Sort_film" erklärt hat. (nanu, wo ist das jetzt geblieben?)
An meine zweite Platte, voll und mit Verzeichnissen, habe ich mich noch nicht hingewagt.

Winzigkeit, nicht interessant für mich, aber vielleicht für den Perfektionisten: Die Tabs nach den Titeln sind nicht gleich verteilt.
Dankeschön! Dann schreibe ich Dir noch eine neue Version, die auch die Unterverzeichnisse durchsucht. Etwas Geduld, bitte.
Ich hatte jeweils 3 Tabs gesetzt, weil das auf meiner Konsole am besten aussah. Bei der nächsten Version nehme ich wohl einfach einen.
josef-wien hat geschrieben:
19. Okt 2019, 12:41
auch wenn ich immer noch nicht verstehe, warum ich der Perl-Datei auf der USB-Disk "execute" nicht geben konnte, in $HOME ging das problemlos.
Kann sein, daß die USB-Disk eine Windows-Formatierung hat, die kein chmod kennt.

Obwohl mich freut, daß Du mir vertraust (kannste auch :)), würde ich ansonsten grundsätzlich doch empfehlen, unbekannten Perl-Code aus dem Internet nicht einfach auf Deinen Platten auszuführen, solange Du gar keine Vorstellung hast, was er da tut. Is' klar, ne?

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: Filme nach Größe sortieren

Beitrag von abgdf » 19. Okt 2019, 16:09

Ok, das sollte auch die Unterverzeichnisse mit durchsuchen, ausgehend von dem Verzeichnis, in dem sich das Skript befindet.

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

# sort_films.pl
#
# Sorts films by duration.
# Depends on output of 'mediainfo'.
#
# (C) 2019, abgdf@gmx.net. Licence: GNU GPL version 2.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use File::Find;
use Cwd;

my $directory = getcwd();

my @FILES = ();
my $NROFFILES = 0;
my @SUFS = qw(mpg avi mp4 mkv);

sub getFilenames {
    my $filename = $File::Find::name;
    my $i;
    for $i (@SUFS) {
        if ($filename =~ m/\.$i/) {
            push(@FILES, $filename);
            $NROFFILES++;
            if ($NROFFILES % 10 == 0) {
                print "10 more filenames added to list.\n";
            }
        }
    }
}

sub printTimes {
    my $hours = shift;
    my $minutes = shift;
    my $seconds = shift;
    print "Hours: $hours\n";
    print "Minutes: $minutes\n";
    print "Seconds: $seconds\n\n";
}

sub getSortedIndices {
    my @a = @_;
    my @b = (0 .. $#a);
    my $i;
    my $u;
    my $temp;
    my $temp2;
    print "\nSorting ";
    print $#a + 1;
    print " entries.\n\n";
    for $i (0 .. $#a) {
        for $u (0 .. $#a) {
            if ($a[$u] < $a[$i]) {
                $temp = $a[$i];
                $a[$i] = $a[$u];
                $a[$u] = $temp;
                $temp2 = $b[$i];
                $b[$i] = $b[$u];
                $b[$u] = $temp2;
            }
        }
    }
    return @b;
}


sub getSeconds {
    my $tstr = shift;
    $tstr =~ s/ //g;
    my $hours;
    my $minutes;
    my $seconds;
    my $allseconds;
    my @a = split(/h/, $tstr);
    if ($#a > 0) {
        $hours = shift(@a);
        $tstr = join("h", @a);
    } else {
        $hours = 0;
    }
    @a = split(/min/, $tstr);
    if ($#a >= 0 && $a[0] !~ m/s$/) {
        $minutes = shift(@a);
        $tstr = join("min", @a);
    } else {
        $minutes = 0;
    }
    @a = split(/s/, $tstr);
    if ($#a >= 0) {
        $seconds = shift(@a);
    } else {
        $seconds = 0;
    }
    # printTimes($hours, $minutes, $seconds);
    $allseconds = 3600 * $hours + 60 +$minutes + $seconds;
    return $allseconds;
}

sub getDurations {
    my @seconds;
    my @timestrings;
    my @mediainfo;
    my $minfo;
    my $i;
    my @a;
    my $secs;
    my $tstr;
    my $count = 0;
    print "\nRunning 'mediainfo' on $NROFFILES files. Please wait.\n";
    for $i (@FILES) {
        @mediainfo = `mediainfo \"$i\" | grep Duration`;
        $count++;
        $minfo = shift(@mediainfo);
        chomp($minfo);
        @a = split(/: /, $minfo);
        $tstr = pop(@a);
        push(@timestrings, $tstr);
        $secs = getSeconds($tstr);
        push(@seconds, $secs);
        if ($count % 10 == 0) {
            print "$count files checked.\n";
        }
    }
    my $r1 = \@timestrings;
    my $r2 = \@seconds;
    return ($r1, $r2);
}
print "\nRunning 'sort_films.pl'.";
print "Searching for files.\n";
find(\&getFilenames, $directory);
my @durations = getDurations();
my @timestrings = @{$durations[0]};
my @seconds = @{$durations[1]};
my @newIndices = getSortedIndices(@seconds);
my $i;

print "\nResult:\n";
print "\nFilms, sorted by length: Film, seconds, readable time\n\n";
for $i (0 .. $NROFFILES - 1) {
    print "\"$FILES[$newIndices[$i]]\"\t$seconds[$newIndices[$i]]\t$timestrings[$newIndices[$i]]\n";
}
print "\n";
HTH :)

josef-wien
Ultimate Guru
Ultimate Guru
Beiträge: 5339
Registriert: 23. Sep 2008, 17:09

Re: Filme nach Größe sortieren

Beitrag von josef-wien » 19. Okt 2019, 17:58

gm2601 hat geschrieben:nanu, wo ist das jetzt geblieben?
Im Nirwana (nachdem ich mit Verspätung realisiert habe, daß das Ergebnis von "ll" nur ein Verzeichnis, aber keine Datei enthält).

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: Filme nach Größe sortieren

Beitrag von gm2601 » 20. Okt 2019, 16:52

abgdf hat geschrieben:
19. Okt 2019, 14:43
Obwohl mich freut, daß Du mir vertraust (kannste auch :)), würde ich ansonsten grundsätzlich doch empfehlen, unbekannten Perl-Code aus dem Internet nicht einfach auf Deinen Platten auszuführen, solange Du gar keine Vorstellung hast, was er da tut. Is' klar, ne?
Ja, das ist im Prinzip schon klar, nur wenn ich jemand frage und selbst zu wenig Ahnung habe, dann MUSS ich ihm vertrauen.
Klar ist aber auch, dass ich ein Duplikat der Disk habe. ;)

Die Geschichte mit den Tabs im ersten Script dürfte normal sein, denn woher willst Du wissen, wie lange die Titel sind? Sorry, da habe ich zuerst geschrieben und erst dann gedacht.
abgdf hat geschrieben:
19. Okt 2019, 16:09
Ok, das sollte auch die Unterverzeichnisse mit durchsuchen, ausgehend von dem Verzeichnis, in dem sich das Skript befindet.
*************** Vergiss die Zeilen, .... ***************
Gestartet wie Sript 1 von .../guenter/INTENSO_2 kommt folgendes als stete Wiederholung:

Code: Alles auswählen

Use of uninitialized value $minfo in scalar chomp at Sort_film_2 line 131.
Use of uninitialized value $minfo in split at Sort_film_2 line 132.
Use of uninitialized value $tstr in substitution (s///) at Sort_film_2 line 86.
Use of uninitialized value $tstr in split at Sort_film_2 line 91.
Use of uninitialized value $tstr in split at Sort_film_2 line 98.
Use of uninitialized value $tstr in split at Sort_film_2 line 105.
Der Zähler läuft jedoch hoch, bei "370 files checked" habe ich mit "Strg c" abgebrochen.
Beim zweiten Versuch bekomme ich:

Code: Alles auswählen

...:/run/media/guenter/INTENSO_2> perl Sort_film_2
Can't open perl script "Sort_film_2": Datei oder Verzeichnis nicht gefunden 
und auch auf "ls" kommt nichts mehr, was mich kurz schockierte, aber von Dolphin aus gestartet laufen die Filme noch und die einzige neue Datei ist "Sort_film_2".
Eine neu gestartete shell, sowie ein Wechsel nach $HOME und listete wieder alles auf, als wäre nie etwas gewesen. :irre:
*********************...... denn mit der anderen shell lief es wie gewünscht **************************** :irre:

Selbst im tiefsten Verzeichnis hat das Script "/run/media/guenter/INTENSO_2/Dokus/Geschichte/Steinerner_Zeuge.mpg" ausgegraben und insgesamt die korrekte Anzahl "Sorting 672 entries" beackert.
Zum Schluss kam, quasi als Entdeckung noch

Code: Alles auswählen

Use of uninitialized value $timestrings[648] in concatenation (.) or string at Sort_film_2 line 157.
"/run/media/guenter/INTENSO_2/Dokus/Wirtschaft/Krupp-3_3.mpg.idx2"      60
die Datei, von der ich nichts wusste und die ich nicht mehr brauche.

Speichert das Script Titel und Laufzeit irgendwo zwischen, in "/tmp" habe ich nichts gefunden?


Respekt vor der flexiblen Programmierung! Ich ziehe meinen Hut, und sage
:thumbs: DANKE! :thumbs:
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: Filme nach Größe sortieren

Beitrag von abgdf » 22. Okt 2019, 00:05

gm2601 hat geschrieben:
20. Okt 2019, 16:52

Code: Alles auswählen

Use of uninitialized value $timestrings[648] in concatenation (.) or string at Sort_film_2 line 157.
"/run/media/guenter/INTENSO_2/Dokus/Wirtschaft/Krupp-3_3.mpg.idx2"      60
Oh, das war ein Bug: Das Skript sucht nach ".mpg", aber es sollte nur am Ende danach suchen (also "Krupp-3_3.mpg"), nicht in der Mitte ("Krupp-3_3.mpg.idx2"). Ist ausgebessert.
gm2601 hat geschrieben:
20. Okt 2019, 16:52
Selbst im tiefsten Verzeichnis hat das Script "/run/media/guenter/INTENSO_2/Dokus/Geschichte/Steinerner_Zeuge.mpg" ausgegraben und insgesamt die korrekte Anzahl "Sorting 672 entries" beackert.
Ja, das ist cool. Ich hatte deshalb auch mal ein Skript veröffentlicht, daß das mit mp3s macht und die dann geshuffelt abspielt. Können wir mal gesondert drüber schreiben, wenn Dich das interessiert.
gm2601 hat geschrieben:
20. Okt 2019, 16:52
Speichert das Script Titel und Laufzeit irgendwo zwischen, in "/tmp" habe ich nichts gefunden?
Hmm, die Laufzeit wird ja in Sekunden und als lesbarer String mit ausgegeben, oder? Deshalb doch die Tabulatoren.
Wegen des Titels müßtest Du mal die Ausgabe von mediainfo für eine Film-Datei mit Titel posten. Ich kann das bei mir gerade nicht nachvollziehen, anscheinend haben meine Filmdateien keine Titel.
Du müßtest halt genau spezifizieren, wie Du die Ausgabe haben möchtest. Wenn ich weiß, was Du möchtest, kann ich das dann auch bauen. ;)

Ansonsten war mein Algorithmus, um die Sekunden zu bekommen, etwas komisch. Weil "mediainfo" mal "1h 25 min", mal "3s 45 ms" liefert. Hab' mir das jetzt anders überlegt und mache das jetzt so, daß ich den String selbst verändere, zu "1h25min0s0ms" einerseits, "0h0min3s45ms" andererseits. Neue Version:

Code: Alles auswählen

#!/usr/bin/perl

use warnings;
use strict;

# sort_films.pl
#
# Sorts films by duration.
# Depends on output of 'mediainfo'.
#
# (C) 2019, abgdf@gmx.net. Licence: GNU GPL version 2.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

use File::Find;
use Cwd;

my $directory = getcwd();

my @FILES = ();
my $NROFFILES = 0;
my @SUFS = qw(mpg avi mp4 mkv);

sub getFilenames {
    my $filename = $File::Find::name;
    my $i;
    for $i (@SUFS) {
        if ($filename =~ m/\.$i$/) {
            push(@FILES, $filename);
            $NROFFILES++;
            if ($NROFFILES % 10 == 0) {
                print "10 more filenames added to list.\n";
            }
        }
    }
}

sub printTimes {
    my $hours = shift;
    my $minutes = shift;
    my $seconds = shift;
    print "Hours: $hours\n";
    print "Minutes: $minutes\n";
    print "Seconds: $seconds\n\n";
}

sub getSortedIndices {
    my @a = @_;
    my @b = (0 .. $#a);
    my $i;
    my $u;
    my $temp;
    my $temp2;
    print "\nSorting ";
    print $#a + 1;
    print " entries.\n\n";
    for $i (0 .. $#a) {
        for $u (0 .. $#a) {
            if ($a[$u] < $a[$i]) {
                $temp = $a[$i];
                $a[$i] = $a[$u];
                $a[$u] = $temp;
                $temp2 = $b[$i];
                $b[$i] = $b[$u];
                $b[$u] = $temp2;
            }
        }
    }
    return @b;
}


sub getSeconds {
    my $filename = shift;
    my $tstr = shift;
    $tstr =~ s/ //g;
    my $prefix = "";
    if ($tstr !~ /h/) {
        $prefix = "0h";
    }
    if ($tstr !~ /min/) {
        $prefix .= "0min";
    }
    my $suffix = "";
    if ($tstr =~ /min$/) {
        $suffix = "0s0ms";
    }
    if ($tstr =~ /\ds$/) {
        $suffix = "0ms";
    }
    $tstr = "$prefix$tstr$suffix";
    $tstr =~ s/ms$//;
    $tstr =~ s/s/ /;
    $tstr =~ s/min/ /;
    $tstr =~ s/h/ /;
    my @time_ = split(/ /, $tstr);
    if ($#time_ != 3) {
        print "Warning: Incorrect timestring for file \"$filename\".\n";
    }
    my $seconds;
    $seconds = 3600 * $time_[0] + 60 * $time_[1] + $time_[2];
    return $seconds;
}

sub getDurations {
    my @seconds;
    my @timestrings;
    my @mediainfo;
    my $minfo;
    my $i;
    my @a;
    my $secs;
    my $tstr;
    my $count = 0;
    print "\nRunning 'mediainfo' on $NROFFILES files. Please wait.\n";
    for $i (@FILES) {
        @mediainfo = `mediainfo \"$i\" | grep Duration`;
        $count++;
        $minfo = shift(@mediainfo);
        chomp($minfo);
        @a = split(/: /, $minfo);
        $tstr = pop(@a);
        push(@timestrings, $tstr);
        $secs = getSeconds($i, $tstr);
        push(@seconds, $secs);
        if ($count % 10 == 0) {
            print "$count files checked.\n";
        }
    }
    my $r1 = \@timestrings;
    my $r2 = \@seconds;
    return ($r1, $r2);
}
print "\nRunning 'sort_films.pl'.";
print "Searching for files.\n";
find(\&getFilenames, $directory);
my @durations = getDurations();
my @timestrings = @{$durations[0]};
my @seconds = @{$durations[1]};
my @newIndices = getSortedIndices(@seconds);
my $i;

print "\nResult:\n";
print "\nFilms, sorted by length: Film, seconds, readable time\n\n";
for $i (0 .. $NROFFILES - 1) {
    print "\"$FILES[$newIndices[$i]]\"\t$seconds[$newIndices[$i]]\t$timestrings[$newIndices[$i]]\n";
}
print "\n";

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: Filme nach Größe sortieren

Beitrag von gm2601 » 22. Okt 2019, 13:44

abgdf hat geschrieben:Oh, das war ein Bug: Das Skript sucht nach ".mpg", aber es sollte nur am Ende danach suchen (also "Krupp-3_3.mpg"), nicht in der Mitte ("Krupp-3_3.mpg.idx2"). Ist ausgebessert.
Ein Bug der Deinen Anspruch störte, nicht meinen. ;)
abgdf hat geschrieben:Ja, das ist cool. Ich hatte deshalb auch mal ein Skript veröffentlicht, daß das mit mp3s macht und die dann geshuffelt abspielt. Können wir mal gesondert drüber schreiben, wenn Dich das interessiert.
Mit meiner mp3-Oldiesammlung habe ich mich auch schon mal herumgeschlagen, nun haben die files Nummern, der Rest ist in den Metadaten. Ich sehe für mich keinen Bedarf an einer Größensortierung.
Danke für das Angebot!
Hmm, die Laufzeit wird ja in Sekunden und als lesbarer String mit ausgegeben, oder? Deshalb doch die Tabulatoren.
Die tabs sind kein Problem, ich habe den output in ein File geleitet, alles was für mich nicht relevant ist entfernt und oocalc hat mir die Tabs in Reih und Glied gebracht. Für mich bereits perfekt! :thumbs:
Wegen des Titels müßtest Du mal die Ausgabe von mediainfo für eine Film-Datei mit Titel posten. Ich kann das bei mir gerade nicht nachvollziehen, anscheinend haben meine Filmdateien keine Titel.
Die Filmnamen sind identisch mit den Dateinamen und tauchen in "mediainfo" unter "Complete name" auf:

Code: Alles auswählen

mediainfo Krupp-3_3.mpg
General
Complete name                            : Krupp-3_3.mpg
Format                                   : MPEG-PS
File size                                : 1.65 GiB
Duration                                 : 1 h 27 min
......brauchst Du den Rest noch? .............
Ansonsten war mein Algorithmus, um die Sekunden zu bekommen, etwas komisch. Weil "mediainfo" mal "1h 25 min", mal "3s 45 ms" liefert. Hab' mir das jetzt anders überlegt und mache das jetzt so, daß ich den String selbst verändere, zu "1h25min0s0ms" einerseits, "0h0min3s45ms" andererseits. Neue Version:
...ist für mich perfekt und Millisekunden tauchen bei mir nicht auf. Neuer Output, drei Beispiele:

Code: Alles auswählen

"/run/media/guenter/INTENSO_2/Vom_Winde_verweht.mpg"    12660   3 h 31 min
"/run/media/guenter/INTENSO_2/Dokus/Wirtschaft/Krupp-3_3.mpg"   5220    1 h 27 min
"/run/media/guenter/INTENSO_2/Musik/5_Jealous_Guy.mpg"  247     4 min 7 s
Jealous_Guy als kürzester "Film" gehört eigentlich via Audacity als reine Mp3-Datei in die Oldiesammlung.
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: Filme nach Größe sortieren

Beitrag von abgdf » 22. Okt 2019, 23:22

Ok, gut. Wenn die Filmnamen den Dateinamen entsprechen (was bei mir auch so ist), dann müßte die letzte Version des Skripts ja reichen (weil der Filmname auch keine neue Information wäre).

Stimmt, ein mp3, das den Dateinamen ".mpg" hat, wird nicht als mp3 erkannt, sondern als Film behandelt. Man könnte dem Skript noch beibringen, das zu unterscheiden, indem man jede Datei erstmal mit dem "file"-Befehl (Shell) untersucht, oder mit dem Perl-Modul "File::Type". Das wäre möglich, ist aber nicht nötig, denke ich. Es würde das Skript sonst halt deutlich langsamer machen.

Zu "Jealous Guy" gibt's ja auch schöne Filmaufnahmen: :)
https://youtu.be/XV5z_btMbuQ?t=1219

Also, insgesamt müßte jetzt doch alles klar sein, oder?

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: Filme nach Größe sortieren

Beitrag von gm2601 » 23. Okt 2019, 12:38

abgdf hat geschrieben:
22. Okt 2019, 23:22
[...]". Das wäre möglich, ist aber nicht nötig, denke ich. Es würde das Skript sonst halt deutlich langsamer machen.
Du hast recht, das ist wirklich nicht nötig, die Datei gehört eigentlich gar nicht in mein Filmarchiv und meine betagte CPU ist/war mit über 600 Filmen auch so schon eine Weile beschäftigt.
Zu "Jealous Guy" gibt's ja auch schöne Filmaufnahmen: :)
https://youtu.be/XV5z_btMbuQ?t=1219
Danke, kannte ich, denn es gibt wenig, das ich von den vier "Pilzköpfen" nicht kenne.
Also, insgesamt müßte jetzt doch alles klar sein, oder?
:thumbs: Ich fühle mich bestens bedient, danke nochmal.
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: [gelöst] Filme nach Größe sortieren

Beitrag von abgdf » 23. Okt 2019, 15:59

Gern geschehen. :)

Benutzeravatar
gm2601
Advanced Hacker
Advanced Hacker
Beiträge: 951
Registriert: 4. Dez 2005, 11:53

Re: [gelöst] Filme nach Größe sortieren

Beitrag von gm2601 » 29. Nov 2019, 13:27

Nachtrag:

Hallo abgdf,

die Liste hat sich über Erwarten bewährt. :thumbs:
Seit ich die Liste aufs Handy übertragen habe, können wir gespeicherte Filme und Dokus prima auf unsere normale Zeit zu Bett zu gehen einstellen, wenn das normale Programm, wie so oft, unseren Geschmack nicht trifft.
Viele Grüße
gm2601
:wink: Die Mehrheit der Menschheit versteht von Linux noch weniger als ich :wink:

abgdf
Guru
Guru
Beiträge: 3227
Registriert: 13. Apr 2004, 21:15

Re: [gelöst] Filme nach Größe sortieren

Beitrag von abgdf » 29. Nov 2019, 15:06

Ah, sehr gut. Freut mich! :)

Antworten