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.metaflac.php // |
---|
11 | // module for writing metaflac tags // |
---|
12 | // dependencies: /helperapps/metaflac.exe // |
---|
13 | // /// |
---|
14 | ///////////////////////////////////////////////////////////////// |
---|
15 | |
---|
16 | |
---|
17 | class getid3_write_metaflac |
---|
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_metaflac() { |
---|
26 | return true; |
---|
27 | } |
---|
28 | |
---|
29 | function WriteMetaFLAC() { |
---|
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->CleanmetaflacName($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.'metaflac.exe')) { |
---|
55 | //$commandline = '"'.GETID3_HELPERAPPSDIR.'metaflac.exe" --no-utf8-convert --remove-all-tags --import-tags-from="'.$tempcommentsfilename.'" "'.str_replace('/', '\\', $this->filename).'"'; |
---|
56 | // metaflac 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.'metaflac.exe --no-utf8-convert --remove-all-tags --import-tags-from="'.$tempcommentsfilename.'" "'.$this->filename.'" 2>&1'; |
---|
68 | $metaflacError = `$commandline`; |
---|
69 | |
---|
70 | if (empty($metaflacError)) { |
---|
71 | clearstatcache(); |
---|
72 | if ($timestampbeforewriting == filemtime($this->filename)) { |
---|
73 | $metaflacError = 'File modification timestamp has not changed - it looks like the tags were not written'; |
---|
74 | } |
---|
75 | } |
---|
76 | } else { |
---|
77 | $metaflacError = 'metaflac.exe not found in '.GETID3_HELPERAPPSDIR; |
---|
78 | } |
---|
79 | |
---|
80 | } else { |
---|
81 | |
---|
82 | // It's simpler on *nix |
---|
83 | $commandline = 'metaflac --no-utf8-convert --remove-all-tags --import-tags-from='.$tempcommentsfilename.' "'.$this->filename.'" 2>&1'; |
---|
84 | $metaflacError = `$commandline`; |
---|
85 | |
---|
86 | } |
---|
87 | |
---|
88 | // Remove temporary comments file |
---|
89 | unlink($tempcommentsfilename); |
---|
90 | ignore_user_abort($oldignoreuserabort); |
---|
91 | |
---|
92 | if (!empty($metaflacError)) { |
---|
93 | |
---|
94 | $this->errors[] = 'System call to metaflac failed with this message returned: '."\n\n".$metaflacError; |
---|
95 | return false; |
---|
96 | |
---|
97 | } |
---|
98 | |
---|
99 | return true; |
---|
100 | } |
---|
101 | |
---|
102 | $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call metaflac, tags not written'; |
---|
103 | return false; |
---|
104 | } |
---|
105 | |
---|
106 | |
---|
107 | function DeleteMetaFLAC() { |
---|
108 | |
---|
109 | if (!ini_get('safe_mode')) { |
---|
110 | |
---|
111 | $oldignoreuserabort = ignore_user_abort(true); |
---|
112 | if (GETID3_OS_ISWINDOWS) { |
---|
113 | |
---|
114 | if (file_exists(GETID3_HELPERAPPSDIR.'metaflac.exe')) { |
---|
115 | // To at least see if there was a problem, compare file modification timestamps before and after writing |
---|
116 | clearstatcache(); |
---|
117 | $timestampbeforewriting = filemtime($this->filename); |
---|
118 | |
---|
119 | $commandline = GETID3_HELPERAPPSDIR.'metaflac.exe --remove-all-tags "'.$this->filename.'" 2>&1'; |
---|
120 | $metaflacError = `$commandline`; |
---|
121 | |
---|
122 | if (empty($metaflacError)) { |
---|
123 | clearstatcache(); |
---|
124 | if ($timestampbeforewriting == filemtime($this->filename)) { |
---|
125 | $metaflacError = 'File modification timestamp has not changed - it looks like the tags were not deleted'; |
---|
126 | } |
---|
127 | } |
---|
128 | } else { |
---|
129 | $metaflacError = 'metaflac.exe not found in '.GETID3_HELPERAPPSDIR; |
---|
130 | } |
---|
131 | |
---|
132 | } else { |
---|
133 | |
---|
134 | // It's simpler on *nix |
---|
135 | $commandline = 'metaflac --remove-all-tags "'.$this->filename.'" 2>&1'; |
---|
136 | $metaflacError = `$commandline`; |
---|
137 | |
---|
138 | } |
---|
139 | |
---|
140 | ignore_user_abort($oldignoreuserabort); |
---|
141 | |
---|
142 | if (!empty($metaflacError)) { |
---|
143 | $this->errors[] = 'System call to metaflac failed with this message returned: '."\n\n".$metaflacError; |
---|
144 | return false; |
---|
145 | } |
---|
146 | return true; |
---|
147 | } |
---|
148 | $this->errors[] = 'PHP running in Safe Mode (backtick operator not available) - cannot call metaflac, tags not deleted'; |
---|
149 | return false; |
---|
150 | } |
---|
151 | |
---|
152 | |
---|
153 | function CleanmetaflacName($originalcommentname) { |
---|
154 | // A case-insensitive field name that may consist of ASCII 0x20 through 0x7D, 0x3D ('=') excluded. |
---|
155 | // ASCII 0x41 through 0x5A inclusive (A-Z) is to be considered equivalent to ASCII 0x61 through |
---|
156 | // 0x7A inclusive (a-z). |
---|
157 | |
---|
158 | // replace invalid chars with a space, return uppercase text |
---|
159 | // Thanks Chris Bolt <chris-getid3Øbolt*cx> for improving this function |
---|
160 | // note: ereg_replace() replaces nulls with empty string (not space) |
---|
161 | return strtoupper(ereg_replace('[^ -<>-}]', ' ', str_replace("\x00", ' ', $originalcommentname))); |
---|
162 | |
---|
163 | } |
---|
164 | |
---|
165 | } |
---|
166 | |
---|
167 | ?> |
---|