annotate foosdk/sdk/foobar2000/SDK/search_tools.h @ 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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 //! \since 0.9.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //! Instance of a search filter object. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 //! This object contains a preprocessed search query; used to perform filtering similar to Media Library Search or Album List's "filter" box. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 //! Use search_filter_manager API to instantiate search_filter objects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 class search_filter : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 //! For backwards compatibility with older (0.9.5 alpha) revisions of this API. Do not call.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 virtual bool test_locked(const metadb_handle_ptr & p_item,const file_info * p_info) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 //! Use this to run this filter on a group of items.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 //! @param data Items to test.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 //! @param out Pointer to a buffer (size at least equal to number of items in the source list) receiving the results.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 virtual void test_multi(metadb_handle_list_cref data, bool * out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 FB2K_MAKE_SERVICE_INTERFACE(search_filter,service_base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 //! \since 0.9.5.3
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 class search_filter_v2 : public search_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 virtual bool get_sort_pattern(titleformat_object::ptr & out, int & direction) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 //! Abortable version of test_multi(). If the abort_callback object becomes signaled while the operation is being performed, contents of the output buffer are undefined and the operation will fail with exception_aborted.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 virtual void test_multi_ex(metadb_handle_list_cref data, bool * out, abort_callback & abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 //! Helper; removes non-matching items from the list.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 void test_multi_here(metadb_handle_list & ref, abort_callback & abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 FB2K_MAKE_SERVICE_INTERFACE(search_filter_v2, search_filter)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 //! \since 0.9.5.4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 class search_filter_v3 : public search_filter_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 //! Returns whether the sort pattern returned by get_sort_pattern() was set by the user explicitly using "SORT BY" syntax or whether it was determined implicitly from some other part of the query. It's recommended to use this to determine whether to create a force-sorted autoplaylist or not.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 virtual bool is_sort_explicit() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 FB2K_MAKE_SERVICE_INTERFACE(search_filter_v3, search_filter_v2)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 class search_filter_v4 : public search_filter_v3 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 flag_sort = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 virtual void test_v4(metadb_handle_list_cref items, metadb_io_callback_v2_data* dataIfAvail, bool* out, abort_callback& abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 virtual fb2k::arrayRef /* of metadb_handle */ search_v4(metadb_handle_list_cref lst, uint32_t flags, metadb_io_callback_v2_data * dataIfAvail, abort_callback& a) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 FB2K_MAKE_SERVICE_INTERFACE(search_filter_v4, search_filter_v3);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! \since 0.9.5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 //! Entrypoint class to instantiate search_filter objects.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 class search_filter_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Creates a search_filter object. Throws an exception on failure (such as an error in the query). It's recommended that you relay the exception message to the user if this function fails.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual search_filter::ptr create(const char * p_query) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 //! OBSOLETE, DO NOT CALL
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 virtual void get_manual(pfc::string_base & p_out) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 FB2K_MAKE_SERVICE_COREAPI(search_filter_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 //! \since 0.9.5.3.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 class search_filter_manager_v2 : public search_filter_manager {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 KFlagAllowSort = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 KFlagSuppressNotify = 1 << 1,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 //! Creates a search_filter object. Throws an exception on failure (such as an error in the query). It's recommended that you relay the exception message to the user if this function fails.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 //! @param changeNotify A completion_notify callback object that will get called each time the query's behavior changes as a result of some external event (such as system time change). The caller must refresh query results each time this callback is triggered. The status parameter of its on_completion() parameter is unused and always set to zero.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 virtual search_filter_v2::ptr create_ex(const char * query, completion_notify::ptr changeNotify, t_uint32 flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 //! Opens the search query syntax reference document, typically an external HTML in user's default web browser.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 virtual void show_manual() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(search_filter_manager_v2, search_filter_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 class search_filter_manager_v3 : public search_filter_manager_v2 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(search_filter_manager_v3, search_filter_manager_v2);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 enum combine_t {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 combine_and,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 combine_or
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 //! Combine multiple search filters into one, using the specified logical operation. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 //! This method INVALIDATES passed objects. Do not try to use them afterwards.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 virtual search_filter_v4::ptr combine(pfc::list_base_const_t<search_filter::ptr> const & arg, combine_t how, completion_notify::ptr changeNotify, t_uint32 flags) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 class search_index : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 FB2K_MAKE_SERVICE_INTERFACE(search_index, service_base)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 enum {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 flag_sort = 1 << 0,
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 //! Searches Tracks in this index for tracks matching criteria.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! @returns list of metadb_handles. Safe to use arr->as_list_of<metadb_handle>() to get a pfc::list_base_const_t<metadb_handle_ptr>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 //! @param subset Optional: pass subset of tracks in this index to search - whole index is searched if nullptr is passed.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 //! @param flags Optional: set flag_sort to sort output
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 //! Thread safety: call from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 virtual fb2k::arrayRef search(search_filter::ptr pattern, metadb_handle_list_cptr subset, uint32_t flags, abort_callback& abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 //! Performs hit test on a group of tracks that are a subset of tracks in this index. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 //! Thread safety: call from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 virtual void test(search_filter::ptr pattern, metadb_handle_list_cref items, bool* out, abort_callback& abort) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 //! Add tracks to a custom index. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 //! Illegal to call on library or playlist indexes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 //! Thread safety: call from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 virtual void add_tracks(metadb_handle_list_cref, metadb_io_callback_v2_data* dataIfAvail) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 //! Remove tracks from a custom index. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 //! Illegal to call on library or playlist indexes. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 //! Thread safety: call from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 virtual void remove_tracks(metadb_handle_list_cref) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 class search_index_manager : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 FB2K_MAKE_SERVICE_COREAPI(search_index_manager);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 //! Create a custom index on any data set. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 //! OK to call from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 virtual search_index::ptr create_index(metadb_handle_list_cref items, metadb_io_callback_v2_data* dataIfAvail) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 //! Create a search index referencing a playlist. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 //! Specify null GUID to follow active playlist (typical playlist search). \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 //! Call from main thread to obtain index, then can use obtained object from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 virtual search_index::ptr create_playlist_index(const GUID& playlistID = pfc::guid_null) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 //! Returns a shared object indexing user's media library. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 //! Call from main thread to obtain index, then can use obtained object from any thread.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 virtual search_index::ptr get_library_index() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 };