Bug 15225: Make HTML5Media work with file upload feature.
[koha.git] / C4 / HTML5Media.pm
1 package C4::HTML5Media;
2
3 # Copyright 2012/2015 Mirko Tietgen
4 #
5 # This file is part of Koha.
6 #
7 # Koha is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # Koha is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with Koha; if not, see <http://www.gnu.org/licenses>.
19
20 use strict;
21 use warnings;
22
23 use C4::Context;
24 use MARC::Field;
25 use Koha::Upload;
26
27 =head1 HTML5Media
28
29 C4::HTML5Media
30
31 =head1 Description
32
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.
34
35 =cut
36
37 =head2 gethtml5media
38
39 Get all relevant data from field 856. Takes a $record in the subroutine call, sets appropriate params.
40
41 =cut
42
43 sub gethtml5media {
44     my $self = shift;
45     my $record = shift;
46     my @HTML5Media_sets = ();
47     my @HTML5Media_fields = $record->field(856);
48     my $HTML5MediaParent;
49     my $HTML5MediaWidth;
50     my @HTML5MediaExtensions = split( /\|/, C4::Context->preference("HTML5MediaExtensions") );
51     my $marcflavour          = C4::Context->preference("marcflavour");
52     foreach my $HTML5Media_field (@HTML5Media_fields) {
53         my %HTML5Media;
54         # protocol
55         if ( $HTML5Media_field->indicator(1) eq '1' ) {
56             $HTML5Media{protocol} = 'ftp';
57         }
58         elsif ( $HTML5Media_field->indicator(1) eq '4' ) {
59             $HTML5Media{protocol} = 'http';
60         }
61         elsif ( $HTML5Media_field->indicator(1) eq '7' ) {
62             if ($marcflavour eq 'MARC21' || $marcflavour eq 'NORMARC') {
63                 $HTML5Media{protocol} = $HTML5Media_field->subfield('2');
64             }
65             elsif ($marcflavour eq 'UNIMARC') {
66                 $HTML5Media{protocol} = $HTML5Media_field->subfield('y');
67             }
68         }
69         else {
70             $HTML5Media{protocol} = 'http';
71         }
72         # user
73         if ( $HTML5Media_field->subfield('l') ) {
74             $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.
75         }
76         elsif ( $HTML5Media_field->subfield('h') ) {
77             $HTML5Media{username} = $HTML5Media_field->subfield('h');
78         }
79         # user/pass
80         if ( $HTML5Media{username} && $HTML5Media_field->subfield('k') ) {
81             $HTML5Media{loginblock} = $HTML5Media{username} . ':' . $HTML5Media_field->subfield('k') . '@';
82         }
83         elsif ( $HTML5Media{username} ) {
84             $HTML5Media{loginblock} = $HTML5Media{username} . '@';
85         }
86         else {
87             $HTML5Media{loginblock} = '';
88         }
89         # port
90         if ( $HTML5Media_field->subfield('p') ) {
91             $HTML5Media{portblock} = ':' . $HTML5Media_field->subfield('k');
92         }
93         else {
94             $HTML5Media{portblock} = '';
95         }
96         # src
97         if ( $HTML5Media_field->subfield('u') ) {
98             $HTML5Media{srcblock} = $HTML5Media_field->subfield('u');
99         }
100         elsif ( $HTML5Media_field->subfield('a') && $HTML5Media_field->subfield('d') && $HTML5Media_field->subfield('f') ) {
101             $HTML5Media{host}        = $HTML5Media_field->subfield('a');
102             $HTML5Media{host}        =~ s/(^\/|\/$)//g;
103             $HTML5Media{path}        = $HTML5Media_field->subfield('d');
104             $HTML5Media{path}        =~ s/(^\/|\/$)//g;
105             $HTML5Media{file}        = $HTML5Media_field->subfield('f');
106             $HTML5Media{srcblock}    = $HTML5Media{protocol} . '://' . $HTML5Media{loginblock} . $HTML5Media{host} . $HTML5Media{portblock} . '/' . $HTML5Media{path} . '/' . $HTML5Media{file};
107         }
108         else {
109             next; # no file to play
110         }
111         # extension
112         # check uploaded files
113         if ( $HTML5Media{srcblock} =~ /\Qopac-retrieve-file.pl\E/ ) {
114             $HTML5Media{extension} = (Koha::Upload->new->get({ hashvalue => (split(/id=/, $HTML5Media{srcblock}))[1] })->{name} =~ m/([^.]+)$/)[0];
115         }
116         # check remote files
117         else {
118             $HTML5Media{extension} = ($HTML5Media{srcblock} =~ m/([^.]+)$/)[0];
119         }
120         if ( !grep /\Q$HTML5Media{extension}\E/, @HTML5MediaExtensions ) {
121             next; # not a specified media file
122         }
123         # mime
124         if ( $HTML5Media_field->subfield('c') ) {
125             $HTML5Media{codecs} = $HTML5Media_field->subfield('c');
126         }
127         ### from subfield q…
128         if ( $HTML5Media_field->subfield('q') ) {
129             $HTML5Media{mime} = $HTML5Media_field->subfield('q');
130         }
131         ### …or from file extension and codecs…
132         elsif ( $HTML5Media{codecs} ) {
133             if ( $HTML5Media{codecs} =~ /theora.*vorbis/ ) {
134                 $HTML5Media{mime} = 'video/ogg';
135             }
136             elsif ( $HTML5Media{codecs} =~ /vp8.*vorbis/ ) {
137                 $HTML5Media{mime} = 'video/webm';
138             }
139             elsif ( ($HTML5Media{codecs} =~ /^vorbis$/) && ($HTML5Media{extension} eq 'ogg') ) {
140                 $HTML5Media{mime} = 'audio/ogg';
141             }
142             elsif ( ($HTML5Media{codecs} =~ /^vorbis$/) && ($HTML5Media{extension} eq 'webm') ) {
143                 $HTML5Media{mime} = 'audio/webm';
144             }
145         }
146         ### …or just from file extension
147         else {
148             if ( $HTML5Media{extension} eq 'ogv' ) {
149                 $HTML5Media{mime} = 'video/ogg';
150                 $HTML5Media{codecs} = 'theora,vorbis';
151             }
152             if ( $HTML5Media{extension} eq 'oga' ) {
153                 $HTML5Media{mime} = 'audio/ogg';
154               $HTML5Media{codecs} = 'vorbis';
155             }
156             elsif ( $HTML5Media{extension} eq 'spx' ) {
157                 $HTML5Media{mime} = 'audio/ogg';
158                 $HTML5Media{codecs} = 'speex';
159             }
160             elsif ( $HTML5Media{extension} eq 'opus' ) {
161                 $HTML5Media{mime} = 'audio/ogg';
162                 $HTML5Media{codecs} = 'opus';
163             }
164             elsif ( $HTML5Media{extension} eq 'vtt' ) {
165                 $HTML5Media{mime} = 'text/vtt';
166             }
167         }
168         # codecs
169         if ( $HTML5Media{codecs} ) {
170             $HTML5Media{codecblock} = '; codecs="' . $HTML5Media{codecs} . '"';
171         }
172         else {
173             $HTML5Media{codecblock} = '';
174         }
175         # type
176         if ( $HTML5Media{mime} ) {
177             $HTML5Media{typeblock} = ' type=\'' . $HTML5Media{mime} . $HTML5Media{codecblock} . '\'';
178         }
179         else {
180           $HTML5Media{typeblock} = '';
181         }
182         # element
183         if ( $HTML5Media{mime} =~ /audio/ ) {
184             $HTML5Media{type} = 'audio';
185         }
186         elsif ( $HTML5Media{mime} =~ /video/ ) {
187             $HTML5Media{type} = 'video';
188         }
189         elsif ( $HTML5Media{mime} =~ /text/ ) {
190             $HTML5Media{type} = 'track';
191         }
192         # push
193         if ( $HTML5Media{srcblock} && $HTML5Media{type} ) {
194             push (@HTML5Media_sets, \%HTML5Media);
195         }
196     }
197     # parent element
198     for my $media ( @HTML5Media_sets ) {
199         if ( ($media->{mime}) && ($media->{mime} =~ /audio/) ) {
200             if ( $HTML5MediaParent ne 'video' ) {
201                 $HTML5MediaParent = 'audio';
202                 $HTML5MediaWidth = '';
203             }
204         }
205         elsif ( ($media->{mime}) && ($media->{mime} =~ /video/) ) {
206             $HTML5MediaParent = 'video';
207             $HTML5MediaWidth = ' width="480"';
208         }
209     }
210     # child element
211     for my $media ( @HTML5Media_sets ) {
212         if ( ($media->{type}) && ( ($media->{type} eq 'video') || ($media->{type} eq 'audio') ) ) {
213             if ( $media->{type} eq $HTML5MediaParent ) {
214                 $media->{child} = 'source';
215             }
216         }
217         else {
218             $media->{child} = $media->{type};
219         }
220     }
221
222     return (
223         HTML5MediaEnabled  => ( (scalar(@HTML5Media_sets) > 0) && ($HTML5MediaParent) ),
224         HTML5MediaSets     => \@HTML5Media_sets,
225         HTML5MediaParent   => $HTML5MediaParent,
226         HTML5MediaWidth    => $HTML5MediaWidth,
227     );
228 }
229
230 1;