Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1716)

Unified Diff: chrome/browser/media_galleries/fileapi/media_path_filter.cc

Issue 149363004: Media Galleries: Initial media scanner implementation. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media_galleries/fileapi/media_path_filter.cc
===================================================================
--- chrome/browser/media_galleries/fileapi/media_path_filter.cc (revision 247534)
+++ chrome/browser/media_galleries/fileapi/media_path_filter.cc (working copy)
@@ -12,7 +12,7 @@
namespace {
-const base::FilePath::CharType* const kExtraSupportedExtensions[] = {
+const base::FilePath::CharType* const kExtraSupportedImageExtensions[] = {
// RAW picture file types.
// Some of which are just image/tiff.
FILE_PATH_LITERAL("3fr"), // (Hasselblad)
@@ -45,8 +45,9 @@
// - Leica / Panasonic RAW files - image/x-panasonic-raw
// - Phase One RAW files - image/x-phaseone-raw
FILE_PATH_LITERAL("raw"),
+};
- // Video files types.
+const base::FilePath::CharType* const kExtraSupportedVideoExtensions[] = {
FILE_PATH_LITERAL("3gp"),
FILE_PATH_LITERAL("3gpp"),
FILE_PATH_LITERAL("avi"),
@@ -58,9 +59,11 @@
FILE_PATH_LITERAL("mpegps"),
FILE_PATH_LITERAL("mpg"),
FILE_PATH_LITERAL("wmv"),
+};
- // Audio file types. Many of these file types are audio files in the same
- // containers that the MIME sniffer already detects as video/subtype.
+const base::FilePath::CharType* const kExtraSupportedAudioExtensions[] = {
+ // Many of these file types are audio files in the same containers that the
+ // MIME sniffer already detects as video/subtype.
FILE_PATH_LITERAL("aac"), // audio/mpeg
FILE_PATH_LITERAL("alac"), // video/mp4
FILE_PATH_LITERAL("flac"), // audio/x-flac
@@ -86,10 +89,15 @@
}
bool MediaPathFilter::Match(const base::FilePath& path) {
+ return GetType(path) != MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN;
+}
+
+MediaGalleryScanFileType MediaPathFilter::GetType(const base::FilePath& path) {
EnsureInitialized();
- return std::binary_search(media_file_extensions_.begin(),
- media_file_extensions_.end(),
- StringToLowerASCII(path.Extension()));
+ MediaFileExtensionMap::const_iterator it =
+ media_file_extensions_map_.find(StringToLowerASCII(path.Extension()));
+ return (it == media_file_extensions_map_.end()) ?
+ MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN : it->second;
}
void MediaPathFilter::EnsureInitialized() {
@@ -97,26 +105,54 @@
if (initialized_)
return;
- // This may require I/O, so doing this in the ctor and removing
- // |initialized_| would result in a ThreadRestrictions failure.
- net::GetExtensionsForMimeType("image/*", &media_file_extensions_);
- net::GetExtensionsForMimeType("audio/*", &media_file_extensions_);
- net::GetExtensionsForMimeType("video/*", &media_file_extensions_);
+ MediaFileExtensionList extensions_list;
- MediaFileExtensionList::iterator new_end =
- std::remove_if(media_file_extensions_.begin(),
- media_file_extensions_.end(),
- &IsUnsupportedExtension);
- media_file_extensions_.erase(new_end, media_file_extensions_.end());
+ // This may require I/O when it calls net::GetExtensionsForMimeType(), so
+ // doing this in the ctor and removing |initialized_| would result in a
+ // ThreadRestrictions failure.
+ GetMediaExtensionList("image/*", &extensions_list);
+ for (size_t i = 0; i < arraysize(kExtraSupportedImageExtensions); ++i)
vandebo (ex-Chrome) 2014/01/29 18:41:45 nit: seems silly to add it to the list, just to it
Lei Zhang 2014/01/30 00:10:49 Done.
+ extensions_list.push_back(kExtraSupportedImageExtensions[i]);
+ AddExtensionsToMediaFileExtensionMap(extensions_list,
+ MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE);
+ extensions_list.clear();
+ GetMediaExtensionList("audio/*", &extensions_list);
+ for (size_t i = 0; i < arraysize(kExtraSupportedAudioExtensions); ++i)
+ extensions_list.push_back(kExtraSupportedAudioExtensions[i]);
+ AddExtensionsToMediaFileExtensionMap(extensions_list,
+ MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO);
+ extensions_list.clear();
+ GetMediaExtensionList("video/*", &extensions_list);
+ for (size_t i = 0; i < arraysize(kExtraSupportedVideoExtensions); ++i)
+ extensions_list.push_back(kExtraSupportedVideoExtensions[i]);
+ AddExtensionsToMediaFileExtensionMap(extensions_list,
+ MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO);
- // Add other common extensions.
- for (size_t i = 0; i < arraysize(kExtraSupportedExtensions); ++i)
- media_file_extensions_.push_back(kExtraSupportedExtensions[i]);
+ initialized_ = true;
+}
- for (MediaFileExtensionList::iterator itr = media_file_extensions_.begin();
- itr != media_file_extensions_.end(); ++itr)
- *itr = base::FilePath::kExtensionSeparator + *itr;
- std::sort(media_file_extensions_.begin(), media_file_extensions_.end());
+// static
+void MediaPathFilter::GetMediaExtensionList(
+ const std::string& mime_type,
+ MediaFileExtensionList* extensions) {
+ DCHECK(extensions);
- initialized_ = true;
+ net::GetExtensionsForMimeType(mime_type, extensions);
+ MediaFileExtensionList::iterator new_end =
+ std::remove_if(extensions->begin(),
+ extensions->end(),
+ &IsUnsupportedExtension);
+ extensions->erase(new_end, extensions->end());
}
+
+void MediaPathFilter::AddExtensionsToMediaFileExtensionMap(
+ const MediaFileExtensionList& extensions,
+ MediaGalleryScanFileType type) {
+ for (size_t i = 0; i < extensions.size(); ++i) {
+ base::FilePath::StringType extension_with_sep =
+ base::FilePath::kExtensionSeparator + extensions[i];
+ // Overwriting is fine. It means the most recent caller gets priority for
+ // an ambiguous file extension.
+ media_file_extensions_map_[extension_with_sep] = type;
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698