#!/usr/bin/perl -w ## ## $HeadURL: file:///home/svn/repos/web/kevinathey/v01/software/macFlac $ ## $Revision: 71 $ ## $Date: 2007-08-12 07:41:49 -0700 (Sun, 12 Aug 2007) $ ## $Author: kathey $ ## use strict; use CDDB_get; use XML::Simple; use Data::Dumper; # stolen from CDDB_get: start sub cddb_sum { my $n=shift; my $ret=0; while ($n > 0) { $ret += ($n % 10); $n = int $n / 10; } return $ret; } sub cddb_discid { my $total=shift; my $toc=shift; my $i=0; my $t=0; my $n=0; while ($i < $total) { $n = $n + cddb_sum(($toc->[$i]->{min} * 60) + $toc->[$i]->{sec}); $i++; } $t = (($toc->[$total]->{min} * 60) + $toc->[$total]->{sec}) - (($toc->[0]->{min} * 60) + $toc->[0]->{sec}); return (($n % 0xff) << 24 | $t << 8 | $total); } # stolen from CDDB_get: end my $cdRequest = 0; my $cd; while ( 1 ) { my $mount = `mount`; #print "mount=$mount\n"; my @mount = split( /\n/, $mount ); #print "mount=" . @mount . "\n"; my @CDdir = grep { /read-only/ } @mount; print "CDdir=@CDdir\n"; if ( scalar( @CDdir ) == 0 ) { if ( $cdRequest == 0 ) { print "Please insert CD...\n"; $cdRequest = 1; } sleep 5; next; } while ( 1 ) { sleep 5; $mount = `mount`; #print "mount=$mount\n"; @mount = split( /\n/, $mount ); #print "mount=" . @mount . "\n"; @CDdir = grep { /read-only/ } @mount; $cd = $CDdir[0]; $cd =~ s/\ \(local.*$//; $cd =~ s/^\S+\son\s//; last if ( -e $cd . "/.TOC.plist" ); } print "rip away: $cd\n"; my $TOC = XML::Simple::XMLin( $cd . "/.TOC.plist" ); print Dumper( $TOC ); my @toc = (); my $totalEnt = $TOC->{dict}->{array}->{dict}->{integer}->[1]; print "totalEnt=$totalEnt\n"; for ( my $ent = 0; $ent < $totalEnt; $ent++ ) { my %cdent=(); $cdent{frames} = $TOC->{dict}->{array}->{dict}->{array}->{dict}->[$ent]->{integer}->[2]; print "cdent{frames}=$cdent{frames}\n"; $cdent{min} = int( ($cdent{frames} / 75) / 60 ); print "cdent{min}=$cdent{min}\n"; $cdent{sec} = ($cdent{frames} / 75) % 60; print "cdent{sec}=$cdent{sec}\n"; $cdent{frame} = $cdent{frames} - (int( $cdent{frames} / 75 ) * 75); print "cdent{frame}=$cdent{frame}\n"; $cdent{data} = defined( $TOC->{dict}->{array}->{dict}->{array}->{dict}->[$ent]->{true} ) ? 1 : 0; push( @toc, \%cdent ); } # add the ending mark my %cdent=(); $cdent{frames} = $TOC->{dict}->{array}->{dict}->{integer}->[2]; print "cdent{frames}=$cdent{frames}\n"; $cdent{min} = int( ($cdent{frames} / 75) / 60 ); print "cdent{min}=$cdent{min}\n"; $cdent{sec} = ($cdent{frames} / 75) % 60; print "cdent{sec}=$cdent{sec}\n"; $cdent{frame} = $cdent{frames} - (int( $cdent{frames} / 75 ) * 75); print "cdent{frame}=$cdent{frame}\n"; $cdent{data} = 0; push( @toc, \%cdent ); my $total = $#toc; my $id = cddb_discid( $total, \@toc ); printf "id=$id (%08x)\n", $id; my %cd = CDDB_get::get_cddb( {}, [$id, $total, \@toc] ); print "artist: $cd{artist}\n"; print "title: $cd{title}\n"; print "category: $cd{cat}\n"; print "genre: $cd{genre}\n"; print "year: $cd{year}\n"; print "cddbid: $cd{id}\n"; print "trackno: $cd{tno}\n"; my $n=1; foreach my $i ( @{$cd{track}} ) { print "track $n: $i\n"; $n++; } my $outputDir = $ENV{HOME} . "/cdrip/" . $cd{artist} . "/" . $cd{title}; `mkdir -p \"$outputDir\"`; # load all the files in the directory, so we can quickly pick them up later opendir( CD, $cd ) || die "Failed to open CD: $cd"; my @fileNames = grep { /^\d+\ / } readdir( CD ); closedir( CD ); $n = 1; foreach my $trackTitle ( @{$cd{track}} ) { # fix up some of the names if there are problems $trackTitle =~ s?/?-?g; my $fileName = (grep{ /^$n\ / } @fileNames)[0]; $fileName =~ s/"/\\"/g; $trackTitle =~ s/"/\\"/g; my $cmd = "flac"; $cmd .= " --endian=little --sign=signed --channels=2 --sample-rate=44100 --bps=16 --skip=20 --verify"; $cmd .= " --no-silent"; $cmd .= " --force"; $cmd .= " --force-raw-format"; $cmd .= " --tag=\"TITLE=" . $trackTitle . "\""; $cmd .= " --tag=\"ARTIST=" . $cd{artist} . "\""; $cmd .= " --tag=\"ALBUM=" . $cd{title} . "\""; $cmd .= " --tag=\"DATE=" . $cd{year} . "\""; $cmd .= " --tag=\"TRACKNUMBER=" . $n . "\""; $cmd .= " --tag=\"GENRE=" . $cd{genre} . "\""; $cmd .= " --tag=\"CATEGORY=" . $cd{cat} . "\""; $cmd .= " --tag=\"CDID=" . $cd{id} . "\""; $cmd .= " --output-name=\"$outputDir/" . sprintf( "%02d - %s.flac", $n, $trackTitle ) . "\""; $cmd .= " \"" . $cd . "/" . $fileName . "\""; print $cmd . "\n"; #system( $cmd ); `$cmd`; $n++; } $cdRequest = 0; print "eject: $cd\n"; `diskutil eject \"$cd\"`; } ## #!/bin/bash ## ## outputDir=${HOME}/cdrip ## ## cdrequest=0 ## while : ## do ## CDdir=`mount | grep read-only | perl -ne '$_ =~ s/\ \(.*$//; $_ =~ s/^\S+\son\s//;print;'` ## echo CDdir=$CDdir ## if [ -z "$CDdir" ] ## then ## if [ $cdrequest -eq 0 ] ## then ## echo "Please insert CD..." ## cdrequest=1 ## fi ## sleep 5; ## else ## echo "rip away" ## ## for file in "$CDdir"/[1-9]\ *.aiff "$CDdir"/[1-9]?\ *.aiff ## do ## if [ -r "$file" ] ## then ## flac \ ## --endian=little \ ## --sign=signed \ ## --channels=2 \ ## --sample-rate=44100 \ ## --bps=16 \ ## --skip=20 \ ## --verify \ ## --output-name="$outputDir"/"$(basename "$file" .aiff).flac" \ ## "$file" ## else ## echo "$file" is not readable. ## fi ## done ## ## ## cdrequest=0 ## diskutil eject "$CDdir" ## fi ## ## ## ## done ## #!/bin/sh ## # ## # flacit - rip a cd to flac format ## # ## if [ "$1" ] ## then ## for file in "$1"/[1-9]\ *.aiff ## do ## if [ -e "$file" ] ## then ## flac \ ## --endian=little \ ## --sign=signed \ ## --channels=2 \ ## --sample-rate=44100 \ ## --bps=16 \ ## --skip=20 \ ## --output-name="0$(basename "$file" .aiff).flac" \ ## "$file" ## else ## echo >&2 "No appropriate files exist in directory: "$1"" ## exit 1 ## fi ## done ## for file in "$1"/[1-9][0-9]\ *.aiff ## do ## if [ -e "$file" ] ## then ## flac \ ## --endian=little \ ## --sign=signed \ ## --channels=2 \ ## --sample-rate=44100 \ ## --bps=16 \ ## --skip=20 \ ## --output-name="$(basename "$file" .aiff).flac" \ ## "$file" ## fi ## done ## else ## echo >&2 "Usage: "$(basename "$0")" /path/to/cd" ## exit 1 ## fi