arduino-audio-tools
Loading...
Searching...
No Matches
MimeResolver.h
1#pragma once
2
3#include <ctype.h>
4#include <stddef.h>
5
6#include "AudioTools/CoreAudio/AudioBasic/Collections/Vector.h"
7#include "AudioTools/CoreAudio/AudioBasic/StrView.h"
8
9namespace audio_tools {
10
12struct MimeEntry {
13 const char* ext;
14 const char* mime;
15};
17static const MimeEntry mime_table[] = {
18 {"aac", "audio/aac"},
19 {"ac3", "audio/ac3"},
20 {"aiff", "audio/aiff"},
21 {"aif", "audio/aiff"},
22 {"aifc", "audio/aiff"},
23 {"alac", "audio/alac"},
24 {"amr", "audio/amr"},
25 {"au", "audio/basic"},
26 {"caf", "audio/x-caf"},
27 {"dts", "audio/vnd.dts"},
28 {"flac", "audio/flac"},
29 {"m3u", "audio/x-mpegurl"},
30 {"m3u8", "application/vnd.apple.mpegurl"},
31 {"m4a", "audio/m4a"},
32 {"mid", "audio/midi"},
33 {"midi", "audio/midi"},
34 {"mka", "audio/x-matroska"},
35 {"mkv", "video/x-matroska"},
36 {"mp2", "audio/mpeg"},
37 {"mp2t", "video/MP2T"},
38 {"mp3", "audio/mpeg"},
39 {"mp4", "video/mp4"},
40 {"mpeg", "audio/mpeg"},
41 {"oga", "audio/ogg"},
42 {"ogg", "audio/ogg"},
43 {"ogv", "video/ogg"},
44 {"opus", "audio/ogg; codecs=opus"},
45 {"sid", "audio/prs.sid"},
46 {"spx", "audio/ogg; codecs=spx"},
47 {"ts", "video/MP2T"},
48 {"vorbis", "audio/ogg; codec=vorbis"},
49 {"wave", "audio/vnd.wave"},
50 {"wav", "audio/vnd.wave"},
51 {"webm", "video/webm"},
52 {"wma", "audio/x-ms-wma"},
53 {nullptr, nullptr}};
54
79 public:
82 const char* fromFilename(const char* filename) {
83 if (!filename) return nullptr;
84 const char* dot = strrchr(filename, '.');
85 if (!dot || *(dot + 1) == '\0') return nullptr;
86 return fromExtension(dot + 1);
87 }
88
91 const char* fromExtension(const char* extension) {
92 if (!extension) return nullptr;
93 // skip leading dot if provided
94 if (extension[0] == '.') extension++;
95 StrView extView(extension);
96
97 // search in custom table first
98 for (size_t i = 0; i < custom_mime_table.size(); i++) {
99 if (extView.equalsIgnoreCase(custom_mime_table[i].ext))
100 return custom_mime_table[i].mime;
101 }
102
103 // search in default table
104 for (size_t i = 0; mime_table[i].ext != nullptr; i++) {
105 if (extView.equalsIgnoreCase(mime_table[i].ext))
106 return mime_table[i].mime;
107 }
108 return nullptr;
109 }
110
112 void addMimeEntry(const char* ext, const char* mime) {
113 MimeEntry entry;
114 entry.ext = ext;
115 entry.mime = mime;
116 custom_mime_table.push_back(entry);
117 }
118
119 protected:
120 Vector<MimeEntry> custom_mime_table;
121};
122
123} // namespace audio_tools
Lookup MIME types by file extension.
Definition MimeResolver.h:78
const char * fromExtension(const char *extension)
Definition MimeResolver.h:91
void addMimeEntry(const char *ext, const char *mime)
Add custom mime entry (overrides default entries)
Definition MimeResolver.h:112
const char * fromFilename(const char *filename)
Definition MimeResolver.h:82
A simple wrapper to provide string functions on existing allocated char*. If the underlying char* is ...
Definition StrView.h:28
virtual bool equalsIgnoreCase(const char *alt) const
Compares the string ignoring the case.
Definition StrView.h:564
Vector implementation which provides the most important methods as defined by std::vector....
Definition Vector.h:21
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
static const MimeEntry mime_table[]
Default mime table (sorted alphabetically) stored in program memory.
Definition MimeResolver.h:17
extension to mime table (sorted alphabetically)
Definition MimeResolver.h:12