Actions

Podcast Synch Batch File: Difference between revisions

From Mike Beane's Blog

Line 33: Line 33:
=Perl Script=
=Perl Script=


Next time I look at this I will most likely remove the MP3:: info and routines during cleanupThe script has gotten very messy while playing with this.
Removed the MP3:: info/tag routines and also the Win32 referencesThat should make it cross platform.
 
<pre>use File::Copy;
use Win32::Console::ANSI;
use Term::ANSIColor;
use MP3::Info;
use MP3::Tag;


<pre>#!/usr/local/bin/perl
use warnings;
use warnings;
use strict;
use strict;


use Cwd;
use File::Copy;     #http://perldoc.perl.org/File/Copy.html
my $dir = cwd;
use Cwd;           #http://perldoc.perl.org/Cwd.html
$dir =~ s/\///g;
 
print color 'bold blue on_white';
#################################################################
print "Portable Player Drive is $dir\n";
#######################USER VARIABLES############################
print color 'reset';
#################################################################


my $podcastsource="C:/Documents and Settings/Mike/My Documents/My Music/Podcasts";
my $podcastsource="C:/Documents and Settings/Mike/My Documents/My Music/Podcasts";
#my $podcastsource="d:/music/Ipod/Podcasts";
my $LOGFILE_IN="$dir/PLAYLISTS/On The Go.plp";


my $podcastdest="$dir/MUSIC/Podcasts";
#################################################################
 
#################################################################
########################System Variables ########################
#################################################################
 
my $dircontents=();
my $dircontents=();
my $destdir=();
my $destdir=();
my $checkmp3tag=();
my $checkmp3name=();
my @newfile=();
my @newfile=();
my $newfile=();
my $newfile=();
Line 69: Line 65:
my $directory2make=();
my $directory2make=();
my @directory2make=();
my @directory2make=();
my $tag=();


print color 'bold blue on_white';
###########################################################################
# Run the script from the portable and it will determine its current path #
###########################################################################
my $dir = cwd;
$dir =~ s/\///g;
my $LOGFILE_IN="$dir/PLAYLISTS/On The Go.plp";
my $podcastdest="$dir/MUSIC/Podcasts";
 
#################################################################
######################## Start Processing #######################
#################################################################
 
print "#################################################################\n";
print "Portable Player Drive is $dir\n";
print "On The Go.plp set to $LOGFILE_IN\n";
print "Music directory is at $podcastdest\n";
print "#################################################################\n\n";
print "Reading On The Go.plp for files to remove from portable:\n";
print "Reading On The Go.plp for files to remove from portable:\n";
print color 'reset';
&OnTheGo;
&OnTheGo;
 
print "#################################################################\n\n";
print color 'bold blue on_white';
print  "Checking source files to move to destination:\n";
print  "Checking source files to move to destination:\n";
print color 'reset';
&movefiles($podcastsource); #Check what is in the source and not in the dest - copy to dest
&movefiles($podcastsource); #Check what is in the source and not in the dest - copy to dest
 
print "#################################################################\n\n";
print color 'bold blue on_white';
print  "Checking for files removed from source:\n";
print  "Checking for files removed from source:\n";
print color 'reset';
&smash($podcastdest);  #Check what is in the dest and not in the source - del from dest
&smash($podcastdest);  #Check what is in the dest and not in the source - del from dest
print "#################################################################\n\n";
print "Done\n";


#################################################################
######################### End Processing ########################
#################################################################


