#! /usr/bin/perl -w # # This file is part of DisOrder # Copyright (C) 2006 Richard Kettlewell # # 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 3 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 . # use strict; my %rename = (); my $bad = 0; for my $path (@ARGV) { local $_ = `ogginfo \Q$path\E`; my ($title, $number); if(/title=(.*)/) { $title = $1; } if(/tracknumber=(\d+)/) { $number = $1; } if(!defined $title || !defined $number) { print STDERR "ERROR: cannot find details for $path\n"; ++$bad; next; } $rename{$path} = sprintf("%02d:%s.ogg", $number, $title); } exit 1 if $bad; while(scalar %rename) { my $worked = 0; while(my ($f, $t) = each %rename) { if($f eq $t) { delete $rename{$f}; $worked = 1; } elsif(link($f, $t)) { unlink($f); delete $rename{$f}; print "$f -> $t\n"; $worked = 1; } else { print "deferring $f -> $t\n"; } } die "stuck in a loop!\n" if !$worked; }