|
Rockbox mail archiveSubject: Re: podcast synchronization scriptRe: podcast synchronization script
From: Jacob Rau <jacob.rau_at_gmail.com>
Date: Wed, 2 Aug 2006 08:39:33 -0400 I think that in a perfect world, the aggregator would deal with this. I'm working on an aggregator myself in Visual Basic 6, but at this moment I'm only working on the XML-parsing module, as this is, quite obviously, the heart of an aggregator. That and the download engine...I will keep working on this on and off, but I don't honestly know when (or if) it will be usable, as it's a hobby project. Shortly, I will create a project on Sourceforge.net if I make any huge progress on it. It looks like your script would be pretty useful, but I use Windows still and it looks like your script would require major surgery to get it to run under XP. The feature that I covet is the recursive directory function...I still don't have a good way of doing this. I'll have to google around and see what I get. Thanks for GPL'ing it :-) JBot On 8/1/06, Matthew Caron <matt_at_mattcaron.net> wrote: > > Attached is a short perl script that, while still a little rough around > the edges, allows you to synchronize a given directory hierarchy of > podcasts with another directory (such as a USB Mass Storage Device type > player), while maintaining a history of what has been put there in the > past. License is GPLv2 and feedback is welcome. > > Assume: > (1) The user gets podcasts via a podcast aggregator > (2) These podcasts are put in a directory $source_dir (in the script, > edit and change as necessary) > (3) The user wants to listen to them on his player, and deletes them > when done (either via player or computer. This script doesn't care, > because it doesn't assume anything about the state of the player) > (4) The user does not want already uploaded podcasts uploaded again (as > would happen with conventional sync tools when deleted on the target) > > Logic: > - Scan the log file ($source_dir/sync_podcasts.log) and get the stuff > that has been uploaded. Read it into a hash for fast access. > - Recurse through all files and subdirectories below $source_dir > - If the target directory isn't there, make it. > - If a file is not in the log file, copy it to the player and add it to > the log file. > > Notes: > - The first time the script is run, it assumes that you have nothing > that needs to go on the player and merely generates the log file from > the existing directory structure. To circumvent this behavior, create an > empty sync_podcast.log file in the directory to which $source_dir points. > > TODO: > - Generate .m3u playlist for each directory in $target_dir > > Known bugs / Issues: > - Untested on anything other than Ubuntu Linux. Should work on most > Linux distros. Your mileage might vary on anything else. > > -- > -------------------------------------------------------------------- > PGP Key: http://www.mattcaron.net/pgp_key.txt > ~~ Matt Caron ~~ > > > > #!/usr/bin/perl -w > > #################################################### > # > # sync_podcast - synchronize podcasts to USB Mass Storage Device type > # players > # Copyright (C) 2006 Matthew Caron <matt_at_mattcaron.net> > # > # This program is free software; you can redistribute it and/or modify > # it under the terms of the GNU General Public License, version 2, as > # published by the Free Software Foundation. > # > # 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. > # > # Full license at: http://www.fsf.org/licensing/licenses/info/GPLv2.html > # > #################################################### > > use strict; > use File::Find; > use File::Path; > use File::Copy; > > ## Constants > my $source_dir = "/pub/matt/podcasts"; > my $podcast_log_file = "sync_podcasts.log"; > my $target_dir = "/media/ipod/podcasts"; > my $initialize = 0; > > ## Derived constants > my $podcast_log = $source_dir . "/" . $podcast_log_file; > > my %uploaded_files; > > # Read in logfile and store file path and name in hash. > if(-e $podcast_log) > { > open(LOGFILE, $podcast_log); > > while(<LOGFILE>) > { > chomp($_); > $uploaded_files{$_} = 1; > } > > close(LOGFILE); > } > else > { > # logfile doesn't exist - assume initialization mode > $initialize = 1; > > print "Initializing logile...\n"; > } > > # Recurse through directory and find each file there > find(\©_stuff, ($source_dir)); > > # Recurse through and build playlists for each directory > # find(\&build_playlists, ($source_dir)); > # cd (dir) - \ls `pwd`/* > dir.m3u > # Spaces are a problem... > # Make sure to remove playlist ahead of time > > sub copy_stuff > { > # file name > my $filename = $_; > > # source directory > my $dirname = $File::Find::dir; > # source dir + file name > my $fullpath = $File::Find::name; > > # If what we got isn't a directory, do something > # And it's not the log file > if(!-d $fullpath && $filename ne $podcast_log_file) > { > # get name of dir in isolation > my $source_dirname = $dirname; > $source_dirname =~ s/$source_dir//; > > # target dir > my $destination_path = $target_dir . "/" . $source_dirname; > # target dir + file name > my $destination_path_file = $destination_path . "/" . $filename; > > # make sure this hasn't been uploaded... > if(!defined $uploaded_files{$fullpath}) > { > if(!$initialize) > { > > # Put file on the music device, maintaining directory > # structure.. > # make directory if it doesn't exist > if(!-d $destination_path) > { > print "\n\nMaking directory $destination_path...\n\n"; > > mkpath($destination_path) || > die "Cannot mkpath $destination_path: $!"; > } > > print "$fullpath => $destination_path_file\n"; > > # copy file to that directory > copy($fullpath, $destination_path_file) || > die "Cannot copy $fullpath to $destination_path_file: > $!"; > > } > > # Log that you did it > open(LOGFILE, ">>$podcast_log"); > > print LOGFILE $fullpath . "\n"; > > close(LOGFILE); > > } > } # else, ignore directory > } > > > > > Received on 2006-08-02 Page template was last modified "Tue Sep 7 00:00:02 2021" The Rockbox Crew -- Privacy Policy |