sub johncdvorak
#################################################################
    {
######################### Subroutines ########################
    #This routine is dedicated to John C Dvorak by way of CrankyGeeks
#################################################################
    my $file=$checkmp3tag;
    my $mp3 = new MP3::Info $file;
 
        my $newtag=();
        if ($checkmp3name =~ m/(.*).mp3/)
        {
        $newtag=$1;
       
        #Strip out numbers.  If we're lucky
        #we'll have a nice name for the tag w/o
        #show/ep numbers
       
        $newtag =~ s/[0-9]//g; 
        }           
 
            $mp3 = new MP3::Info $file;
        #printf "\n\nChecked ID3v1 tags for $file:\nTitle: %s \nArtist: %s \nGenre: %s \nAlbum: %s \n\n",
                #$mp3->title, $mp3->artist, $mp3->genre, $mp3->album;
 
            my $title=$mp3->title;
            my $artist=$mp3->artist;
            my $album=$mp3->album;
 
        if (exists $mp3->{ID3v2}) {$mp3->{ID3v2}->remove_tag;}
        if (exists $mp3->{ID3v1}) {$mp3->{ID3v1}->remove_tag;}
 
            $tag->{TITLE} = $title;
            $tag->{ARTIST} = $newtag;
            $tag->{ALBUM} = $newtag;
            $tag->{GENRE} = 'Podcast';
            set_mp3tag($file, $tag) or warn "$!";
       
            $mp3 = new MP3::Info $file;
           
                       
        #printf "\n\nChecked ID3v1 tags for $file:\nTitle: %s \nArtist: %s \nGenre: %s \nAlbum: %s \n\n",
                #$mp3->title, $mp3->artist, $mp3->genre, $mp3->album;
        #ref: FILE, TITLE, ARTIST, ALBUM, YEAR, COMMENT, GENRE
    }
 


