Skip to content

Instantly share code, notes, and snippets.

@bradk
Forked from wilkie/episode_renamer.pl
Created November 18, 2010 23:53
Show Gist options
  • Select an option

  • Save bradk/705909 to your computer and use it in GitHub Desktop.

Select an option

Save bradk/705909 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use LWP::Simple;
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use HTML::LinkExtor;
use HTML::Entities;
use Cwd;
use Roman;
# D:/shows/The Office/Season 3"
my $curdir = getcwd();
$curdir =~ /\/([^\/]+)\/(?:Season|Series)\s([^\/]+$)/;
my $showtitle = $1;
my $season = $2;
$showtitle =~ s/\bthe\b//gi;
$showtitle =~ s/\s+//g;
$showtitle =~ s/\(/_/g;
$showtitle =~ s/\)//g;
$showtitle =~ s/\'//g;
my $URL = "http://epguides.com/".$showtitle."/";
my $dirtarget = $curdir . "/";
#mode = 0 print
#mode = 1 rename files
my $mode = 0;
if ($#ARGV + 1 >= 1)
{
$mode = $ARGV[0];
if ($mode > 1)
{
$mode = 0;
}
}
my $browser = LWP::UserAgent->new();
$browser->timeout(10);
my $request = HTTP::Request->new(GET => $URL);
my $response = $browser->request($request);
if ($response->is_error()) {printf "%s\n", $response->status_line;}
my $contents = $response->content();
my @acontents = split('\n',$contents);
my @episodes = grep(/\b$season-\s*\d+\b/,@acontents);
my @epnames;
my @filenames;
foreach (@episodes)
{
#if ($_ =~ />([^>]+)<\/a>\s*$/)
if ($_ =~ />([^>]+)<\/a>/)
{
my $epname = $1;
my $idx = $_;
$idx =~ /\b$season-\s*(\d+)\b/;
$idx = $1;
$epname = decode_entities($epname);
$epnames[$idx-1] = $epname;
}
}
opendir(IMD, $dirtarget) || die("Cannot open directory");
my @thefiles= readdir(IMD);
# Stop correctly renamed files from screwing around
for (my $i=0;$i<@thefiles;$i++)
{
$thefiles[$i] =~ /^(\d*)(?:,\s(\d*))?\s\-\s(.*)\..*$/;
my $epNumber = $1;
my $epNumber2 = $2;
my $epName = $3;
if ($epnames[$epNumber-1] eq $epName)
{
delete $thefiles[$i];
$i--;
}
}
for (my $i=0;$i<@epnames;$i++)
{
my $t = $i + 1;
my $d = $i + 2;
for (my $j=0;$j<@thefiles;$j++)
{
# if ($thefiles[$j] =~ /((?:\b$season|episode\s*|e\s*)0?$t[^\d])\b/i)
#
# @ - season number
# # - episode number
#
# normal:
#
# s@@e##
# @##
# @x##
# @.##
# episode ##
# season @ episode ##
#
# two part:
#
# -e##
# .e##
# if ($thefiles[$j] =~ /((?:[^\de]$season|episode\s*|\bs0?\Q$season\E(e|x)\s*)0?$t\b(?:([^\d]\Q$season\E?(e|x)?\s*0?$d[^\d])|[^\d]))/i)
my $tzero = "".$t;
if ($t < 10) {
$tzero = "0".$t;
}
if ($thefiles[$j] =~ /(s0?\Q$season\E_?e0?$t|(?:[^\dex]|^)0?\Q$season\E$tzero|(?:[^\ds]|^)0?\Q$season\E[x.]$tzero|(?:\bseason\s*\Q$season\E\s*)?\bepisode\s*$t)([-.]e0?$d)?(?:[^\d]|$)/i)
{
my $name=$tzero;
if ($2)
{
$name.=",";
if ($d <10)
{
$name.="0";
}
$name.= $d." - ".$epnames[$i].", ".$epnames[$i+1];
}
else
{
$name.=" - ".$epnames[$i];
}
$name =~ s/[?:]//g;
$name =~ s/\//-/g;
$thefiles[$j] =~ /(\.[^.]+)$/;
my $source = $dirtarget.$thefiles[$j];
my $dest = $dirtarget.$name.$1;
if ($mode == 0)
{
print $name.$1."\n";
print $thefiles[$j]."\n";
}
elsif (-e $dest)
{
print "ERROR! ".$name." already exists!\n";
}
else
{
rename($source, $dest);
}
last;
}
}
}
closedir(IMD);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment