#!/usr/bin/perl use Shell; use strict; use POSIX qw(floor); # Written by Bob Igo from the MythTV Store at http://MythiC.TV # including some original code and contributions from Nick C. # and graysky. # Email: bob@stormlogic.com # # If you run into problems with this script, please send me email # PURPOSE: # -------------------------- # This is a wrapper script that tries to find the best parameters # for calling an underlying video player. The outer layer determines # the best playback parameters, while the inner layer picks the best # player to call. # RATIONALE: # -------------------------- # Default video playback options are not optimal on all hardware or # for all video types. In addition, common video players do not # offer to bookmark video so that you can resume where you left off. # Both of these problems can be addressed by this wrapper. # PARAMETERS: # -------------------------- # The same parameters you'd use for mplayer, some of which may be # translated automatically for use with smplayer. # FILES: # -------------------------- # $mediafile, the file to play sub run () { my $mediafile = @ARGV[$#ARGV]; my $player = &pick_player(); my $player_parameters = join(' ', &translate_parameters($player,@ARGV[0..$#ARGV-1]), &dynamic_parameters($mediafile)); &player($player,$player_parameters,$mediafile); } &run(); # Translates any parameters into ones that will be compatible with the given player. sub translate_parameters() { my($player,@parameters)=@_; if ($player eq "smplayer") { # Stupidly, smplayer uses a different set of command-line parameters than generic # mplayer, so we need to translate mplayer-centric ones into the few that are # available in smplayer-ese. my %smplayer_parameter_translation_array = ( "-fs" => "-fullscreen", "-zoom" => " " ); sub translate() { my($flag)=@_; return $smplayer_parameter_translation_array{$flag}; } return map(&translate($_), @parameters); } else { return @parameters; } } # Returns an array of dynamic parameters based in part on the media. sub dynamic_parameters () { my($mediafile)=@_; return(); # ??? empty for now; further development required } # Find the best player for use on this system. The script prefers smplayer, # which has built-in bookmarking, falling back to mplayer-resumer.pl, which # implements bookmarking as an mplayer wrapper, if smplayer cannot be found. # Finally, if no bookmarking players can be found, a barebones mplayer is used. sub pick_player () { my @possible_players = ("smplayer", "mplayer-resumer.pl", "mplayer"); my $command; my $candidate_player; foreach (@possible_players) { $candidate_player = $_; $command = "which $candidate_player |"; open(SHELL, $command); if () { #print "player $candidate_player : $_\n"; return $candidate_player; } close(SHELL); } } # Calls player sub player () { my($player,$parameters,$mediafile)=@_; my $command = "$player $parameters \"$mediafile\" 2>&1 2>/dev/null |"; #print "DEBUG: command is:\n$command\n"; open(SHELL, $command); while () { print $_; } close(SHELL); }