Ticket #7674: coverart.diff

File coverart.diff, 10.5 KB (added by Simon Kenyon <simon@…>, 10 years ago)

patch to mythweb to stream coverart

Line 
1diff -crN --exclude=.svn -x data /usr/src/myth/trunk/mythplugins/mythweb/classes/Video.php ./classes/Video.php
2*** /usr/src/myth/trunk/mythplugins/mythweb/classes/Video.php   2010-01-13 14:37:23.000000000 +0000
3--- ./classes/Video.php 2010-01-20 09:16:45.000000000 +0000
4***************
5*** 33,38 ****
6--- 33,46 ----
7      function __construct($intid) {
8          global $db;
9          global $mythvideo_dir;
10+
11+ // Video storage directories
12+         $video_dirs = $db->query_list('
13+             SELECT  dirname
14+             FROM    storagegroup
15+             WHERE   groupname="Coverart"
16+         ');
17+
18          $video = $db->query_assoc('
19              SELECT  *
20              FROM    videometadata
21***************
22*** 56,71 ****
23          $this->cover_file   = $video['coverfile'];
24          $this->browse       = $video['browse'];
25      // And the artwork URL
26!         if ($this->cover_file != 'No Cover' && file_exists($this->cover_file) ) {
27!             $this->cover_url = 'data/video_covers/'.substr($this->cover_file, strlen(setting('VideoArtworkDir', hostname)));
28!             list($width, $height) = @getimagesize($this->cover_file);
29!             if ($width > 0 && $height > 0) {
30!                 $wscale = video_img_width / $width;
31!                 $hscale = video_img_height / $height;
32!                 $scale = $wscale < $hscale ? $wscale : $hscale;
33!                 $this->cover_scaled_width  = floor($width * $scale);
34!                 $this->cover_scaled_height = floor($height * $scale);
35              }
36          }
37          $this->childid = $video['childid'];
38      // Figure out the URL
39--- 64,90 ----
40          $this->cover_file   = $video['coverfile'];
41          $this->browse       = $video['browse'];
42      // And the artwork URL
43!         $this->cover_url = '';
44!         if ($this->cover_file != 'No Cover') {
45!             $exists = false;
46!             foreach ($video_dirs as $dir) {
47!                 $path = preg_replace('#/+#', '/', "$dir/$this->cover_file");
48!                 if (file_exists($path) && is_executable(dirname($path))) {
49!                     $exists = true;
50!                     break;
51!                 }
52              }
53+             if ($exists) {
54+                 $this->cover_url = 'pl/coverart/'.$this->cover_file;
55+                 $this->cover_file = path;
56+                 list($width, $height) = @getimagesize($this->cover_file);
57+                 if ($width > 0 && $height > 0) {
58+                     $wscale = video_img_width / $width;
59+                     $hscale = video_img_height / $height;
60+                     $scale = $wscale < $hscale ? $wscale : $hscale;
61+                     $this->cover_scaled_width  = floor($width * $scale);
62+                     $this->cover_scaled_height = floor($height * $scale);
63+                 }
64          }
65          $this->childid = $video['childid'];
66      // Figure out the URL
67***************
68*** 165,167 ****
69--- 184,187 ----
70 
71      }
72  }
73+ ?>
74diff -crN --exclude=.svn -x data /usr/src/myth/trunk/mythplugins/mythweb/modules/coverart/handler.pl ./modules/coverart/handler.pl
75*** /usr/src/myth/trunk/mythplugins/mythweb/modules/coverart/handler.pl 1970-01-01 01:00:00.000000000 +0100
76--- ./modules/coverart/handler.pl       2010-01-20 09:13:09.000000000 +0000
77***************
78*** 0 ****
79--- 1,163 ----
80+ #!/usr/bin/perl
81+ #
82+ # MythWeb Coverart/Download module
83+ #
84+ # @url       $URL$
85+ # @date      $Date$
86+ # @version   $Revision$
87+ # @author    $Author$
88+ #
89+
90+ # Necessary constants for sysopen
91+     use Fcntl;
92+
93+ # Other includes
94+     use Sys::Hostname;
95+     use HTTP::Date;
96+
97+ # Attempt to use the perl bindings to prevent the backend from shutting down during streaming
98+     eval 'use MythTV;';
99+
100+     if (!$@) {
101+         our $mythbackend = new MythTV();
102+         $mythbackend->backend_command('ANN Playback '.hostname);
103+     }
104+
105+ # Which cover are we displaying
106+     our $cover    = url_param('cover');
107+     if ($Path[1]) {
108+         $cover    = $Path[1];
109+     }
110+
111+ # No match?
112+     unless ($cover =~ /\w/) {
113+         print header(),
114+               "Unknown cover requested.\n";
115+         exit;
116+     }
117+
118+ # Find the local file
119+     our $filename;
120+     $sh = $dbh->prepare('SELECT dirname FROM storagegroup WHERE groupname = "Coverart"');
121+     $sh->execute();
122+     while (my ($coverart_dir) = $sh->fetchrow_array()) {
123+         next unless (-e "$coverart_dir/$cover");
124+         $filename = "$coverart_dir/$cover";
125+         last;
126+     }
127+     $sh->finish;
128+
129+     1;
130+
131+     unless ($filename) {
132+         print header(),
133+               "$cover does not exist in any recognized storage group directories for this host.";
134+         exit;
135+     }
136+
137+ # File size
138+     my $size = -s $filename;
139+
140+ # Zero bytes?
141+     if ($size < 1) {
142+         print header(),
143+               "$cover is an empty file.";
144+         exit;
145+     }
146+
147+ # File type
148+     my $type   = 'text/html';
149+     my $suffix = '';
150+     if ($cover =~ /\.jpg$/) {
151+         $type   = 'image/jpeg';
152+         $suffix = '.jpg';
153+     }
154+     else {
155+         print header(),
156+               "Unknown image type requested:  $cover\n";
157+         exit;
158+     }
159+
160+ # Open the file for reading
161+     unless (sysopen DATA, $filename, O_RDONLY) {
162+         print header(),
163+               "Can't read $cover:  $!";
164+         exit;
165+     }
166+
167+ # Binmode, in case someone is running this from Windows.
168+     binmode DATA;
169+
170+     my $start      = 0;
171+     my $end        = $size;
172+     my $total_size = $size;
173+     my $read_size  = 1024;
174+     my $mtime      = (stat($filename))[9];
175+
176+ # Handle cache hits/misses
177+     if ( $ENV{'HTTP_IF_MODIFIED_SINCE'}) {
178+         my $check_time = str2time($ENV{'HTTP_IF_MODIFIED_SINCE'});
179+         if ($mtime <= $check_time) {
180+             print header(-Content_type           => $type,
181+                          -status                 => "304 Not Modified"
182+                         );
183+             exit;
184+         }
185+     }
186+
187+ # Requested a range?
188+     if ($ENV{'HTTP_RANGE'}) {
189+     # Figure out the size of the requested chunk
190+         ($start, $end) = $ENV{'HTTP_RANGE'} =~ /bytes\W+(\d*)-(\d*)\W*$/;
191+         if ($end < 1 || $end > $size) {
192+             $end = $size;
193+         }
194+         $size = $end - $start+1;
195+         if ($read_size > $size) {
196+             $read_size = $size;
197+         }
198+         print header(-status                => "206 Partial Content",
199+                      -type                  => $type,
200+                      -Content_length        => $size,
201+                      -Accept_Ranges         => 'bytes',
202+                      -Content_Range         => "bytes $start-$end/$total_size",
203+                      -Last_Modified         => time2str($mtime),
204+                      -Content_disposition => " attachment; filename=\"$cover\""
205+                  );
206+     }
207+     else {
208+         print header(-type                  => $type,
209+                     -Content_length         => $size,
210+                     -Accept_Ranges          => 'bytes',
211+                     -Last_Modified          => time2str($mtime),
212+                     -Content_disposition => " attachment; filename=\"$cover\""
213+                  );
214+     }
215+
216+ # Seek to the requested position
217+     sysseek DATA, $start, 0;
218+
219+ # Print the content to the browser
220+     my $buffer;
221+     while (sysread DATA, $buffer, $read_size ) {
222+         print $buffer;
223+         $size -= $read_size;
224+         if ($size == 0) {
225+             last;
226+         }
227+         if ($size < $read_size) {
228+             $read_size = $size;
229+         }
230+     }
231+     close DATA;
232+
233+ # Escape a parameter for safe use in a commandline call
234+     sub shell_escape {
235+         $str = shift;
236+         $str =~ s/'/'\\''/sg;
237+         return "'$str'";
238+     }
239+
240+ # Return true
241+     1;
242+
243diff -crN --exclude=.svn -x data /usr/src/myth/trunk/mythplugins/mythweb/modules/coverart/init.php ./modules/coverart/init.php
244*** /usr/src/myth/trunk/mythplugins/mythweb/modules/coverart/init.php   1970-01-01 01:00:00.000000000 +0100
245--- ./modules/coverart/init.php 2010-01-20 09:17:04.000000000 +0000
246***************
247*** 0 ****
248--- 1,15 ----
249+ <?php
250+ /**
251+  * Initialization routines for the MythWeb Video Coverart module
252+  *
253+  * @url         $URL$
254+  * @date        $Date$
255+  * @version     $Revision$
256+  * @author      $Author$
257+  * @license     GPL
258+  *
259+  * @package     MythWeb
260+  * @subpackage  Video Coverart
261+  *
262+ /**/
263+ ?>
264diff -crN --exclude=.svn -x data /usr/src/myth/trunk/mythplugins/mythweb/modules/video/tmpl/default/video.php ./modules/video/tmpl/default/video.php
265*** /usr/src/myth/trunk/mythplugins/mythweb/modules/video/tmpl/default/video.php        2010-01-13 14:37:22.000000000 +0000
266--- ./modules/video/tmpl/default/video.php      2010-01-19 15:43:20.000000000 +0000
267***************
268*** 318,324 ****
269                    if (strlen($video->subtitle) > 0)
270                        echo '<br>' . html_entities($video->subtitle);
271              ?></div>
272!         <div id="<?php echo $video->intid; ?>_img">                <img <?php if ($_SESSION["show_video_covers"] && file_exists($video->cover_file)) echo 'src="'.$video->cover_url.'"'; echo ' width="'.$video->cover_scaled_width.'" height="'.$video->cover_scaled_height.'"'; ?> alt="<?php echo t('Missing Cover'); ?>"></div>
273          <div id="<?php echo $video->intid; ?>-category">           <?php echo $Category_String[$video->category]; ?></div>
274          <div id="<?php echo $video->intid; ?>_playtime">           <?php echo nice_length($video->length * 60); ?></div>
275          <div id="<?php echo $video->intid; ?>_imdb">               <?php if ($video->inetref != '00000000') { ?><a href="<?php echo makeImdbWebUrl($video->inetref); ?>"><?php echo $video->inetref ?></a><?php } ?></div>
276--- 318,324 ----
277                    if (strlen($video->subtitle) > 0)
278                        echo '<br>' . html_entities($video->subtitle);
279              ?></div>
280!         <div id="<?php echo $video->intid; ?>_img">                <img <?php if ($_SESSION["show_video_covers"] && (strcmp($video->cover_url, '') != 0)) echo 'src="'.$video->cover_url.'"'; echo ' width="'.$video->cover_scaled_width.'" height="'.$video->cover_scaled_height.'"'; ?> alt="<?php echo t('Missing Cover'); ?>"></div>
281          <div id="<?php echo $video->intid; ?>-category">           <?php echo $Category_String[$video->category]; ?></div>
282          <div id="<?php echo $video->intid; ?>_playtime">           <?php echo nice_length($video->length * 60); ?></div>
283          <div id="<?php echo $video->intid; ?>_imdb">               <?php if ($video->inetref != '00000000') { ?><a href="<?php echo makeImdbWebUrl($video->inetref); ?>"><?php echo $video->inetref ?></a><?php } ?></div>