From 4b5001248d66bec4a4d870826f0a1398ac4315ab Mon Sep 17 00:00:00 2001 From: DigitalBox98 Date: Fri, 21 Nov 2025 23:18:38 -0500 Subject: [PATCH] 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 Tested-by: Commit checker robot --- src/apps/mediaplayer/playlist/Playlist.cpp | 25 ++++++++++++++++++---- src/apps/mediaplayer/playlist/Playlist.h | 2 +- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/apps/mediaplayer/playlist/Playlist.cpp b/src/apps/mediaplayer/playlist/Playlist.cpp index 29e844bb37..d57ae05537 100644 --- a/src/apps/mediaplayer/playlist/Playlist.cpp +++ b/src/apps/mediaplayer/playlist/Playlist.cpp @@ -523,7 +523,7 @@ Playlist::AppendToPlaylistRecursive(const entry_ref& ref, Playlist* playlist) } } 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 @@ Playlist::_IsImageFile(const BString& mimeString) /*static*/ 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) { + // no superType, try to sniff the type + if (BMimeType::GuessMimeType(&ref, &fileType) != B_OK) + return false; + } + + BEntry entry(&ref); + if (entry.IsSymLink()) { + // traverse link + entry_ref* fileRef = const_cast(&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 @@ Playlist::_IsMediaFile(const BString& mimeString) 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 @@ Playlist::_BindExtraMedia(FilePlaylistItem* fileItem, const BEntry& entry) 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); diff --git a/src/apps/mediaplayer/playlist/Playlist.h b/src/apps/mediaplayer/playlist/Playlist.h index 07569972ab..5621de54f4 100644 --- a/src/apps/mediaplayer/playlist/Playlist.h +++ b/src/apps/mediaplayer/playlist/Playlist.h @@ -121,7 +121,7 @@ private: 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);