1 | <?php |
---|
2 | ///////////////////////////////////////////////////////////////// |
---|
3 | /// getID3() by James Heinrich <info@getid3.org> // |
---|
4 | // available at http://getid3.sourceforge.net // |
---|
5 | // or http://www.getid3.org // |
---|
6 | ///////////////////////////////////////////////////////////////// |
---|
7 | // See readme.txt for more details // |
---|
8 | ///////////////////////////////////////////////////////////////// |
---|
9 | // // |
---|
10 | // write.vorbiscomment.php // |
---|
11 | // module for writing VorbisComment tags // |
---|
12 | // dependencies: /helperapps/vorbiscomment.exe // |
---|
13 | // /// |
---|
14 | ///////////////////////////////////////////////////////////////// |
---|
15 | |
---|
16 | |
---|
17 | class getid3_write_vorbiscomment |
---|
18 | { |
---|
19 | |
---|
20 | var $filename; |
---|
21 | var $tag_data; |
---|
22 | var $warnings = array(); // any non-critical errors will be stored here |
---|
23 | var $errors = array(); // any critical errors will be stored here |
---|
24 | |
---|
25 | function getid3_write_vorbiscomment() { |
---|
26 | return true; |
---|
27 | } |
---|
28 | |
---|
29 | function WriteVorbisComment() { |
---|
30 | |
---|
31 | if (!ini_get('safe_mode')) { |
---|
32 | |
---|
33 | // Create file with new comments |
---|
34 | $tempcommentsfilename = tempnam('*', 'getID3'); |
---|
35 | if ($fpcomments = @fopen($tempcommentsfilename, 'wb')) { |
---|
36 | |
---|
37 | foreach ($this->tag_data as $key => $value) { |
---|
38 | foreach ($value as $commentdata) { |
---|
39 | fwrite($fpcomments, $this->CleanVorbisCommentName($key).'='.$commentdata."\n"); |
---|
40 | } |
---|
41 | } |
---|
42 | fclose($fpcomments); |
---|
43 | |
---|
44 | } else { |
---|
45 | |
---|
46 | $this->errors[] = 'failed to open temporary tags file "'.$tempcommentsfilename.'", tags not written'; |
---|
47 | return false; |
---|
48 | |
---|
49 | } |
---|
50 | |
---|
51 | $oldignoreuserabort = ignore_user_abort(true); |
---|
52 | if (GETID3_OS_ISWINDOWS) { |
---|
53 | |
---|
54 | if (file_exists(GETID3_HELPERAPPSDIR.'vorbiscomment.exe')) { |
---|
55 | //$commandline = '"'.GETID3_HELPERAPPSDIR.'vorbiscomment.exe" -w --raw -c "'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"'; |
---|
56 | // vorbiscomment works fine if you copy-paste the above commandline into a command prompt, |
---|
57 | // but refuses to work with `backtick` if there are "doublequotes" present around BOTH |
---|
58 | // the metaflac pathname and the target filename. For whatever reason...?? |
---|
59 | // The solution is simply ensure that the metaflac pathname has no spaces, |
---|
60 | // and therefore does not need to be quoted |
---|
61 | |
---|
62 | // On top of that, if error messages are not always captured properly under Windows |
---|
63 | // To at least see if there was a problem, compare file modification timestamps before and after writing |
---|
64 | clearstatcache(); |
---|
65 | $timestampbeforewriting = filemtime($this->filename); |
---|
66 | |
---|
67 | $commandline = GETID3_HELPERAPPSDIR.'vorbiscomment.exe -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; |
---|
68 | $VorbiscommentError = `$commandline`; |
---|
69 | |
---|
70 | if (empty($VorbiscommentError)) { |
---|
71 | clearstatcache(); |
---|
72 | if ($timestampbeforewriting == filemtime($this->filename)) { |
---|
73 | $VorbiscommentError = 'File modification timestamp has not changed - it looks like the tags were not written'; |
---|
74 | } |
---|
75 | } |
---|
76 | } else { |
---|
77 | $VorbiscommentError = 'vorbiscomment.exe not found in '.GETID3_HELPERAPPSDIR; |
---|
78 | } |
---|
79 | |
---|
80 | } else { |
---|
81 | |
---|
82 | $commandline = 'vorbiscomment -w --raw -c "'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; |
---|
83 | $VorbiscommentError = `$commandline`; |
---|
84 | |
---|
85 | } |
---|
86 | |
---|
87 | // Remove temporary comments file |
---|
88 | unlink($tempcommentsfilename); |
---|
89 | ignore_user_abort($oldignoreuserabort); |
---|
90 | |
---|
91 | if (!empty($VorbiscommentError)) { |
---|
92 | |
---|
93 | $this->errors[] = 'system call to vorbiscomment failed with message: '."\n\n".$VorbiscommentError; |
---|
94 | return false; |
---|
95 | |
---|
96 | } |
---|
97 | |
---|
98 | return true; |
---|
99 | } |
---|
100 | |
---|
101 | $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call vorbiscomment, tags not written'; |
---|
102 | return false; |
---|
103 | } |
---|
104 | |
---|
105 | function DeleteVorbisComment() { |
---|
106 | $this->tag_data = array(array()); |
---|
107 | return $this->WriteVorbisComment(); |
---|
108 | } |
---|
109 | |
---|
110 | function CleanVorbisCommentName($originalcommentname) { |
---|
111 | // A case-insensitive field name that may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. |
---|
112 | // ASCII 0x41 through 0x5A inclusive (A-Z) is to be considered equivalent to ASCII 0x61 through |
---|
113 | // 0x7A inclusive (a-z). |
---|
114 | |
---|
115 | // replace invalid chars with a space, return uppercase text |
---|
116 | // Thanks Chris Bolt <chris-getid3Øbolt*cx> for improving this function |
---|
117 | // note: ereg_replace() replaces nulls with empty string (not space) |
---|
118 | return strtoupper(ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname))); |
---|
119 | |
---|
120 | } |
---|
121 | |
---|
122 | } |
---|
123 | |
---|
124 | ?> |
---|