⛏️ index : haiku.git

author DigitalBox98 <digitalbox098@gmail.com> 2025-11-21 23:18:38.0 -05:00:00
committer Adrien Destugues <pulkomandy@pulkomandy.tk> 2025-12-13 14:06:12.0 +00:00:00
commit
4b5001248d66bec4a4d870826f0a1398ac4315ab [patch]
tree
bf8c57086e8315e63da635e346638b08d7e00fdc
parent
3329194a328f24962d19c76358398f8ecd677338
download
4b5001248d66bec4a4d870826f0a1398ac4315ab.tar.gz

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(-)

diff --git a/src/apps/mediaplayer/playlist/Playlist.cpp b/src/apps/mediaplayer/playlist/Playlist.cpp
index 29e844b..d57ae05 100644
--- a/src/apps/mediaplayer/playlist/Playlist.cpp
+++ b/src/apps/mediaplayer/playlist/Playlist.cpp
@@ -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 @@


/*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<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);
diff --git a/src/apps/mediaplayer/playlist/Playlist.h b/src/apps/mediaplayer/playlist/Playlist.h
index 0756997..5621de5 100644
--- a/src/apps/mediaplayer/playlist/Playlist.h
+++ b/src/apps/mediaplayer/playlist/Playlist.h
@@ -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);