Generatevideothumbs.pl
From MythTV Official Wiki
Note: The correct title of this article is generatevideothumbs.pl. It appears incorrectly here due to technical restrictions.
Todo: Script needs to be updated to use Perl bindings for database credentials.
generatevideothumbs.pl is a perl script to scan your database for MythVideo videos that don't have preview icons or cover images, and generate a preview icon by taking a screenshot out of the video.
See also Discussion page.
#!/usr/bin/perl
# generatevideothumbs.pl
# this script will loop through all videos in videometadata,
# capture a screenshot for each, move each screenshot to the
# COVERPATH dir, and update each row in videometadata with
# the appropriate information. Only rows with coverfile=
# 'No Cover' are processed. A percentage of the length
# of each video is used for the capture position to account
# for clips of widely varying lengths.
# This script is mostly based on a bash script posted to the mythtv-users
# mailing list by damonkeiman-at-hotmail-dot-com; viewable at:
# <http://www.gossamer-threads.com/lists/mythtv/users/273113#273113>.
# I had trouble getting it to work as-is (it kept losing parts of the output
# from the first mysql query), and wound up rewriting it in Perl to get it to
# work.
# Portions written by me are
# Copyright (C) 2007 David Miller <dave@justdave.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# 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.
#
# The full text of the GNU General Public License can be viewed at
# <http://www.gnu.org/licenses/>.
use DBI;
if (getpwuid($>) ne "mythtv") {
print STDERR "You must run this script as the mythtv user.\n";
exit 1;
};
# set some defaults
my %config = (
DBHostName => 'localhost',
DBUserName => 'mythtv',
DBName => 'mythconverg',
DBPassword => '',
);
# read in the real ones
open MYSQLDATA, "<", "/etc/mythtv/mysql.txt";
while (my $line = <MYSQLDATA>) {
if ($line =~ /^(DB\S+)=(.*)\s*$/) {
$config{$1} = $2;
}
}
close MYSQLDATA;
# intialize variables
my $OUTPATH='/tmp';
my $COVERPATH='/home/mythtv/.mythtv/MythVideo';
my $FRAME='00000002.jpg';
my $SKIPOFFSET='35';
my $dsn = "DBI:mysql:host=" . $config{DBHostName} . ":database=" . $config{DBName};
my $dbh = DBI->connect($dsn, $config{DBUserName}, $config{DBPassword});
my $sth = $dbh->prepare("SELECT intid, filename FROM videometadata WHERE coverfile='No Cover'");
$sth->execute();
while (my ($ID, $FILE) = $sth->fetchrow_array()) {
print "MYSQLRESULT: id=$ID, file=$FILE\n";
# if video is mpeg, use ffmpeg12 codec to avoid pixelation
my @VC = ();
if ($FILE =~ /.*\.mp[e]*g/) {
@VC=("-vc","ffmpeg12");
}
# if video is a .iso or a .img, add dvd:\\1 -dvd-device
my @dvd = ();
if ($FILE =~ /\.(iso|img)$/i) {
@dvd=("dvd://1", "-dvd-device");
}
# use mplayer to get length of video in seconds
my $length=`echo -n q | mplayer -vo null -nosound -identify -ac null -vc null "$FILE" | egrep "^(ID_LENGTH=)" | cut -d '=' -f 2`;
if (!$length) {
print "mplayer was unable to get the $FILE length.\n";
next;
}
my $SKIP = int(($length * $SKIPOFFSET) / 100);
print "calculated skip seconds: $SKIP\n";
# command to get jpeg from video
system("mplayer","-really-quiet","-ac","null","-noframedrop","-ss",$SKIP,"-vo","jpeg:quality=50:outdir=$OUTPATH","-frames","2",@VC,"-nosound",@dvd,$FILE);
# move jpeg from outpath to coverpath
print "mv $OUTPATH/$FRAME $COVERPATH/intid.$ID.jpg\n";
if (0 != system("mv", "$OUTPATH/$FRAME", "$COVERPATH/intid.$ID.jpg")) {
print "Move failed. Will not update videometadata table...\n";
unlink "$OUTPATH/$FRAME";
}
else {
# SQL to update table with cover image path
my $usth = $dbh->prepare("UPDATE videometadata SET coverfile='$COVERPATH/intid.$ID.jpg' WHERE intid=$ID LIMIT 1");
$usth->execute();
}
}