MediaPlayer: GuessMimeType() if no supertype and traverse link
... (to handle media files symlinked to volumes w/o attributes).
Change-Id: I0ef2caa557769fee4781cd0ed44ff33d69e64103
Reviewed-on: https://review.haiku-os.org/c/haiku/+/10006
Reviewed-by: Adrien Destugues <pulkomandy@pulkomandy.tk>
Tested-by: Commit checker robot <no-reply+buildbot@haiku-os.org>
Diff
src/apps/mediaplayer/playlist/Playlist.cpp | 25 ++++++++++++++++++++++---
src/apps/mediaplayer/playlist/Playlist.h | 2 +-
2 files changed, 22 insertions(+), 5 deletions(-)
@@ -523,7 +523,7 @@
}
} else if (entry.IsFile()) {
BString mimeString = _MIMEString(&ref);
if (_IsMediaFile(mimeString)) {
if (_IsMediaFile(mimeString, ref)) {
PlaylistItem* item = new (std::nothrow) FilePlaylistItem(ref);
if (!_ExtraMediaExists(playlist, ref)) {
_BindExtraMedia(item);
@@ -673,11 +673,28 @@
bool
Playlist::_IsMediaFile(const BString& mimeString)
Playlist::_IsMediaFile(const BString& mimeString, const entry_ref& ref)
{
BMimeType superType;
BMimeType fileType(mimeString.String());
if (fileType.GetSupertype(&superType) != B_OK) {
if (BMimeType::GuessMimeType(&ref, &fileType) != B_OK)
return false;
}
BEntry entry(&ref);
if (entry.IsSymLink()) {
entry_ref* fileRef = const_cast<entry_ref*>(&ref);
if (entry.SetTo(fileRef, true) != B_OK)
return false;
if (entry.GetRef(fileRef) != B_OK)
return false;
fileType.SetTo(_MIMEString(fileRef));
}
if (fileType.GetSupertype(&superType) != B_OK)
return false;
@@ -699,7 +716,7 @@
const char* type;
for (int32 i = 0; types.FindString("types", i, &type) == B_OK; i++) {
if (strcasecmp(mimeString.String(), type) == 0)
if (strcasecmp(fileType.Type(), type) == 0)
return true;
}
@@ -791,7 +808,7 @@
entry_ref ref;
entry.GetRef(&ref);
BString mimeString = _MIMEString(&ref);
if (_IsMediaFile(mimeString)) {
if (_IsMediaFile(mimeString, ref)) {
fileItem->AddRef(ref);
} else if (_IsImageFile(mimeString)) {
fileItem->AddImageRef(ref);
@@ -121,7 +121,7 @@
static bool _ExtraMediaExists(Playlist* playlist,
BUrl url);
static bool _IsImageFile(const BString& mimeString);
static bool _IsMediaFile(const BString& mimeString);
static bool _IsMediaFile(const BString& mimeString, const entry_ref& ref);
static bool _IsTextPlaylist(const BString& mimeString);
static bool _IsBinaryPlaylist(const BString& mimeString);
static bool _IsPlaylist(const BString& mimeString);