source: trunk/gsdl/perllib/plugins/OggVorbisPlug.pm@ 13543

Last change on this file since 13543 was 13543, checked in by shaoqun, 17 years ago

fixed the bug that cause the server couldn't locate the file which is stored a subdirectory

  • Property svn:keywords set to Author Date Id Revision
File size: 5.7 KB
Line 
1###########################################################################
2#
3# OggVorbisPlug.pm -- A plugin for Ogg Vorbis audio files
4#
5# Original code by Christy Kuo
6#
7# A component of the Greenstone digital library software
8# from the New Zealand Digital Library Project at the
9# University of Waikato, New Zealand.
10#
11# Copyright 1999-2004 New Zealand Digital Library Project
12#
13# This program is free software; you can redistribute it and/or modify
14# it under the terms of the GNU General Public License as published by
15# the Free Software Foundation; either version 2 of the License, or
16# (at your option) any later version.
17#
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21# GNU General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26#
27###########################################################################
28
29package OggVorbisPlug;
30
31
32use UnknownPlug;
33use Ogg::Vorbis::Header::PurePerl;
34
35use strict;
36no strict 'refs'; # allow filehandles to be variables and viceversa
37
38sub BEGIN {
39 @OggVorbisPlug::ISA = ('UnknownPlug');
40}
41
42
43my $arguments =
44 [ { 'name' => "process_exp",
45 'desc' => "{BasPlug.process_exp}",
46 'type' => "string",
47 'deft' => &get_default_process_exp(),
48 'reqd' => "no" },
49 { 'name' => "add_technical_metadata",
50 'desc' => "{OggVorbisPlug.add_technical_metadata}",
51 'type' => "flag",
52 'deft' => "" } ];
53
54my $options = { 'name' => "OggVorbisPlug",
55 'desc' => "{OggVorbisPlug.desc}",
56 'inherits' => "yes",
57 'abstract' => "no",
58 'args' => $arguments };
59
60
61# This plugin processes exported Ogg Vorbis files with the suffix ".ogg"
62sub get_default_process_exp
63{
64 return q^(?i)(\.ogg)$^;
65}
66
67
68sub new
69{
70 my ($class) = shift(@_);
71 my ($pluginlist,$inputargs,$hashArgOptLists) = @_;
72 push(@$pluginlist, $class);
73
74 if(defined $arguments){ push(@{$hashArgOptLists->{"ArgList"}},@{$arguments});}
75 if(defined $options) { push(@{$hashArgOptLists->{"OptList"}},$options)};
76
77 my $self = new UnknownPlug($pluginlist, $inputargs, $hashArgOptLists);
78
79 return bless $self, $class;
80}
81
82
83sub read
84{
85 my $self = shift (@_);
86 my ($pluginfo, $base_dir, $file, $metadata, $processor, $maxdocs, $total_count, $gli) = @_;
87
88 my $outhandle = $self->{'outhandle'};
89
90 #check process and block exps, smart block, etc
91 my ($block_status,$filename) = $self->read_block(@_);
92 return $block_status if ((!defined $block_status) || ($block_status==0));
93
94 # Report that we're processing the file
95 print STDERR "<Processing n='$file' p='OggVorbisPlug'>\n" if ($gli);
96 print $outhandle "OggVorbisPlug: processing $file\n"
97 if ($self->{'verbosity'}) > 1;
98
99 # file is just the name of the file (need to get rid off any leading directory names)
100 $file =~ s/^.*[\/\\]//;
101
102 # create a new index document
103 my $doc_obj = new doc ($filename, "indexed_doc");
104 if ($processor->{'OIDtype'} =~ /^(assigned|dirname)$/) {
105 $doc_obj->set_OIDtype ($processor->{'OIDtype'}, $processor->{'OIDmetadata'});
106 }
107 else {
108 $doc_obj->set_OIDtype ("incremental"); # this is done to avoid hashing content of file
109 }
110 my $section = $doc_obj->get_top_section();
111
112 # replace spaces in filename with %20 in url for metadata entry
113 my $url = $file;
114 ##$url =~ s/ /%20/g;
115
116 # Source (filename) to be consistent with other plugins
117 $doc_obj->add_metadata ($section, "Source", $url);
118
119 # Extract metadata
120 my $ogg = Ogg::Vorbis::Header::PurePerl->new($filename);
121
122 # Comments added to the file
123 foreach my $key ($ogg->comment_tags())
124 {
125 # Convert key to title case
126 my $keytc = uc(substr($key, 0, 1)) . substr($key, 1, length($key));
127 foreach my $value ($ogg->comment($key))
128 {
129 if (defined $value && $value ne "") {
130 $doc_obj->add_metadata($section, $keytc, $value);
131 }
132 }
133 }
134
135 # Technical data (optional)
136 if ($self->{'add_technical_metadata'}) {
137 foreach my $key (keys %{$ogg->info})
138 {
139 # Convert key to title case
140 my $keytc = uc(substr($key, 0, 1)) . substr($key, 1, length($key));
141 my $value = $ogg->info->{$key};
142 if (defined $value && $value ne "") {
143 $doc_obj->add_metadata($section, $keytc, $value);
144 }
145 }
146 }
147
148 # srclink
149 $doc_obj->add_metadata ($section, "FileFormat", "OggVorbis");
150 $doc_obj->add_metadata ($section, "srclink", "<a href=\"_httpprefix_/collect/[collection]/index/assoc/[assocfilepath]/[Source]\">");
151 $doc_obj->add_metadata ($section, "/srclink", "</a>");
152 # srcicon (need to include "iogg.gif" in the greenstone images directory
153 $doc_obj->add_metadata ($section, "srcicon", "<img src=\"_httpprefix_/images/iogg.gif\" title=\"Download\" border=0>");
154
155 # Add the actual file as an associated file
156 $doc_obj->associate_file($filename, $file, "VORBIS", $section);
157
158 # Create an empty text string so we don't break downstream plugins
159 my $text = &gsprintf::lookup_string("{BasPlug.dummy_text}",1);
160
161 # include any metadata passed in from previous plugins
162 $self->extra_metadata ($doc_obj, $section, $metadata);
163
164 # do plugin specific processing of doc_obj
165 return undef unless defined ($self->process (\$text, $pluginfo, $base_dir, $file, $metadata, $doc_obj));
166
167 # do any automatic metadata extraction
168 $self->auto_extract_metadata($doc_obj);
169
170 # add an OID
171 $doc_obj->set_OID();
172 $doc_obj->add_utf8_text($section, $text);
173
174 # process the document
175 $processor->process($doc_obj);
176
177 $self->{'num_processed'}++;
178 return 1;
179}
180
181
1821;
Note: See TracBrowser for help on using the repository browser.