Bug 20783: Use iframe to embed Youtube videos
[koha-ffzg.git] / C4 / HTML5Media.pm
index 2bdb794..04fc263 100644 (file)
@@ -22,7 +22,7 @@ use warnings;
 
 use C4::Context;
 use MARC::Field;
-use Koha::Upload;
+use Koha::UploadedFiles;
 
 =head1 HTML5Media
 
@@ -48,8 +48,10 @@ sub gethtml5media {
     my $HTML5MediaParent;
     my $HTML5MediaWidth;
     my @HTML5MediaExtensions = split( /\|/, C4::Context->preference("HTML5MediaExtensions") );
+    my $HTML5MediaYouTube    = C4::Context->preference("HTML5MediaYouTube");
     my $marcflavour          = C4::Context->preference("marcflavour");
     foreach my $HTML5Media_field (@HTML5Media_fields) {
+        my $is_youtube            = 0;
         my %HTML5Media;
         # protocol
         if ( $HTML5Media_field->indicator(1) eq '1' ) {
@@ -96,12 +98,27 @@ sub gethtml5media {
         # src
         if ( $HTML5Media_field->subfield('u') ) {
             $HTML5Media{srcblock} = $HTML5Media_field->subfield('u');
+            if (grep /youtu\.?be/, $HTML5Media_field->subfield('u') ) {
+                if ($HTML5MediaYouTube == 1) {
+                    my $url = $HTML5Media_field->subfield('u');
+                    # Credit for regex goes to https://stackoverflow.com/questions/3452546/how-do-i-get-the-youtube-video-id-from-a-url
+                    next unless $url =~ m{^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*};
+                    my $video_id = $2;
+                    next unless length($video_id) == 11; # Youtube video ids are 11 chars length
+                    $HTML5Media{srcblock} = sprintf '%s://www.youtube.com/embed/%s', $HTML5Media{protocol}, $video_id;
+                    $HTML5Media{is_youtube} = 1;
+                    $is_youtube = 1;
+                }
+               else {
+                   next; # do not embed youtube videos
+               }
+            }
         }
         elsif ( $HTML5Media_field->subfield('a') && $HTML5Media_field->subfield('d') && $HTML5Media_field->subfield('f') ) {
             $HTML5Media{host}        = $HTML5Media_field->subfield('a');
             $HTML5Media{host}        =~ s/(^\/|\/$)//g;
             $HTML5Media{path}        = $HTML5Media_field->subfield('d');
-            $HTML5Media{path}        =~ s/(^\/|\/$)//g;
+            $HTML5Media{path}        =~ s/(^\/|\/$)//g; # TODO we could check for youtube here too, but nobody uses these fields anyway…
             $HTML5Media{file}        = $HTML5Media_field->subfield('f');
             $HTML5Media{srcblock}    = $HTML5Media{protocol} . '://' . $HTML5Media{loginblock} . $HTML5Media{host} . $HTML5Media{portblock} . '/' . $HTML5Media{path} . '/' . $HTML5Media{file};
         }
@@ -111,15 +128,27 @@ sub gethtml5media {
         # extension
         # check uploaded files
         if ( $HTML5Media{srcblock} =~ /\Qopac-retrieve-file.pl\E/ ) {
-            $HTML5Media{extension} = (Koha::Upload->new->get({ hashvalue => (split(/id=/, $HTML5Media{srcblock}))[1] })->{name} =~ m/([^.]+)$/)[0];
+            my ( undef, $id ) = split /id=/, $HTML5Media{srcblock};
+            next if !$id;
+            my %public = ( ( caller )[1] =~ /opac/ ) ? ( public => 1 ): ();
+            my $upload = Koha::UploadedFiles->search({
+                hashvalue => $id, %public,
+            })->next;
+            next if !$upload || $upload->filename !~ /\./;
+            $HTML5Media{extension} = ( $upload->filename =~ m/([^.]+)$/ )[0];
         }
         # check remote files
         else {
             $HTML5Media{extension} = ($HTML5Media{srcblock} =~ m/([^.]+)$/)[0];
         }
-        if ( !grep /\Q$HTML5Media{extension}\E/, @HTML5MediaExtensions ) {
+        if ( ( !grep /\Q$HTML5Media{extension}\E/, @HTML5MediaExtensions ) && ( $is_youtube != 1) ) {
             next; # not a specified media file
         }
+        # youtube
+        if ($is_youtube == 1) {
+            $HTML5Media{mime} = 'video/webm';
+            $HTML5Media{type} = 'video';
+        }
         # mime
         if ( $HTML5Media_field->subfield('c') ) {
             $HTML5Media{codecs} = $HTML5Media_field->subfield('c');
@@ -151,7 +180,7 @@ sub gethtml5media {
             }
             if ( $HTML5Media{extension} eq 'oga' ) {
                 $HTML5Media{mime} = 'audio/ogg';
-              $HTML5Media{codecs} = 'vorbis';
+                $HTML5Media{codecs} = 'vorbis';
             }
             elsif ( $HTML5Media{extension} eq 'spx' ) {
                 $HTML5Media{mime} = 'audio/ogg';