2 * Copyright (C) 2012-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
25 #include "StdString.h"
27 #include "music/tags/MusicInfoTag.h"
28 #include "video/VideoInfoTag.h"
30 #include "utils/StringUtils.h"
31 #include "filesystem/CurlFile.h"
35 map<string, string> fillMimeTypes()
37 map<string, string> mimeTypes;
39 mimeTypes.insert(pair<string, string>("3dm", "x-world/x-3dmf"));
40 mimeTypes.insert(pair<string, string>("3dmf", "x-world/x-3dmf"));
41 mimeTypes.insert(pair<string, string>("a", "application/octet-stream"));
42 mimeTypes.insert(pair<string, string>("aab", "application/x-authorware-bin"));
43 mimeTypes.insert(pair<string, string>("aam", "application/x-authorware-map"));
44 mimeTypes.insert(pair<string, string>("aas", "application/x-authorware-seg"));
45 mimeTypes.insert(pair<string, string>("abc", "text/vnd.abc"));
46 mimeTypes.insert(pair<string, string>("acgi", "text/html"));
47 mimeTypes.insert(pair<string, string>("afl", "video/animaflex"));
48 mimeTypes.insert(pair<string, string>("ai", "application/postscript"));
49 mimeTypes.insert(pair<string, string>("aif", "audio/aiff"));
50 mimeTypes.insert(pair<string, string>("aifc", "audio/x-aiff"));
51 mimeTypes.insert(pair<string, string>("aiff", "audio/aiff"));
52 mimeTypes.insert(pair<string, string>("aim", "application/x-aim"));
53 mimeTypes.insert(pair<string, string>("aip", "text/x-audiosoft-intra"));
54 mimeTypes.insert(pair<string, string>("ani", "application/x-navi-animation"));
55 mimeTypes.insert(pair<string, string>("aos", "application/x-nokia-9000-communicator-add-on-software"));
56 mimeTypes.insert(pair<string, string>("aps", "application/mime"));
57 mimeTypes.insert(pair<string, string>("arc", "application/octet-stream"));
58 mimeTypes.insert(pair<string, string>("arj", "application/arj"));
59 mimeTypes.insert(pair<string, string>("art", "image/x-jg"));
60 mimeTypes.insert(pair<string, string>("asf", "video/x-ms-asf"));
61 mimeTypes.insert(pair<string, string>("asm", "text/x-asm"));
62 mimeTypes.insert(pair<string, string>("asp", "text/asp"));
63 mimeTypes.insert(pair<string, string>("asx", "video/x-ms-asf"));
64 mimeTypes.insert(pair<string, string>("au", "audio/basic"));
65 mimeTypes.insert(pair<string, string>("avi", "video/avi"));
66 mimeTypes.insert(pair<string, string>("avs", "video/avs-video"));
67 mimeTypes.insert(pair<string, string>("bcpio", "application/x-bcpio"));
68 mimeTypes.insert(pair<string, string>("bin", "application/octet-stream"));
69 mimeTypes.insert(pair<string, string>("bm", "image/bmp"));
70 mimeTypes.insert(pair<string, string>("bmp", "image/bmp"));
71 mimeTypes.insert(pair<string, string>("boo", "application/book"));
72 mimeTypes.insert(pair<string, string>("book", "application/book"));
73 mimeTypes.insert(pair<string, string>("boz", "application/x-bzip2"));
74 mimeTypes.insert(pair<string, string>("bsh", "application/x-bsh"));
75 mimeTypes.insert(pair<string, string>("bz", "application/x-bzip"));
76 mimeTypes.insert(pair<string, string>("bz2", "application/x-bzip2"));
77 mimeTypes.insert(pair<string, string>("c", "text/plain"));
78 mimeTypes.insert(pair<string, string>("c++", "text/plain"));
79 mimeTypes.insert(pair<string, string>("cat", "application/vnd.ms-pki.seccat"));
80 mimeTypes.insert(pair<string, string>("cc", "text/plain"));
81 mimeTypes.insert(pair<string, string>("ccad", "application/clariscad"));
82 mimeTypes.insert(pair<string, string>("cco", "application/x-cocoa"));
83 mimeTypes.insert(pair<string, string>("cdf", "application/cdf"));
84 mimeTypes.insert(pair<string, string>("cer", "application/pkix-cert"));
85 mimeTypes.insert(pair<string, string>("cer", "application/x-x509-ca-cert"));
86 mimeTypes.insert(pair<string, string>("cha", "application/x-chat"));
87 mimeTypes.insert(pair<string, string>("chat", "application/x-chat"));
88 mimeTypes.insert(pair<string, string>("class", "application/java"));
89 mimeTypes.insert(pair<string, string>("com", "application/octet-stream"));
90 mimeTypes.insert(pair<string, string>("conf", "text/plain"));
91 mimeTypes.insert(pair<string, string>("cpio", "application/x-cpio"));
92 mimeTypes.insert(pair<string, string>("cpp", "text/x-c"));
93 mimeTypes.insert(pair<string, string>("cpt", "application/x-cpt"));
94 mimeTypes.insert(pair<string, string>("crl", "application/pkcs-crl"));
95 mimeTypes.insert(pair<string, string>("crt", "application/pkix-cert"));
96 mimeTypes.insert(pair<string, string>("csh", "application/x-csh"));
97 mimeTypes.insert(pair<string, string>("css", "text/css"));
98 mimeTypes.insert(pair<string, string>("cxx", "text/plain"));
99 mimeTypes.insert(pair<string, string>("dcr", "application/x-director"));
100 mimeTypes.insert(pair<string, string>("deepv", "application/x-deepv"));
101 mimeTypes.insert(pair<string, string>("def", "text/plain"));
102 mimeTypes.insert(pair<string, string>("der", "application/x-x509-ca-cert"));
103 mimeTypes.insert(pair<string, string>("dif", "video/x-dv"));
104 mimeTypes.insert(pair<string, string>("dir", "application/x-director"));
105 mimeTypes.insert(pair<string, string>("dl", "video/dl"));
106 mimeTypes.insert(pair<string, string>("divx", "video/x-msvideo"));
107 mimeTypes.insert(pair<string, string>("doc", "application/msword"));
108 mimeTypes.insert(pair<string, string>("docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"));
109 mimeTypes.insert(pair<string, string>("dot", "application/msword"));
110 mimeTypes.insert(pair<string, string>("dp", "application/commonground"));
111 mimeTypes.insert(pair<string, string>("drw", "application/drafting"));
112 mimeTypes.insert(pair<string, string>("dump", "application/octet-stream"));
113 mimeTypes.insert(pair<string, string>("dv", "video/x-dv"));
114 mimeTypes.insert(pair<string, string>("dvi", "application/x-dvi"));
115 mimeTypes.insert(pair<string, string>("dwf", "model/vnd.dwf"));
116 mimeTypes.insert(pair<string, string>("dwg", "image/vnd.dwg"));
117 mimeTypes.insert(pair<string, string>("dxf", "image/vnd.dwg"));
118 mimeTypes.insert(pair<string, string>("dxr", "application/x-director"));
119 mimeTypes.insert(pair<string, string>("el", "text/x-script.elisp"));
120 mimeTypes.insert(pair<string, string>("elc", "application/x-elc"));
121 mimeTypes.insert(pair<string, string>("env", "application/x-envoy"));
122 mimeTypes.insert(pair<string, string>("eps", "application/postscript"));
123 mimeTypes.insert(pair<string, string>("es", "application/x-esrehber"));
124 mimeTypes.insert(pair<string, string>("etx", "text/x-setext"));
125 mimeTypes.insert(pair<string, string>("evy", "application/envoy"));
126 mimeTypes.insert(pair<string, string>("exe", "application/octet-stream"));
127 mimeTypes.insert(pair<string, string>("f", "text/x-fortran"));
128 mimeTypes.insert(pair<string, string>("f77", "text/x-fortran"));
129 mimeTypes.insert(pair<string, string>("f90", "text/x-fortran"));
130 mimeTypes.insert(pair<string, string>("fdf", "application/vnd.fdf"));
131 mimeTypes.insert(pair<string, string>("fif", "image/fif"));
132 mimeTypes.insert(pair<string, string>("flac", "audio/flac"));
133 mimeTypes.insert(pair<string, string>("fli", "video/fli"));
134 mimeTypes.insert(pair<string, string>("flo", "image/florian"));
135 mimeTypes.insert(pair<string, string>("flv", "video/x-flv"));
136 mimeTypes.insert(pair<string, string>("flx", "text/vnd.fmi.flexstor"));
137 mimeTypes.insert(pair<string, string>("fmf", "video/x-atomic3d-feature"));
138 mimeTypes.insert(pair<string, string>("for", "text/plain"));
139 mimeTypes.insert(pair<string, string>("for", "text/x-fortran"));
140 mimeTypes.insert(pair<string, string>("fpx", "image/vnd.fpx"));
141 mimeTypes.insert(pair<string, string>("frl", "application/freeloader"));
142 mimeTypes.insert(pair<string, string>("funk", "audio/make"));
143 mimeTypes.insert(pair<string, string>("g", "text/plain"));
144 mimeTypes.insert(pair<string, string>("g3", "image/g3fax"));
145 mimeTypes.insert(pair<string, string>("gif", "image/gif"));
146 mimeTypes.insert(pair<string, string>("gl", "video/x-gl"));
147 mimeTypes.insert(pair<string, string>("gsd", "audio/x-gsm"));
148 mimeTypes.insert(pair<string, string>("gsm", "audio/x-gsm"));
149 mimeTypes.insert(pair<string, string>("gsp", "application/x-gsp"));
150 mimeTypes.insert(pair<string, string>("gss", "application/x-gss"));
151 mimeTypes.insert(pair<string, string>("gtar", "application/x-gtar"));
152 mimeTypes.insert(pair<string, string>("gz", "application/x-compressed"));
153 mimeTypes.insert(pair<string, string>("gzip", "application/x-gzip"));
154 mimeTypes.insert(pair<string, string>("h", "text/plain"));
155 mimeTypes.insert(pair<string, string>("hdf", "application/x-hdf"));
156 mimeTypes.insert(pair<string, string>("help", "application/x-helpfile"));
157 mimeTypes.insert(pair<string, string>("hgl", "application/vnd.hp-hpgl"));
158 mimeTypes.insert(pair<string, string>("hh", "text/plain"));
159 mimeTypes.insert(pair<string, string>("hlb", "text/x-script"));
160 mimeTypes.insert(pair<string, string>("hlp", "application/hlp"));
161 mimeTypes.insert(pair<string, string>("hpg", "application/vnd.hp-hpgl"));
162 mimeTypes.insert(pair<string, string>("hpgl", "application/vnd.hp-hpgl"));
163 mimeTypes.insert(pair<string, string>("hqx", "application/binhex"));
164 mimeTypes.insert(pair<string, string>("hta", "application/hta"));
165 mimeTypes.insert(pair<string, string>("htc", "text/x-component"));
166 mimeTypes.insert(pair<string, string>("htm", "text/html"));
167 mimeTypes.insert(pair<string, string>("html", "text/html"));
168 mimeTypes.insert(pair<string, string>("htmls", "text/html"));
169 mimeTypes.insert(pair<string, string>("htt", "text/webviewhtml"));
170 mimeTypes.insert(pair<string, string>("htx", "text/html"));
171 mimeTypes.insert(pair<string, string>("ice", "x-conference/x-cooltalk"));
172 mimeTypes.insert(pair<string, string>("ico", "image/x-icon"));
173 mimeTypes.insert(pair<string, string>("idc", "text/plain"));
174 mimeTypes.insert(pair<string, string>("ief", "image/ief"));
175 mimeTypes.insert(pair<string, string>("iefs", "image/ief"));
176 mimeTypes.insert(pair<string, string>("iges", "application/iges"));
177 mimeTypes.insert(pair<string, string>("igs", "application/iges"));
178 mimeTypes.insert(pair<string, string>("igs", "model/iges"));
179 mimeTypes.insert(pair<string, string>("ima", "application/x-ima"));
180 mimeTypes.insert(pair<string, string>("imap", "application/x-httpd-imap"));
181 mimeTypes.insert(pair<string, string>("inf", "application/inf"));
182 mimeTypes.insert(pair<string, string>("ins", "application/x-internett-signup"));
183 mimeTypes.insert(pair<string, string>("ip", "application/x-ip2"));
184 mimeTypes.insert(pair<string, string>("isu", "video/x-isvideo"));
185 mimeTypes.insert(pair<string, string>("it", "audio/it"));
186 mimeTypes.insert(pair<string, string>("iv", "application/x-inventor"));
187 mimeTypes.insert(pair<string, string>("ivr", "i-world/i-vrml"));
188 mimeTypes.insert(pair<string, string>("ivy", "application/x-livescreen"));
189 mimeTypes.insert(pair<string, string>("jam", "audio/x-jam"));
190 mimeTypes.insert(pair<string, string>("jav", "text/x-java-source"));
191 mimeTypes.insert(pair<string, string>("java", "text/x-java-source"));
192 mimeTypes.insert(pair<string, string>("jcm", "application/x-java-commerce"));
193 mimeTypes.insert(pair<string, string>("jfif", "image/jpeg"));
194 mimeTypes.insert(pair<string, string>("jfif-tbnl", "image/jpeg"));
195 mimeTypes.insert(pair<string, string>("jpe", "image/jpeg"));
196 mimeTypes.insert(pair<string, string>("jpeg", "image/jpeg"));
197 mimeTypes.insert(pair<string, string>("jpg", "image/jpeg"));
198 mimeTypes.insert(pair<string, string>("jps", "image/x-jps"));
199 mimeTypes.insert(pair<string, string>("js", "application/javascript"));
200 mimeTypes.insert(pair<string, string>("json", "application/json"));
201 mimeTypes.insert(pair<string, string>("jut", "image/jutvision"));
202 mimeTypes.insert(pair<string, string>("kar", "music/x-karaoke"));
203 mimeTypes.insert(pair<string, string>("ksh", "application/x-ksh"));
204 mimeTypes.insert(pair<string, string>("ksh", "text/x-script.ksh"));
205 mimeTypes.insert(pair<string, string>("la", "audio/nspaudio"));
206 mimeTypes.insert(pair<string, string>("lam", "audio/x-liveaudio"));
207 mimeTypes.insert(pair<string, string>("latex", "application/x-latex"));
208 mimeTypes.insert(pair<string, string>("lha", "application/lha"));
209 mimeTypes.insert(pair<string, string>("lhx", "application/octet-stream"));
210 mimeTypes.insert(pair<string, string>("list", "text/plain"));
211 mimeTypes.insert(pair<string, string>("lma", "audio/nspaudio"));
212 mimeTypes.insert(pair<string, string>("log", "text/plain"));
213 mimeTypes.insert(pair<string, string>("lsp", "application/x-lisp"));
214 mimeTypes.insert(pair<string, string>("lst", "text/plain"));
215 mimeTypes.insert(pair<string, string>("lsx", "text/x-la-asf"));
216 mimeTypes.insert(pair<string, string>("ltx", "application/x-latex"));
217 mimeTypes.insert(pair<string, string>("lzh", "application/x-lzh"));
218 mimeTypes.insert(pair<string, string>("lzx", "application/lzx"));
219 mimeTypes.insert(pair<string, string>("m", "text/x-m"));
220 mimeTypes.insert(pair<string, string>("m1v", "video/mpeg"));
221 mimeTypes.insert(pair<string, string>("m2a", "audio/mpeg"));
222 mimeTypes.insert(pair<string, string>("m2v", "video/mpeg"));
223 mimeTypes.insert(pair<string, string>("m3u", "audio/x-mpequrl"));
224 mimeTypes.insert(pair<string, string>("man", "application/x-troff-man"));
225 mimeTypes.insert(pair<string, string>("map", "application/x-navimap"));
226 mimeTypes.insert(pair<string, string>("mar", "text/plain"));
227 mimeTypes.insert(pair<string, string>("mbd", "application/mbedlet"));
228 mimeTypes.insert(pair<string, string>("mc$", "application/x-magic-cap-package-1.0"));
229 mimeTypes.insert(pair<string, string>("mcd", "application/x-mathcad"));
230 mimeTypes.insert(pair<string, string>("mcf", "text/mcf"));
231 mimeTypes.insert(pair<string, string>("mcp", "application/netmc"));
232 mimeTypes.insert(pair<string, string>("me", "application/x-troff-me"));
233 mimeTypes.insert(pair<string, string>("mht", "message/rfc822"));
234 mimeTypes.insert(pair<string, string>("mhtml", "message/rfc822"));
235 mimeTypes.insert(pair<string, string>("mid", "audio/midi"));
236 mimeTypes.insert(pair<string, string>("midi", "audio/midi"));
237 mimeTypes.insert(pair<string, string>("mif", "application/x-mif"));
238 mimeTypes.insert(pair<string, string>("mime", "message/rfc822"));
239 mimeTypes.insert(pair<string, string>("mjf", "audio/x-vnd.audioexplosion.mjuicemediafile"));
240 mimeTypes.insert(pair<string, string>("mjpg", "video/x-motion-jpeg"));
241 mimeTypes.insert(pair<string, string>("mka", "audio/x-matroska"));
242 mimeTypes.insert(pair<string, string>("mkv", "video/x-matroska"));
243 mimeTypes.insert(pair<string, string>("mm", "application/x-meme"));
244 mimeTypes.insert(pair<string, string>("mme", "application/base64"));
245 mimeTypes.insert(pair<string, string>("mod", "audio/mod"));
246 mimeTypes.insert(pair<string, string>("moov", "video/quicktime"));
247 mimeTypes.insert(pair<string, string>("mov", "video/quicktime"));
248 mimeTypes.insert(pair<string, string>("movie", "video/x-sgi-movie"));
249 mimeTypes.insert(pair<string, string>("mp2", "audio/mpeg"));
250 mimeTypes.insert(pair<string, string>("mp3", "audio/mpeg3"));
251 mimeTypes.insert(pair<string, string>("mp4", "video/mp4"));
252 mimeTypes.insert(pair<string, string>("mpa", "audio/mpeg"));
253 mimeTypes.insert(pair<string, string>("mpc", "application/x-project"));
254 mimeTypes.insert(pair<string, string>("mpe", "video/mpeg"));
255 mimeTypes.insert(pair<string, string>("mpeg", "video/mpeg"));
256 mimeTypes.insert(pair<string, string>("mpg", "video/mpeg"));
257 mimeTypes.insert(pair<string, string>("mpga", "audio/mpeg"));
258 mimeTypes.insert(pair<string, string>("mpp", "application/vnd.ms-project"));
259 mimeTypes.insert(pair<string, string>("mpt", "application/x-project"));
260 mimeTypes.insert(pair<string, string>("mpv", "application/x-project"));
261 mimeTypes.insert(pair<string, string>("mpx", "application/x-project"));
262 mimeTypes.insert(pair<string, string>("mrc", "application/marc"));
263 mimeTypes.insert(pair<string, string>("ms", "application/x-troff-ms"));
264 mimeTypes.insert(pair<string, string>("mv", "video/x-sgi-movie"));
265 mimeTypes.insert(pair<string, string>("my", "audio/make"));
266 mimeTypes.insert(pair<string, string>("mzz", "application/x-vnd.audioexplosion.mzz"));
267 mimeTypes.insert(pair<string, string>("nap", "image/naplps"));
268 mimeTypes.insert(pair<string, string>("naplps", "image/naplps"));
269 mimeTypes.insert(pair<string, string>("nc", "application/x-netcdf"));
270 mimeTypes.insert(pair<string, string>("ncm", "application/vnd.nokia.configuration-message"));
271 mimeTypes.insert(pair<string, string>("nfo", "text/xml"));
272 mimeTypes.insert(pair<string, string>("nif", "image/x-niff"));
273 mimeTypes.insert(pair<string, string>("niff", "image/x-niff"));
274 mimeTypes.insert(pair<string, string>("nix", "application/x-mix-transfer"));
275 mimeTypes.insert(pair<string, string>("nsc", "application/x-conference"));
276 mimeTypes.insert(pair<string, string>("nvd", "application/x-navidoc"));
277 mimeTypes.insert(pair<string, string>("o", "application/octet-stream"));
278 mimeTypes.insert(pair<string, string>("oda", "application/oda"));
279 mimeTypes.insert(pair<string, string>("ogg", "audio/ogg"));
280 mimeTypes.insert(pair<string, string>("omc", "application/x-omc"));
281 mimeTypes.insert(pair<string, string>("omcd", "application/x-omcdatamaker"));
282 mimeTypes.insert(pair<string, string>("omcr", "application/x-omcregerator"));
283 mimeTypes.insert(pair<string, string>("p", "text/x-pascal"));
284 mimeTypes.insert(pair<string, string>("p10", "application/pkcs10"));
285 mimeTypes.insert(pair<string, string>("p12", "application/pkcs-12"));
286 mimeTypes.insert(pair<string, string>("p7a", "application/x-pkcs7-signature"));
287 mimeTypes.insert(pair<string, string>("p7c", "application/pkcs7-mime"));
288 mimeTypes.insert(pair<string, string>("p7m", "application/pkcs7-mime"));
289 mimeTypes.insert(pair<string, string>("p7r", "application/x-pkcs7-certreqresp"));
290 mimeTypes.insert(pair<string, string>("p7s", "application/pkcs7-signature"));
291 mimeTypes.insert(pair<string, string>("part", "application/pro_eng"));
292 mimeTypes.insert(pair<string, string>("pas", "text/pascal"));
293 mimeTypes.insert(pair<string, string>("pbm", "image/x-portable-bitmap"));
294 mimeTypes.insert(pair<string, string>("pcl", "application/vnd.hp-pcl"));
295 mimeTypes.insert(pair<string, string>("pct", "image/x-pict"));
296 mimeTypes.insert(pair<string, string>("pcx", "image/x-pcx"));
297 mimeTypes.insert(pair<string, string>("pdb", "chemical/x-pdb"));
298 mimeTypes.insert(pair<string, string>("pdf", "application/pdf"));
299 mimeTypes.insert(pair<string, string>("pfunk", "audio/make.my.funk"));
300 mimeTypes.insert(pair<string, string>("pgm", "image/x-portable-greymap"));
301 mimeTypes.insert(pair<string, string>("pic", "image/pict"));
302 mimeTypes.insert(pair<string, string>("pict", "image/pict"));
303 mimeTypes.insert(pair<string, string>("pkg", "application/x-newton-compatible-pkg"));
304 mimeTypes.insert(pair<string, string>("pko", "application/vnd.ms-pki.pko"));
305 mimeTypes.insert(pair<string, string>("pl", "text/x-script.perl"));
306 mimeTypes.insert(pair<string, string>("plx", "application/x-pixclscript"));
307 mimeTypes.insert(pair<string, string>("pm", "text/x-script.perl-module"));
308 mimeTypes.insert(pair<string, string>("pm4", "application/x-pagemaker"));
309 mimeTypes.insert(pair<string, string>("pm5", "application/x-pagemaker"));
310 mimeTypes.insert(pair<string, string>("png", "image/png"));
311 mimeTypes.insert(pair<string, string>("pnm", "application/x-portable-anymap"));
312 mimeTypes.insert(pair<string, string>("pot", "application/vnd.ms-powerpoint"));
313 mimeTypes.insert(pair<string, string>("pov", "model/x-pov"));
314 mimeTypes.insert(pair<string, string>("ppa", "application/vnd.ms-powerpoint"));
315 mimeTypes.insert(pair<string, string>("ppm", "image/x-portable-pixmap"));
316 mimeTypes.insert(pair<string, string>("pps", "application/mspowerpoint"));
317 mimeTypes.insert(pair<string, string>("ppt", "application/mspowerpoint"));
318 mimeTypes.insert(pair<string, string>("ppz", "application/mspowerpoint"));
319 mimeTypes.insert(pair<string, string>("pre", "application/x-freelance"));
320 mimeTypes.insert(pair<string, string>("prt", "application/pro_eng"));
321 mimeTypes.insert(pair<string, string>("ps", "application/postscript"));
322 mimeTypes.insert(pair<string, string>("psd", "application/octet-stream"));
323 mimeTypes.insert(pair<string, string>("pvu", "paleovu/x-pv"));
324 mimeTypes.insert(pair<string, string>("pwz", "application/vnd.ms-powerpoint"));
325 mimeTypes.insert(pair<string, string>("py", "text/x-script.phyton"));
326 mimeTypes.insert(pair<string, string>("pyc", "applicaiton/x-bytecode.python"));
327 mimeTypes.insert(pair<string, string>("qcp", "audio/vnd.qcelp"));
328 mimeTypes.insert(pair<string, string>("qd3", "x-world/x-3dmf"));
329 mimeTypes.insert(pair<string, string>("qd3d", "x-world/x-3dmf"));
330 mimeTypes.insert(pair<string, string>("qif", "image/x-quicktime"));
331 mimeTypes.insert(pair<string, string>("qt", "video/quicktime"));
332 mimeTypes.insert(pair<string, string>("qtc", "video/x-qtc"));
333 mimeTypes.insert(pair<string, string>("qti", "image/x-quicktime"));
334 mimeTypes.insert(pair<string, string>("qtif", "image/x-quicktime"));
335 mimeTypes.insert(pair<string, string>("ra", "audio/x-realaudio"));
336 mimeTypes.insert(pair<string, string>("ram", "audio/x-pn-realaudio"));
337 mimeTypes.insert(pair<string, string>("ras", "image/cmu-raster"));
338 mimeTypes.insert(pair<string, string>("rast", "image/cmu-raster"));
339 mimeTypes.insert(pair<string, string>("rexx", "text/x-script.rexx"));
340 mimeTypes.insert(pair<string, string>("rf", "image/vnd.rn-realflash"));
341 mimeTypes.insert(pair<string, string>("rgb", "image/x-rgb"));
342 mimeTypes.insert(pair<string, string>("rm", "audio/x-pn-realaudio"));
343 mimeTypes.insert(pair<string, string>("rmi", "audio/mid"));
344 mimeTypes.insert(pair<string, string>("rmm", "audio/x-pn-realaudio"));
345 mimeTypes.insert(pair<string, string>("rmp", "audio/x-pn-realaudio"));
346 mimeTypes.insert(pair<string, string>("rng", "application/ringing-tones"));
347 mimeTypes.insert(pair<string, string>("rnx", "application/vnd.rn-realplayer"));
348 mimeTypes.insert(pair<string, string>("roff", "application/x-troff"));
349 mimeTypes.insert(pair<string, string>("rp", "image/vnd.rn-realpix"));
350 mimeTypes.insert(pair<string, string>("rpm", "audio/x-pn-realaudio-plugin"));
351 mimeTypes.insert(pair<string, string>("rt", "text/richtext"));
352 mimeTypes.insert(pair<string, string>("rtf", "text/richtext"));
353 mimeTypes.insert(pair<string, string>("rtx", "text/richtext"));
354 mimeTypes.insert(pair<string, string>("rv", "video/vnd.rn-realvideo"));
355 mimeTypes.insert(pair<string, string>("s", "text/x-asm"));
356 mimeTypes.insert(pair<string, string>("s3m", "audio/s3m"));
357 mimeTypes.insert(pair<string, string>("saveme", "application/octet-stream"));
358 mimeTypes.insert(pair<string, string>("sbk", "application/x-tbook"));
359 mimeTypes.insert(pair<string, string>("scm", "video/x-scm"));
360 mimeTypes.insert(pair<string, string>("sdml", "text/plain"));
361 mimeTypes.insert(pair<string, string>("sdp", "application/sdp"));
362 mimeTypes.insert(pair<string, string>("sdr", "application/sounder"));
363 mimeTypes.insert(pair<string, string>("sea", "application/sea"));
364 mimeTypes.insert(pair<string, string>("set", "application/set"));
365 mimeTypes.insert(pair<string, string>("sgm", "text/sgml"));
366 mimeTypes.insert(pair<string, string>("sgml", "text/sgml"));
367 mimeTypes.insert(pair<string, string>("sh", "text/x-script.sh"));
368 mimeTypes.insert(pair<string, string>("shar", "application/x-bsh"));
369 mimeTypes.insert(pair<string, string>("shtml", "text/html"));
370 mimeTypes.insert(pair<string, string>("shtml", "text/x-server-parsed-html"));
371 mimeTypes.insert(pair<string, string>("sid", "audio/x-psid"));
372 mimeTypes.insert(pair<string, string>("sit", "application/x-sit"));
373 mimeTypes.insert(pair<string, string>("sit", "application/x-stuffit"));
374 mimeTypes.insert(pair<string, string>("skd", "application/x-koan"));
375 mimeTypes.insert(pair<string, string>("skm", "application/x-koan"));
376 mimeTypes.insert(pair<string, string>("skp", "application/x-koan"));
377 mimeTypes.insert(pair<string, string>("skt", "application/x-koan"));
378 mimeTypes.insert(pair<string, string>("sl", "application/x-seelogo"));
379 mimeTypes.insert(pair<string, string>("smi", "application/smil"));
380 mimeTypes.insert(pair<string, string>("smil", "application/smil"));
381 mimeTypes.insert(pair<string, string>("snd", "audio/basic"));
382 mimeTypes.insert(pair<string, string>("sol", "application/solids"));
383 mimeTypes.insert(pair<string, string>("spc", "text/x-speech"));
384 mimeTypes.insert(pair<string, string>("spl", "application/futuresplash"));
385 mimeTypes.insert(pair<string, string>("spr", "application/x-sprite"));
386 mimeTypes.insert(pair<string, string>("sprite", "application/x-sprite"));
387 mimeTypes.insert(pair<string, string>("src", "application/x-wais-source"));
388 mimeTypes.insert(pair<string, string>("ssi", "text/x-server-parsed-html"));
389 mimeTypes.insert(pair<string, string>("ssm", "application/streamingmedia"));
390 mimeTypes.insert(pair<string, string>("sst", "application/vnd.ms-pki.certstore"));
391 mimeTypes.insert(pair<string, string>("step", "application/step"));
392 mimeTypes.insert(pair<string, string>("stl", "application/sla"));
393 mimeTypes.insert(pair<string, string>("stp", "application/step"));
394 mimeTypes.insert(pair<string, string>("sv4cpio", "application/x-sv4cpio"));
395 mimeTypes.insert(pair<string, string>("sv4crc", "application/x-sv4crc"));
396 mimeTypes.insert(pair<string, string>("svf", "image/vnd.dwg"));
397 mimeTypes.insert(pair<string, string>("svr", "application/x-world"));
398 mimeTypes.insert(pair<string, string>("swf", "application/x-shockwave-flash"));
399 mimeTypes.insert(pair<string, string>("t", "application/x-troff"));
400 mimeTypes.insert(pair<string, string>("talk", "text/x-speech"));
401 mimeTypes.insert(pair<string, string>("tar", "application/x-tar"));
402 mimeTypes.insert(pair<string, string>("tbk", "application/toolbook"));
403 mimeTypes.insert(pair<string, string>("tcl", "text/x-script.tcl"));
404 mimeTypes.insert(pair<string, string>("tcsh", "text/x-script.tcsh"));
405 mimeTypes.insert(pair<string, string>("tex", "application/x-tex"));
406 mimeTypes.insert(pair<string, string>("texi", "application/x-texinfo"));
407 mimeTypes.insert(pair<string, string>("texinfo", "application/x-texinfo"));
408 mimeTypes.insert(pair<string, string>("text", "text/plain"));
409 mimeTypes.insert(pair<string, string>("tgz", "application/x-compressed"));
410 mimeTypes.insert(pair<string, string>("tif", "image/tiff"));
411 mimeTypes.insert(pair<string, string>("tiff", "image/tiff"));
412 mimeTypes.insert(pair<string, string>("tr", "application/x-troff"));
413 mimeTypes.insert(pair<string, string>("ts", "video/mp2t"));
414 mimeTypes.insert(pair<string, string>("tsi", "audio/tsp-audio"));
415 mimeTypes.insert(pair<string, string>("tsp", "audio/tsplayer"));
416 mimeTypes.insert(pair<string, string>("tsv", "text/tab-separated-values"));
417 mimeTypes.insert(pair<string, string>("turbot", "image/florian"));
418 mimeTypes.insert(pair<string, string>("txt", "text/plain"));
419 mimeTypes.insert(pair<string, string>("uil", "text/x-uil"));
420 mimeTypes.insert(pair<string, string>("uni", "text/uri-list"));
421 mimeTypes.insert(pair<string, string>("unis", "text/uri-list"));
422 mimeTypes.insert(pair<string, string>("unv", "application/i-deas"));
423 mimeTypes.insert(pair<string, string>("uri", "text/uri-list"));
424 mimeTypes.insert(pair<string, string>("uris", "text/uri-list"));
425 mimeTypes.insert(pair<string, string>("ustar", "application/x-ustar"));
426 mimeTypes.insert(pair<string, string>("uu", "text/x-uuencode"));
427 mimeTypes.insert(pair<string, string>("uue", "text/x-uuencode"));
428 mimeTypes.insert(pair<string, string>("vcd", "application/x-cdlink"));
429 mimeTypes.insert(pair<string, string>("vcs", "text/x-vcalendar"));
430 mimeTypes.insert(pair<string, string>("vda", "application/vda"));
431 mimeTypes.insert(pair<string, string>("vdo", "video/vdo"));
432 mimeTypes.insert(pair<string, string>("vew", "application/groupwise"));
433 mimeTypes.insert(pair<string, string>("viv", "video/vivo"));
434 mimeTypes.insert(pair<string, string>("vivo", "video/vivo"));
435 mimeTypes.insert(pair<string, string>("vmd", "application/vocaltec-media-desc"));
436 mimeTypes.insert(pair<string, string>("vmf", "application/vocaltec-media-file"));
437 mimeTypes.insert(pair<string, string>("voc", "audio/voc"));
438 mimeTypes.insert(pair<string, string>("vos", "video/vosaic"));
439 mimeTypes.insert(pair<string, string>("vox", "audio/voxware"));
440 mimeTypes.insert(pair<string, string>("vqe", "audio/x-twinvq-plugin"));
441 mimeTypes.insert(pair<string, string>("vqf", "audio/x-twinvq"));
442 mimeTypes.insert(pair<string, string>("vql", "audio/x-twinvq-plugin"));
443 mimeTypes.insert(pair<string, string>("vrml", "application/x-vrml"));
444 mimeTypes.insert(pair<string, string>("vrt", "x-world/x-vrt"));
445 mimeTypes.insert(pair<string, string>("vsd", "application/x-visio"));
446 mimeTypes.insert(pair<string, string>("vst", "application/x-visio"));
447 mimeTypes.insert(pair<string, string>("vsw", "application/x-visio"));
448 mimeTypes.insert(pair<string, string>("w60", "application/wordperfect6.0"));
449 mimeTypes.insert(pair<string, string>("w61", "application/wordperfect6.1"));
450 mimeTypes.insert(pair<string, string>("w6w", "application/msword"));
451 mimeTypes.insert(pair<string, string>("wav", "audio/wav"));
452 mimeTypes.insert(pair<string, string>("wb1", "application/x-qpro"));
453 mimeTypes.insert(pair<string, string>("wbmp", "image/vnd.wap.wbmp"));
454 mimeTypes.insert(pair<string, string>("web", "application/vnd.xara"));
455 mimeTypes.insert(pair<string, string>("wiz", "application/msword"));
456 mimeTypes.insert(pair<string, string>("wk1", "application/x-123"));
457 mimeTypes.insert(pair<string, string>("wma", "audio/x-ms-wma"));
458 mimeTypes.insert(pair<string, string>("wmf", "windows/metafile"));
459 mimeTypes.insert(pair<string, string>("wml", "text/vnd.wap.wml"));
460 mimeTypes.insert(pair<string, string>("wmlc", "application/vnd.wap.wmlc"));
461 mimeTypes.insert(pair<string, string>("wmls", "text/vnd.wap.wmlscript"));
462 mimeTypes.insert(pair<string, string>("wmlsc", "application/vnd.wap.wmlscriptc"));
463 mimeTypes.insert(pair<string, string>("wmv", "video/x-ms-wmv"));
464 mimeTypes.insert(pair<string, string>("word", "application/msword"));
465 mimeTypes.insert(pair<string, string>("wp", "application/wordperfect"));
466 mimeTypes.insert(pair<string, string>("wp5", "application/wordperfect"));
467 mimeTypes.insert(pair<string, string>("wp6", "application/wordperfect"));
468 mimeTypes.insert(pair<string, string>("wpd", "application/wordperfect"));
469 mimeTypes.insert(pair<string, string>("wq1", "application/x-lotus"));
470 mimeTypes.insert(pair<string, string>("wri", "application/mswrite"));
471 mimeTypes.insert(pair<string, string>("wrl", "model/vrml"));
472 mimeTypes.insert(pair<string, string>("wrz", "model/vrml"));
473 mimeTypes.insert(pair<string, string>("wsc", "text/scriplet"));
474 mimeTypes.insert(pair<string, string>("wsrc", "application/x-wais-source"));
475 mimeTypes.insert(pair<string, string>("wtk", "application/x-wintalk"));
476 mimeTypes.insert(pair<string, string>("xbm", "image/xbm"));
477 mimeTypes.insert(pair<string, string>("xdr", "video/x-amt-demorun"));
478 mimeTypes.insert(pair<string, string>("xgz", "xgl/drawing"));
479 mimeTypes.insert(pair<string, string>("xif", "image/vnd.xiff"));
480 mimeTypes.insert(pair<string, string>("xl", "application/excel"));
481 mimeTypes.insert(pair<string, string>("xla", "application/excel"));
482 mimeTypes.insert(pair<string, string>("xlb", "application/excel"));
483 mimeTypes.insert(pair<string, string>("xlc", "application/excel"));
484 mimeTypes.insert(pair<string, string>("xld", "application/excel"));
485 mimeTypes.insert(pair<string, string>("xlk", "application/excel"));
486 mimeTypes.insert(pair<string, string>("xll", "application/excel"));
487 mimeTypes.insert(pair<string, string>("xlm", "application/excel"));
488 mimeTypes.insert(pair<string, string>("xls", "application/excel"));
489 mimeTypes.insert(pair<string, string>("xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
490 mimeTypes.insert(pair<string, string>("xlt", "application/excel"));
491 mimeTypes.insert(pair<string, string>("xlv", "application/excel"));
492 mimeTypes.insert(pair<string, string>("xlw", "application/excel"));
493 mimeTypes.insert(pair<string, string>("xm", "audio/xm"));
494 mimeTypes.insert(pair<string, string>("xml", "text/xml"));
495 mimeTypes.insert(pair<string, string>("xmz", "xgl/movie"));
496 mimeTypes.insert(pair<string, string>("xpix", "application/x-vnd.ls-xpix"));
497 mimeTypes.insert(pair<string, string>("xpm", "image/xpm"));
498 mimeTypes.insert(pair<string, string>("x-png", "image/png"));
499 mimeTypes.insert(pair<string, string>("xsr", "video/x-amt-showrun"));
500 mimeTypes.insert(pair<string, string>("xvid", "video/x-msvideo"));
501 mimeTypes.insert(pair<string, string>("xwd", "image/x-xwd"));
502 mimeTypes.insert(pair<string, string>("xyz", "chemical/x-pdb"));
503 mimeTypes.insert(pair<string, string>("z", "application/x-compressed"));
504 mimeTypes.insert(pair<string, string>("zip", "application/zip"));
505 mimeTypes.insert(pair<string, string>("zoo", "application/octet-stream"));
506 mimeTypes.insert(pair<string, string>("zsh", "text/x-script.zsh"));
511 map<string, string> CMime::m_mimetypes = fillMimeTypes();
513 string CMime::GetMimeType(const string &extension)
515 if (extension.empty())
518 string ext = extension;
519 size_t posNotPoint = ext.find_first_not_of('.');
520 if (posNotPoint != string::npos && posNotPoint > 0)
521 ext = extension.substr(posNotPoint);
522 transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
524 map<string, string>::const_iterator it = m_mimetypes.find(ext);
525 if (it != m_mimetypes.end())
531 string CMime::GetMimeType(const CFileItem &item)
533 CStdString path = item.GetPath();
534 if (item.HasVideoInfoTag() && !item.GetVideoInfoTag()->GetPath().empty())
535 path = item.GetVideoInfoTag()->GetPath();
536 else if (item.HasMusicInfoTag() && !item.GetMusicInfoTag()->GetURL().empty())
537 path = item.GetMusicInfoTag()->GetURL();
539 return GetMimeType(URIUtils::GetExtension(path));
542 string CMime::GetMimeType(const CURL &url, bool lookup)
545 std::string strMimeType;
547 if( url.GetProtocol() == "shout" || url.GetProtocol() == "http" || url.GetProtocol() == "https")
549 // If lookup is false, bail out early to leave mime type empty
554 XFILE::CCurlFile::GetMimeType(url, strmime);
556 // try to get mime-type again but with an NSPlayer User-Agent
557 // in order for server to provide correct mime-type. Allows us
558 // to properly detect an MMS stream
559 if (StringUtils::StartsWithNoCase(strmime, "video/x-ms-"))
560 XFILE::CCurlFile::GetMimeType(url, strmime, "NSPlayer/11.00.6001.7000");
562 // make sure there are no options set in mime-type
563 // mime-type can look like "video/x-ms-asf ; charset=utf8"
564 size_t i = strmime.find(';');
565 if(i != std::string::npos)
566 strmime.erase(i, strmime.length() - i);
567 StringUtils::Trim(strmime);
568 strMimeType = strmime;
571 strMimeType = GetMimeType(url.GetFileType());
573 // if it's still empty set to an unknown type
574 if (strMimeType.empty())
575 strMimeType = "application/octet-stream";
580 CMime::EFileType CMime::GetFileTypeFromMime(const std::string& mimeType)
582 // based on http://mimesniff.spec.whatwg.org/
584 std::string type, subtype;
585 if (!parseMimeType(mimeType, type, subtype))
586 return FileTypeUnknown;
588 if (type == "application")
590 if (subtype == "zip")
592 if (subtype == "x-gzip")
594 if (subtype == "x-rar-compressed")
597 if (subtype == "xml")
600 else if (type == "text")
602 if (subtype == "xml")
604 if (subtype == "html")
606 if (subtype == "plain")
607 return FileTypePlainText;
609 else if (type == "image")
611 if (subtype == "bmp")
613 if (subtype == "gif")
615 if (subtype == "png")
617 if (subtype == "jpeg" || subtype == "pjpeg")
621 if (StringUtils::EndsWith(subtype, "+zip"))
623 if (StringUtils::EndsWith(subtype, "+xml"))
626 return FileTypeUnknown;
629 CMime::EFileType CMime::GetFileTypeFromContent(const std::string& fileContent)
631 // based on http://mimesniff.spec.whatwg.org/#matching-a-mime-type-pattern
633 const size_t len = fileContent.length();
635 return FileTypeUnknown;
637 const unsigned char* const b = (const unsigned char*)fileContent.c_str();
639 // TODO: add detection for text types
642 if (b[0] == 'B' && b[1] == 'M')
644 if (len >= 6 && b[0] == 'G' && b[1] == 'I' && b[2] == 'F' && b[3] == '8' && (b[4] == '7' || b[4] == '9') && b[5] == 'a')
646 if (len >= 8 && b[0] == 0x89 && b[1] == 'P' && b[2] == 'N' && b[3] == 'G' && b[4] == 0x0D && b[5] == 0x0A && b[6] == 0x1A && b[7] == 0x0A)
648 if (len >= 3 && b[0] == 0xFF && b[1] == 0xD8 && b[2] == 0xFF)
651 // check archive types
652 if (len >= 3 && b[0] == 0x1F && b[1] == 0x8B && b[2] == 0x08)
654 if (len >= 4 && b[0] == 'P' && b[1] == 'K' && b[2] == 0x03 && b[3] == 0x04)
656 if (len >= 7 && b[0] == 'R' && b[1] == 'a' && b[2] == 'r' && b[3] == ' ' && b[4] == 0x1A && b[5] == 0x07 && b[6] == 0x00)
659 // TODO: add detection for other types if required
661 return FileTypeUnknown;
664 bool CMime::parseMimeType(const std::string& mimeType, std::string& type, std::string& subtype)
666 static const char* const whitespaceChars = "\x09\x0A\x0C\x0D\x20"; // tab, LF, FF, CR and space
671 const size_t slashPos = mimeType.find('/');
672 if (slashPos == std::string::npos)
675 type.assign(mimeType, 0, slashPos);
676 subtype.assign(mimeType, slashPos + 1, std::string::npos);
678 const size_t semicolonPos = subtype.find(';');
679 if (semicolonPos != std::string::npos)
680 subtype.erase(semicolonPos);
682 StringUtils::Trim(type, whitespaceChars);
683 StringUtils::Trim(subtype, whitespaceChars);
685 if (type.empty() || subtype.empty())
692 StringUtils::ToLower(type);
693 StringUtils::ToLower(subtype);