#!/usr/bin/perl
#
# It's my first script in Perl, so be lenient.
#
# This script works only for TV shows and their subtitles !
# When you want to see your favorite tv show, with its sub, you launch the video
# with your favorite video player, and you add the path of the subtitles.
# Many video players, like mplayer, import automatically the subtitles if they
# have the same name. This script renames the subtitles files (.srt) of a directory
# exactly like the corresponding videos (.avi).
# You won't need to specify the path of the subtitles to your video player anymore.
#
# Example:
# Video: my_video.s04e38.something.dot.something_else.avi
# Subtitle file: video.438.srt
# After running the script, the subtitle will be named:
# my_video.s04e38.something.dot.something_else.srt
#
# The formats supported by the script:
# - sAAeBB or SAAEBB with AA the season and BB the episode.
# - ABB with A the season and BB the episode.
# - AxBB with A the season and BB the episode.
#
# If the script is launched without any arguments, then the videos and subtitles
# directories will be set to the current directory.
#
# Options:
#
# -h print command list
#
# -d (-dir) <videos directory>
# Specify the directory where the videos are located.
# If this option is not set, the video directory will be the current directory.
#
# -s (-sub) <subtitles files directory>
# Specify the directory of the subtitles files.
# If this option is not set, the subtitles directory will be the same directory as
# the videos directory. Which means that if the videos directory is not set, it will be
# the current directory.
#
# -p (--preview) <without arguments>
# Preview mode. If this options is set, the subtiles new names will be display on the
# screen without being renamed.
#
# I hope this script will be as useful as it's to me.
#
# Enjoy your tv shows ;-)
#
use Cwd;
#use Getopt::Std;
use Getopt::Long;
my $preview = 0;
my $help = 0;
GetOptions( "dir=s" => \$dir, "sub=s" => \$sub, "preview!" => \$preview, "help!" =>\$help ) or printOptions();
if ($help == 1){
printOptions();
}
if ($preview ==
1) {print "****** PREVIEW MODE ******\n";
}
else {print "****** RENAME MODE *******\n";
}
chomp ($currentDir = getcwd
());
my $videoDir = $currentDir;
my $subDir = $currentDir;
$videoDir = $dir;
}
print "dir: $videoDir\n";
$subDir = $sub;
}
else {
$subDir = $videoDir;
}
opendir(DIR,
$videoDir) ||
die "can't opendir $videoDir: $!";
push(@videosList,
$path) if $path =~
m/\.avi$/;
}
if (!@videosList){
print"\n No videos found ! check your path !\n";
}
$temp = getcwd();
opendir(DIR,
$subDir) ||
die "can't opendir $subDir: $!";
push(@subsList,
$path) if $path =~
m/\.srt$/;
}
if (!@subsList){
print "\n No subtitles found ! check your path !\n";
}
if ($videoDir ne $currentDir){
chdir ($videoDir) ||
die "Can't cd to spool: $!\n";
}
foreach $f (@videosList) {
################
# VIDEOS FILES #
################
my @result = getSeasonEpisod($f);
$season = @result[0];
$episod = @result[1];
foreach $s (@subsList) {
if ($videoDir ne $subDir) {
chdir ($currentDir) ||
die "Can't cd to spool: $!\n";
chdir ($subDir) ||
die "Can't cd to spool: $!\n";
}
####################
# SUBTITLES FILES #
####################
my @result = getSeasonEpisod($s);
$seasonSub = @result[0];
$episodSub = @result[1];
if ($season == $seasonSub and $episod == $episodSub){
my ($vidName) =
$f =~
m/
(.*
)\.avi$/;
print "Rename: $s --> $vidName.srt";
if ($preview != 1){
rename($s,
"$vidName.srt") ||
die "Cannot rename $s: $!";
}
}
}
}
# get season and episode
sub getSeasonEpisod {
my $season = 0;
my $episod = 0;
# format ABB
if(@_[0] =~ /(\d)(\d\d)/){
$season = $1;
$episod = $2;
}
# format sAAeBB
elsif (@_[0] =~ /[sS](\d\d)[eE](\d\d)/){
$season = $1;
$episod = $2;
}
# format AxBB
elsif (@_[0] =~ /(\d)[xX](\d\d)/){
$season = $1;
$episod = $2;
}
else {
print "Video format Not Match ! \n";
}
}
# print options
sub printOptions(){
print "-h print command list\n";
print "-d (-dir) <videos directory>\n";
print "-s (-sub) <subtitles files directory>\n";
print "-p (--preview) <without arguments>\n";
}