diff foosdk/sdk/foobar2000/SDK/album_art.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/foobar2000/SDK/album_art.cpp	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,221 @@
+#include "foobar2000-sdk-pch.h"
+#include "image.h"
+#include "album_art.h"
+#include "album_art_helpers.h"
+#include "input.h"
+
+GUID album_art_extractor::get_guid() {
+	album_art_extractor_v2::ptr v2;
+	if ( v2 &= this ) return v2->get_guid();
+	return pfc::guid_null;
+}
+
+GUID album_art_editor::get_guid() {
+	album_art_editor_v2::ptr v2;
+	if ( v2 &= this ) return v2->get_guid();
+	return pfc::guid_null;
+}
+
+bool album_art_extractor_instance::query(const GUID & what, album_art_data::ptr & out, abort_callback & abort) {
+	try { out = query(what, abort); return true; } catch (exception_album_art_not_found const &) { return false; }
+}
+
+service_ptr_t<fb2k::image> album_art_extractor_instance::query_image_(const GUID & what, abort_callback& a) {
+    auto data = this->query(what, a);
+    return fb2k::imageCreator::get()->loadImageData( data);
+}
+
+bool album_art_extractor_instance::have_entry(const GUID & what, abort_callback & abort) {
+	try { query(what, abort); return true; } catch(exception_album_art_not_found const &) { return false; }
+}
+
+void album_art_editor_instance::remove_all_() {
+	album_art_editor_instance_v2::ptr v2;
+	if ( v2 &= this ) {
+		v2->remove_all();
+	} else {
+		for( size_t walk = 0; walk < album_art_ids::num_types(); ++ walk ) {
+			try {
+				this->remove( album_art_ids::query_type( walk ) );
+			} catch(exception_io_data const &) {}
+			catch(exception_album_art_not_found const &) {}
+		}
+	}
+}
+
+bool album_art_editor::g_get_interface(service_ptr_t<album_art_editor> & out,const char * path) {
+	auto ext = pfc::string_extension(path);
+	for (auto ptr : enumerate()) {
+		if (ptr->is_our_path(path, ext)) { out = ptr; return true; }
+	}
+	return false;
+}
+
+bool album_art_editor::g_is_supported_path(const char * path) {
+	ptr ptr; return g_get_interface(ptr,path);
+}
+
+album_art_editor_instance_ptr album_art_editor::g_open(file_ptr p_filehint,const char * p_path,abort_callback & p_abort) {
+	
+#ifdef FOOBAR2000_DESKTOP
+	{
+		input_manager_v2::ptr m;
+		if (fb2k::std_api_try_get(m)) {
+			album_art_editor_instance::ptr ret;
+			ret ^= m->open_v2(album_art_editor_instance::class_guid, p_filehint, p_path, false, nullptr, p_abort);
+			return ret;
+		}
+	}
+#endif
+
+	album_art_editor::ptr obj;
+	if (!g_get_interface(obj, p_path)) throw exception_album_art_unsupported_format();
+	return obj->open(p_filehint, p_path, p_abort);
+}
+
+
+bool album_art_extractor::g_get_interface(service_ptr_t<album_art_extractor> & out,const char * path) {
+	
+	auto ext = pfc::string_extension(path);
+	for (auto ptr : enumerate()) {
+		if (ptr->is_our_path(path, ext)) { out = ptr; return true; }
+	}
+	return false;
+}
+
+bool album_art_extractor::g_is_supported_path(const char * path) {
+	ptr ptr; return g_get_interface(ptr,path);
+}
+album_art_extractor_instance_ptr album_art_extractor::g_open(file_ptr p_filehint,const char * p_path,abort_callback & p_abort) {
+#ifdef FOOBAR2000_DESKTOP
+	{
+		input_manager_v2::ptr m;
+		if (fb2k::std_api_try_get(m)) {
+			album_art_extractor_instance::ptr ret;
+			ret ^= m->open_v2(album_art_extractor_instance::class_guid, p_filehint, p_path, false, nullptr, p_abort);
+			return ret;
+		}
+	}
+#endif
+
+	album_art_extractor::ptr obj;
+	if (!g_get_interface(obj, p_path)) throw exception_album_art_unsupported_format();
+	return obj->open(p_filehint, p_path, p_abort);
+}
+
+
+album_art_extractor_instance_ptr album_art_extractor::g_open_allowempty(file_ptr p_filehint,const char * p_path,abort_callback & p_abort) {
+	try {
+		return g_open(p_filehint, p_path, p_abort);
+	} catch(exception_album_art_not_found const &) {
+		return new service_impl_t<album_art_extractor_instance_simple>();
+	}
+}
+
+namespace {
+	class now_playing_album_art_notify_lambda : public now_playing_album_art_notify {
+	public:
+		void on_album_art(album_art_data::ptr data) {
+			f(data);
+		}
+		std::function<void(album_art_data::ptr) > f;
+	};
+}
+
+now_playing_album_art_notify * now_playing_album_art_notify_manager::add(std::function<void (album_art_data::ptr) > f ) {
+	PFC_ASSERT ( f != nullptr );
+	auto obj = new now_playing_album_art_notify_lambda;
+	obj->f = f;
+	add(obj);
+	return obj;
+}
+
+namespace {
+	struct aa_t {
+		GUID type; const char * name;
+	};
+	static const GUID guids[] = {
+		album_art_ids::cover_front,
+		album_art_ids::cover_back,
+		album_art_ids::artist,
+		album_art_ids::disc,
+		album_art_ids::icon,
+	};
+	static const char * const names[] = {
+		"front cover",
+		"back cover",
+		"artist",
+		"disc",
+		"icon"
+	};
+	static const char * const names2[] = {
+		"Front Cover",
+		"Back Cover",
+		"Artist",
+		"Disc",
+		"Icon"
+	};
+}
+
+size_t album_art_ids::num_types() {
+	PFC_STATIC_ASSERT( PFC_TABSIZE( guids ) == PFC_TABSIZE( names ) );
+	PFC_STATIC_ASSERT( PFC_TABSIZE( guids ) == PFC_TABSIZE( names2 ) );
+	return PFC_TABSIZE( guids );
+}
+
+GUID album_art_ids::query_type(size_t idx) {
+	PFC_ASSERT( idx < PFC_TABSIZE( guids ) );
+	return guids[idx];
+}
+
+const char * album_art_ids::query_name(size_t idx) {
+	PFC_ASSERT( idx < PFC_TABSIZE( names ) );
+	return names[idx];
+}
+
+const char* album_art_ids::name_of_ex(const GUID& id, const char* def) {
+	auto ret = name_of(id);
+	if ( ret == nullptr ) ret = def;
+	return ret;
+}
+
+const char * album_art_ids::name_of(const GUID & id) {
+	for( size_t w = 0; w < num_types(); ++w ) {
+		if ( query_type(w) == id ) return query_name(w);
+	}
+	return nullptr;
+}
+
+const char * album_art_ids::query_capitalized_name( size_t idx ) {
+	PFC_ASSERT( idx < PFC_TABSIZE( names2 ) );
+	return names2[idx];
+}
+
+const char * album_art_ids::capitalized_name_of( const GUID & id) {
+	for( size_t w = 0; w < num_types(); ++w ) {
+		if ( query_type(w) == id ) return query_capitalized_name(w);
+	}
+	return nullptr;
+}
+
+GUID album_art_ids::by_name(const char* arg) {
+	for (size_t w = 0; w < num_types(); ++w) {
+		if (pfc::stringEqualsI_ascii(query_name(w), arg)) return query_type(w);
+	}
+	return pfc::guid_null;
+}
+
+bool album_art_path_list::equals(album_art_path_list const& v1, album_art_path_list const& v2) {
+	const size_t n = v1.get_count();
+	if (n != v2.get_count()) return false;
+	for (size_t w = 0; w < n; ++w) {
+		if (playable_location::path_compare(v1.get_path(w), v2.get_path(w)) != 0) return false;
+	}
+	return true;
+}
+
+bool album_art_path_list::equals(ptr const& v1, ptr const& v2) {
+	if (v1.is_valid() != v2.is_valid()) return false;
+	if (v1.is_empty() && v2.is_empty()) return true;
+	return equals(*v1, *v2);
+}