Merge pull request #4676 from jmarshallnz/dont_set_scraper_on_tvshow_on_nfo
[vuplus_xbmc] / xbmc / utils / Mime.cpp
1 /*
2  *      Copyright (C) 2012-2013 Team XBMC
3  *      http://xbmc.org
4  *
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)
8  *  any later version.
9  *
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.
14  *
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/>.
18  *
19  */
20
21 #include <algorithm>
22
23 #include "Mime.h"
24 #include "FileItem.h"
25 #include "StdString.h"
26 #include "URIUtils.h"
27 #include "music/tags/MusicInfoTag.h"
28 #include "video/VideoInfoTag.h"
29 #include "URL.h"
30 #include "utils/StringUtils.h"
31 #include "filesystem/CurlFile.h"
32
33 using namespace std;
34
35 map<string, string> fillMimeTypes()
36 {
37   map<string, string> mimeTypes;
38
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"));
507
508   return mimeTypes;
509 }
510
511 map<string, string> CMime::m_mimetypes = fillMimeTypes();
512
513 string CMime::GetMimeType(const string &extension)
514 {
515   if (extension.empty())
516     return "";
517
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);
523
524   map<string, string>::const_iterator it = m_mimetypes.find(ext);
525   if (it != m_mimetypes.end())
526     return it->second;
527
528   return "";
529 }
530
531 string CMime::GetMimeType(const CFileItem &item)
532 {
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();
538
539   return GetMimeType(URIUtils::GetExtension(path));
540 }
541
542 string CMime::GetMimeType(const CURL &url, bool lookup)
543 {
544   
545   std::string strMimeType;
546
547   if( url.GetProtocol() == "shout" || url.GetProtocol() == "http" || url.GetProtocol() == "https")
548   {
549     // If lookup is false, bail out early to leave mime type empty
550     if (!lookup)
551       return strMimeType;
552
553     CStdString strmime;
554     XFILE::CCurlFile::GetMimeType(url, strmime);
555
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");
561
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;
569   }
570   else
571     strMimeType = GetMimeType(url.GetFileType());
572
573   // if it's still empty set to an unknown type
574   if (strMimeType.empty())
575     strMimeType = "application/octet-stream";
576
577   return strMimeType;
578 }
579
580 CMime::EFileType CMime::GetFileTypeFromMime(const std::string& mimeType)
581 {
582   // based on http://mimesniff.spec.whatwg.org/
583
584   std::string type, subtype;
585   if (!parseMimeType(mimeType, type, subtype))
586     return FileTypeUnknown;
587
588   if (type == "application")
589   {
590     if (subtype == "zip")
591       return FileTypeZip;
592     if (subtype == "x-gzip")
593       return FileTypeGZip;
594     if (subtype == "x-rar-compressed")
595       return FileTypeRar;
596
597     if (subtype == "xml")
598       return FileTypeXml;
599   }
600   else if (type == "text")
601   {
602     if (subtype == "xml")
603       return FileTypeXml;
604     if (subtype == "html")
605       return FileTypeHtml;
606     if (subtype == "plain")
607       return FileTypePlainText;
608   }
609   else if (type == "image")
610   {
611     if (subtype == "bmp")
612       return FileTypeBmp;
613     if (subtype == "gif")
614       return FileTypeGif;
615     if (subtype == "png")
616       return FileTypePng;
617     if (subtype == "jpeg" || subtype == "pjpeg")
618       return FileTypeJpeg;
619   }
620
621   if (StringUtils::EndsWith(subtype, "+zip"))
622     return FileTypeZip;
623   if (StringUtils::EndsWith(subtype, "+xml"))
624     return FileTypeXml;
625
626   return FileTypeUnknown;
627 }
628
629 CMime::EFileType CMime::GetFileTypeFromContent(const std::string& fileContent)
630 {
631   // based on http://mimesniff.spec.whatwg.org/#matching-a-mime-type-pattern
632
633   const size_t len = fileContent.length();
634   if (len < 2)
635     return FileTypeUnknown;
636
637   const unsigned char* const b = (const unsigned char*)fileContent.c_str();
638
639   // TODO: add detection for text types
640
641   // check image types
642   if (b[0] == 'B' && b[1] == 'M')
643     return FileTypeBmp;
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')
645     return FileTypeGif;
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)
647     return FileTypePng;
648   if (len >= 3 && b[0] == 0xFF && b[1] == 0xD8 && b[2] == 0xFF)
649     return FileTypeJpeg;
650
651   // check archive types
652   if (len >= 3 && b[0] == 0x1F && b[1] == 0x8B && b[2] == 0x08)
653     return FileTypeGZip;
654   if (len >= 4 && b[0] == 'P' && b[1] == 'K' && b[2] == 0x03 && b[3] == 0x04)
655     return FileTypeZip;
656   if (len >= 7 && b[0] == 'R' && b[1] == 'a' && b[2] == 'r' && b[3] == ' ' && b[4] == 0x1A && b[5] == 0x07 && b[6] == 0x00)
657     return FileTypeRar;
658
659   // TODO: add detection for other types if required
660
661   return FileTypeUnknown;
662 }
663
664 bool CMime::parseMimeType(const std::string& mimeType, std::string& type, std::string& subtype)
665 {
666   static const char* const whitespaceChars = "\x09\x0A\x0C\x0D\x20"; // tab, LF, FF, CR and space
667
668   type.clear();
669   subtype.clear();
670
671   const size_t slashPos = mimeType.find('/');
672   if (slashPos == std::string::npos)
673     return false;
674
675   type.assign(mimeType, 0, slashPos);
676   subtype.assign(mimeType, slashPos + 1, std::string::npos);
677
678   const size_t semicolonPos = subtype.find(';');
679   if (semicolonPos != std::string::npos)
680     subtype.erase(semicolonPos);
681
682   StringUtils::Trim(type, whitespaceChars);
683   StringUtils::Trim(subtype, whitespaceChars);
684
685   if (type.empty() || subtype.empty())
686   {
687     type.clear();
688     subtype.clear();
689     return false;
690   }
691
692   StringUtils::ToLower(type);
693   StringUtils::ToLower(subtype);
694
695   return true;
696 }