sub OnTheGo
sub OnTheGo
Line 136: Line 107:
         {
         {
         open LOGFILE_IN, $LOGFILE_IN or warn "Cannot open $LOGFILE_IN for read :$!";
         open LOGFILE_IN, $LOGFILE_IN or warn "Cannot open $LOGFILE_IN for read :$!";
   
        binmode(LOGFILE_IN);    # I need to learn more about binmode
         while (<LOGFILE_IN>)  
         while (<LOGFILE_IN>)  
             {
             {
             my $tmp=$_;
             my $tmp=$_;         #Strip out characters and make data usable
             $tmp =~ s/\0//g;
             $tmp =~ s/\0//g;
             $tmp =~ s/\015//g;
             $tmp =~ s/\015//g;
Line 145: Line 116:
             $tmp =~ s/HARP, /$dir\//;
             $tmp =~ s/HARP, /$dir\//;
             $tmp =~ s/\\/\//g;
             $tmp =~ s/\\/\//g;
             #print "$tmp\n";
              
             if ($tmp =~ /$dir/)
             if ($tmp =~ /$dir/) #Find out if the file exists and delete both copies
                 {
                 {
                 if ($tmp =~ m/($podcastdest)\/(.+)/)
                 if ($tmp =~ m/($podcastdest)\/(.+)/)
Line 154: Line 125:
                         {
                         {
                         $file="$podcastsource/$file";
                         $file="$podcastsource/$file";
                        print color 'bold yellow on_magenta';                   
                         unlink ($file) or warn "Cannot del $file: $!";
                         unlink ($file) or warn "Cannot del $file: $!";
                         print "Deleted $file\n";                      
                         print "Deleted $file\n";   #local hard drive                   
                         unlink ($tmp) or warn "Cannot del $tmp: $!";  
                         unlink ($tmp) or warn "Cannot del $tmp: $!";  
                         print "Deleted $tmp\n";
                         print "Deleted $tmp\n";     #Sansa
                        print color 'reset';
                         }
                         }
                     }
                     }
Line 169: Line 138:
sub makedest
sub makedest
     {
     {         #Make directories
     my $destdirectory=$destdir;
     my $destdirectory=$destdir;
     @directory2make = split(/\//, $destdirectory);
     @directory2make = split(/\//, $destdirectory);
Line 179: Line 148:
         {
         {
         $directory1tmp="$directory1tmp\/$directory2make";
         $directory1tmp="$directory1tmp\/$directory2make";
        #print "$directory1tmp\n";
         $directorytmp="$dir$directory1tmp";
         $directorytmp="$dir$directory1tmp";
        #print "$directory1tmp\n";
        #print "$directorytmp\n";
         if(!-e $directorytmp)
         if(!-e $directorytmp)
             {
             {
            print color 'bold yellow on_magenta';                   
             print "Did not find $directorytmp\n";                     
             print "Did not find $directorytmp\n";                     
             mkdir ("$directorytmp") or die "Cannot make $directorytmp :$!";     #incoming logs go here
             mkdir ("$directorytmp") or die "Cannot make $directorytmp :$!";     #incoming logs go here
             print "Created $directorytmp\n";     
             print "Created $directorytmp\n";     
            print color 'reset';
             }
             }
         } # end for each
         } # end for each
Line 195: Line 159:


sub movefiles  
sub movefiles  
     {
     {          
     my $dir = shift;
     my $dir = shift;
      
      
Line 201: Line 165:
     my @contents =
     my @contents =
     map "$dir/$_",
     map "$dir/$_",
    #sort grep !/\.mp3$/ || /\.jpg$/,
     sort grep !/^\.\.?$/,
     sort grep !/^\.\.?$/,
     readdir DIR;
     readdir DIR;
Line 219: Line 182:
     {
     {
     opendir(DIR, "$dircontents") or die "Cannot open $dircontents to read: $!";
     opendir(DIR, "$dircontents") or die "Cannot open $dircontents to read: $!";
    #@newfiles = grep(/\.mp3$/ || /\.jpg$/ ,readdir(DIR));
     @newfiles = grep(/\.mp3$/ ,readdir(DIR));
     @newfiles = grep(/\.mp3$/ ,readdir(DIR));
     closedir(DIR);
     closedir(DIR);
Line 237: Line 199:
                 my $filetobecopied = "$podcastsource/$2/$newfile";
                 my $filetobecopied = "$podcastsource/$2/$newfile";
                 my $oldfile = "$podcastdest/$2/$newfile";
                 my $oldfile = "$podcastdest/$2/$newfile";
                print color 'bold yellow on_magenta';                   
                 print "Copying $newfile\n";
                 print "Copying $newfile\n";
                print color 'reset';
                 copy($filetobecopied, $oldfile) or die "File cannot be copied.";     
                 copy($filetobecopied, $oldfile) or die "File cannot be copied.";     
                if ($newfile =~ "mp3")
                    {
                    $checkmp3tag=$oldfile;
                    $checkmp3name=$newfile;
                    &johncdvorak($checkmp3tag,$checkmp3name);
                    }
                 }
                 }
             }
             }
Line 254: Line 208:




sub smash  
sub smash # Hulk Smash. Hulk destroy directory (calls destroy files also)
     {
     {
     my $dir = shift;
     my $dir = shift;
     opendir DIR, $dir or return;
     opendir DIR, $dir or return;
Line 287: Line 241:
                 my $del="$podcastdest/$2/$file";
                 my $del="$podcastdest/$2/$file";
                 unlink ($del);       
                 unlink ($del);       
                print color 'bold yellow on_magenta';                   
                 print "$del\n";                 
                 print "$del\n";                 
                print color 'reset';
                 }
                 }
             }
             }
Line 303: Line 255:
             close LOGFILE_IN or warn "Cannot CLOSE $LOGFILE_IN: $!";;
             close LOGFILE_IN or warn "Cannot CLOSE $LOGFILE_IN: $!";;
             unlink $LOGFILE_IN or warn "Cannot del $LOGFILE_IN: $!"; #remove the list
             unlink $LOGFILE_IN or warn "Cannot del $LOGFILE_IN: $!"; #remove the list
            print color 'bold yellow on_magenta';                   
             print "Cleared $LOGFILE_IN\n";
             print "Cleared $LOGFILE_IN\n";
            print color 'reset';
             }
             }
         }   
         }   

Revision as of 10:56, 7 December 2008

Not finding a good way to manage my podcasts on my Sansa e250 and I'm already manually dumping files from iTunes anyway (my choice).

For the meantime, here is synch.bat to del all files in the Podcasts directory on the Sansa and then xcopy everything in the iTunes Podcasts directory. It's not quick, but it works.

echo off
cls
del "g:\music\podcasts\*" /S /Q
xcopy "D:\music\Ipod\Podcasts\*.mp3" /S "g:\music\Podcasts\"


Next step I plan to write something that checks:

  • Cleanup the code
  • Make a playlist (by directory or by group?)
  • Does file exist in both places - don't copy
  • Does file exist in dest and not in source - del dest
  • Does file exist in source and not in dest - copy source
  • Implement create directory if not exist routine
  • Read the Sansa On The Go Playlist and delete files that are found
  • Make dest drive setting value
  • Check ID3 tag and set if blank - see &johncdvorak

Autoplay Handler

Added an AutoPlay handler (directions here). Now when connected, synchronization is possible from the popup window.

EventAutoHandler sansa.jpg


Script Test

File:SubDir.jpg

Perl Script

Removed the MP3:: info/tag routines and also the Win32 references. That should make it cross platform.

#!/usr/local/bin/perl
use warnings;
use strict;

use File::Copy;     #http://perldoc.perl.org/File/Copy.html
use Cwd;            #http://perldoc.perl.org/Cwd.html

#################################################################
#######################USER VARIABLES############################
#################################################################

my $podcastsource="C:/Documents and Settings/Mike/My Documents/My Music/Podcasts";

#################################################################

#################################################################
########################System Variables ########################
#################################################################

my $dircontents=();
my $destdir=();
my @newfile=();
my $newfile=();
my @newfiles=();
my @files=();
my $file=();
my $directorytmp=();
my $directory1tmp=();
my $directory2make=();
my @directory2make=();

###########################################################################
# Run the script from the portable and it will determine its current path #
###########################################################################
my $dir = cwd;
$dir =~ s/\///g;
my $LOGFILE_IN="$dir/PLAYLISTS/On The Go.plp";
my $podcastdest="$dir/MUSIC/Podcasts";

#################################################################
######################## Start Processing #######################
#################################################################

print "#################################################################\n";
print "Portable Player Drive is $dir\n";
print "On The Go.plp set to $LOGFILE_IN\n";
print "Music directory is at $podcastdest\n";
print "#################################################################\n\n";
print "Reading On The Go.plp for files to remove from portable:\n";
&OnTheGo;
print "#################################################################\n\n";
print  "Checking source files to move to destination:\n";
&movefiles($podcastsource); #Check what is in the source and not in the dest - copy to dest
print "#################################################################\n\n";
print  "Checking for files removed from source:\n";
&smash($podcastdest);  #Check what is in the dest and not in the source - del from dest
print "#################################################################\n\n";
print "Done\n";

#################################################################
######################### End Processing ########################
#################################################################

#################################################################
######################### Subroutines ########################
#################################################################

sub OnTheGo
    {
    if(-e "$LOGFILE_IN")
        {
        open LOGFILE_IN, $LOGFILE_IN or warn "Cannot open $LOGFILE_IN for read :$!";
        binmode(LOGFILE_IN);    # I need to learn more about binmode
        while (<LOGFILE_IN>) 
            {
            my $tmp=$_;         #Strip out characters and make data usable
            $tmp =~ s/\0//g;
            $tmp =~ s/\015//g;
            $tmp =~ s/\012//g;
            $tmp =~ s/HARP, /$dir\//;
            $tmp =~ s/\\/\//g;
            
            if ($tmp =~ /$dir/) #Find out if the file exists and delete both copies
                {
                if ($tmp =~ m/($podcastdest)\/(.+)/)
                    {
                    my $file=$2;
                    if(-e "$podcastsource/$file")
                        {
                        $file="$podcastsource/$file";
                        unlink ($file) or warn "Cannot del $file: $!";
                        print "Deleted $file\n";    #local hard drive                    
                        unlink ($tmp) or warn "Cannot del $tmp: $!"; 
                        print "Deleted $tmp\n";     #Sansa
                        }
                    }
                }
            }
        &deleteplaylist;
        }
    }
	
sub makedest
    {	        #Make directories
    my $destdirectory=$destdir;
    @directory2make = split(/\//, $destdirectory);
    shift (@directory2make); #drop the first
    $directorytmp="";
    $directory1tmp="";

    foreach $directory2make (@directory2make)
        {
        $directory1tmp="$directory1tmp\/$directory2make";
        $directorytmp="$dir$directory1tmp";
        if(!-e $directorytmp)
            {
            print "Did not find $directorytmp\n";                    
            mkdir ("$directorytmp") or die "Cannot make $directorytmp :$!";		    #incoming logs go here
            print "Created $directorytmp\n";    
            }
        } # end for each
	} 

sub movefiles 
    {           
    my $dir = shift;
    
    opendir DIR, $dir or return;
    my @contents =
    map "$dir/$_",
    sort grep !/^\.\.?$/,
    readdir DIR;
    closedir DIR;
    
    foreach (@contents) 
        {
        next unless !-l && -d;
        &movefiles($_);
        $dircontents=$_;
        &createcontents($dircontents);
        rmdir $_;
      }
    }
    
sub createcontents
    {
    opendir(DIR, "$dircontents") or die "Cannot open $dircontents to read: $!";
    @newfiles = grep(/\.mp3$/ ,readdir(DIR));
    closedir(DIR);
    foreach $newfile (@newfiles) 
        {
        if ($dircontents =~ m/($podcastsource)\/(.+)/)
            {
            $destdir="$podcastdest/$2";
            my $testdir="$destdir/$newfile";
            
            if(!-e $testdir)
                {
               if(!-e $destdir)  #check to see if dest exists, if not, create the dir   
                   {
                   &makedest($destdir);
                   }
                my $filetobecopied = "$podcastsource/$2/$newfile";
                my $oldfile = "$podcastdest/$2/$newfile";
                print "Copying $newfile\n";
                copy($filetobecopied, $oldfile) or die "File cannot be copied.";    
                }
            }
        }
    }



sub smash # Hulk Smash. Hulk destroy directory (calls destroy files also)
    {  
    my $dir = shift;
    opendir DIR, $dir or return;
    my @contents =
    map "$dir/$_",
    sort grep !/^\.\.?$/,
    readdir DIR;
    closedir DIR;
    
    foreach (@contents) 
        {
        next unless !-l && -d;
        &smash($_);
        $dircontents=$_;
        &destroycontents($dircontents);
        rmdir $_;
        }
    }
    
sub destroycontents
    {
    opendir(DIR, "$dircontents") or die "Cannot open $dircontents to read: $!";
    @files = grep(/\.mp3$/,readdir(DIR));
    closedir(DIR);
    foreach $file (@files) 
        {
        if ($dircontents =~ m/($podcastdest)\/(.+)/)
            {
            if(!-e "$podcastsource/$2/$file")
                {
                my $del="$podcastdest/$2/$file";
                unlink ($del);      
                print "$del\n";                
                }
            }
        }
    }

sub deleteplaylist
    {
    if(-e "$LOGFILE_IN")
        {
        if(-w $LOGFILE_IN)
            {
            close LOGFILE_IN or warn "Cannot CLOSE $LOGFILE_IN: $!";;
            unlink $LOGFILE_IN or warn "Cannot del $LOGFILE_IN: $!"; #remove the list
            print "Cleared $LOGFILE_IN\n";
            }
        }   
    }