1 package C4::HTML5Media;
3 # Copyright 2012 Mirko Tietgen
5 # This file is part of Koha.
7 # Koha is free software; you can redistribute it and/or modify it under the
8 # terms of the GNU General Public License as published by the Free Software
9 # Foundation; either version 2 of the License, or (at your option) any later
12 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
13 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
14 # A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License along
17 # with Koha; if not, write to the Free Software Foundation, Inc.,
18 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
33 This module gets the relevant data from field 856 (MARC21/UNIMARC) to create a HTML5 audio or video element containing the file(s) catalogued in 856.
39 Get all relevant data from field 856. Takes $template and $record in the subroutine call, sets appropriate params.
47 my @HTML5Media_sets = ();
48 my @HTML5Media_fields = $record->field(856);
51 my @HTML5MediaExtensions = split( /\|/, C4::Context->preference("HTML5MediaExtensions") );
52 my $marcflavour = C4::Context->preference("marcflavour");
53 foreach my $HTML5Media_field (@HTML5Media_fields) {
56 if ( $HTML5Media_field->indicator(1) eq '1' ) {
57 $HTML5Media{protocol} = 'ftp';
59 elsif ( $HTML5Media_field->indicator(1) eq '4' ) {
60 $HTML5Media{protocol} = 'http';
62 elsif ( $HTML5Media_field->indicator(1) eq '7' ) {
63 if ($marcflavour eq 'MARC21' || $marcflavour eq 'NORMARC') {
64 $HTML5Media{protocol} = $HTML5Media_field->subfield('2');
66 elsif ($marcflavour eq 'UNIMARC') {
67 $HTML5Media{protocol} = $HTML5Media_field->subfield('y');
71 $HTML5Media{protocol} = 'http';
74 if ( $HTML5Media_field->subfield('l') ) {
75 $HTML5Media{username} = $HTML5Media_field->subfield('l'); # yes, that is arbitrary if h and l are not the same. originally i flipped a coin in that case.
77 elsif ( $HTML5Media_field->subfield('h') ) {
78 $HTML5Media{username} = $HTML5Media_field->subfield('h');
81 if ( $HTML5Media{username} && $HTML5Media_field->subfield('k') ) {
82 $HTML5Media{loginblock} = $HTML5Media{username} . ':' . $HTML5Media_field->subfield('k') . '@';
84 elsif ( $HTML5Media{username} ) {
85 $HTML5Media{loginblock} = $HTML5Media{username} . '@';
88 $HTML5Media{loginblock} = '';
91 if ( $HTML5Media_field->subfield('p') ) {
92 $HTML5Media{portblock} = ':' . $HTML5Media_field->subfield('k');
95 $HTML5Media{portblock} = '';
98 if ( $HTML5Media_field->subfield('u') ) {
99 $HTML5Media{srcblock} = $HTML5Media_field->subfield('u');
101 elsif ( $HTML5Media_field->subfield('a') && $HTML5Media_field->subfield('d') && $HTML5Media_field->subfield('f') ) {
102 $HTML5Media{host} = $HTML5Media_field->subfield('a');
103 $HTML5Media{host} =~ s/(^\/|\/$)//g;
104 $HTML5Media{path} = $HTML5Media_field->subfield('d');
105 $HTML5Media{path} =~ s/(^\/|\/$)//g;
106 $HTML5Media{file} = $HTML5Media_field->subfield('f');
107 $HTML5Media{srcblock} = $HTML5Media{protocol} . '://' . $HTML5Media{loginblock} . $HTML5Media{host} . $HTML5Media{portblock} . '/' . $HTML5Media{path} . '/' . $HTML5Media{file};
110 next; # no file to play
113 $HTML5Media{extension} = ($HTML5Media{srcblock} =~ m/([^.]+)$/)[0];
114 if ( !grep /$HTML5Media{extension}/, @HTML5MediaExtensions ) {
115 next; # not a specified media file
118 if ( $HTML5Media_field->subfield('c') ) {
119 $HTML5Media{codecs} = $HTML5Media_field->subfield('c');
122 if ( $HTML5Media_field->subfield('q') ) {
123 $HTML5Media{mime} = $HTML5Media_field->subfield('q');
125 ### …or from file extension and codecs…
126 elsif ( $HTML5Media{codecs} ) {
127 if ( $HTML5Media{codecs} =~ /theora.*vorbis/ ) {
128 $HTML5Media{mime} = 'video/ogg';
130 elsif ( $HTML5Media{codecs} =~ /vp8.*vorbis/ ) {
131 $HTML5Media{mime} = 'video/webm';
133 elsif ( ($HTML5Media{codecs} =~ /^vorbis$/) && ($HTML5Media{extension} eq 'ogg') ) {
134 $HTML5Media{mime} = 'audio/ogg';
136 elsif ( ($HTML5Media{codecs} =~ /^vorbis$/) && ($HTML5Media{extension} eq 'webm') ) {
137 $HTML5Media{mime} = 'audio/webm';
140 ### …or just from file extension
142 if ( $HTML5Media{extension} eq 'ogv' ) {
143 $HTML5Media{mime} = 'video/ogg';
144 $HTML5Media{codecs} = 'theora,vorbis';
146 if ( $HTML5Media{extension} eq 'oga' ) {
147 $HTML5Media{mime} = 'audio/ogg';
148 $HTML5Media{codecs} = 'vorbis';
150 elsif ( $HTML5Media{extension} eq 'spx' ) {
151 $HTML5Media{mime} = 'audio/ogg';
152 $HTML5Media{codecs} = 'speex';
154 elsif ( $HTML5Media{extension} eq 'opus' ) {
155 $HTML5Media{mime} = 'audio/ogg';
156 $HTML5Media{codecs} = 'opus';
158 elsif ( $HTML5Media{extension} eq 'vtt' ) {
159 $HTML5Media{mime} = 'text/vtt';
163 if ( $HTML5Media{codecs} ) {
164 $HTML5Media{codecblock} = '; codecs="' . $HTML5Media{codecs} . '"';
167 $HTML5Media{codecblock} = '';
170 if ( $HTML5Media{mime} ) {
171 $HTML5Media{typeblock} = ' type=\'' . $HTML5Media{mime} . $HTML5Media{codecblock} . '\'';
174 $HTML5Media{typeblock} = '';
177 if ( $HTML5Media{mime} =~ /audio/ ) {
178 $HTML5Media{type} = 'audio';
180 elsif ( $HTML5Media{mime} =~ /video/ ) {
181 $HTML5Media{type} = 'video';
183 elsif ( $HTML5Media{mime} =~ /text/ ) {
184 $HTML5Media{type} = 'track';
187 if ( $HTML5Media{srcblock} && $HTML5Media{type} ) {
188 push (@HTML5Media_sets, \%HTML5Media);
192 for my $i ( 0 .. $#HTML5Media_sets ) {
193 if ( ($HTML5Media_sets[$i]{mime}) && ($HTML5Media_sets[$i]{mime} =~ /audio/) ) {
194 if ( $HTML5MediaParent ne 'video' ) {
195 $HTML5MediaParent = 'audio';
196 $HTML5MediaWidth = '';
199 elsif ( ($HTML5Media_sets[$i]{mime}) && ($HTML5Media_sets[$i]{mime} =~ /video/) ) {
200 $HTML5MediaParent = 'video';
201 $HTML5MediaWidth = ' width="480"';
205 for my $j ( 0 .. $#HTML5Media_sets ) {
206 if ( ($HTML5Media_sets[$j]{type}) && ( ($HTML5Media_sets[$j]{type} eq 'video') || ($HTML5Media_sets[$j]{type} eq 'audio') ) ) {
207 if ( $HTML5Media_sets[$j]{type} eq $HTML5MediaParent ) {
208 $HTML5Media_sets[$j]{child} = 'source';
212 $HTML5Media_sets[$j]{child} = $HTML5Media_sets[$j]{type};
215 # template parameters
216 if ( (scalar(@HTML5Media_sets) > 0) && ($HTML5MediaParent) ) {
218 HTML5MediaEnabled => 1,
219 HTML5MediaSets => \@HTML5Media_sets,
220 HTML5MediaParent => $HTML5MediaParent,
221 HTML5MediaWidth => $HTML5MediaWidth);