1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#!/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 {
# currently, all other players used by this wrapper work with mplayer parameters
return @parameters;
}
}
# Returns an array of dynamic parameters based on the media type,
# the presence of special playback decoding hardware, and the
# general capability of the CPU.
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 (<SHELL>) {
#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 (<SHELL>) {
print $_;
}
close(SHELL);
}
|