medialibrary: Fix typo
[vlc.git] / include / vlc_media_library.h
blobcba1c7adcae723b0817ec2b113c02ea2f32fe0c4
1 /*****************************************************************************
2 * vlc_media_library.h: SQL-based media library
3 *****************************************************************************
4 * Copyright (C) 2008-2010 the VideoLAN Team and AUTHORS
6 * Authors: Antoine Lejeune <phytos@videolan.org>
7 * Jean-Philippe André <jpeg@videolan.org>
8 * Rémi Duraffort <ivoire@videolan.org>
9 * Adrien Maglo <magsoft@videolan.org>
10 * Srikanth Raju <srikiraju at gmail dot com>
12 * This program is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU Lesser General Public License as published by
14 * the Free Software Foundation; either version 2.1 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public License
23 * along with this program; if not, write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
25 *****************************************************************************/
27 #ifndef VLC_MEDIA_LIBRARY_H
28 # define VLC_MEDIA_LIBRARY_H
30 #include <assert.h>
31 #include <vlc_common.h>
33 # ifdef __cplusplus
34 extern "C" {
35 # endif
37 typedef enum vlc_ml_media_type_t
39 VLC_ML_MEDIA_TYPE_UNKNOWN,
40 VLC_ML_MEDIA_TYPE_VIDEO,
41 VLC_ML_MEDIA_TYPE_AUDIO,
42 VLC_ML_MEDIA_TYPE_EXTERNAL,
43 VLC_ML_MEDIA_TYPE_STREAM,
44 } vlc_ml_media_type_t;
46 typedef enum vlc_ml_media_subtype_t
48 VLC_ML_MEDIA_SUBTYPE_UNKNOWN,
49 VLC_ML_MEDIA_SUBTYPE_SHOW_EPISODE,
50 VLC_ML_MEDIA_SUBTYPE_MOVIE,
51 VLC_ML_MEDIA_SUBTYPE_ALBUMTRACK,
52 } vlc_ml_media_subtype_t;
54 typedef enum vlc_ml_file_type_t
56 VLC_ML_FILE_TYPE_UNKNOWN,
57 VLC_ML_FILE_TYPE_MAIN,
58 VLC_ML_FILE_TYPE_PART,
59 VLC_ML_FILE_TYPE_SOUNDTRACK,
60 VLC_ML_FILE_TYPE_SUBTITLE,
61 VLC_ML_FILE_TYPE_PLAYLIST,
62 } vlc_ml_file_type_t;
64 typedef enum vlc_ml_track_type_t
66 VLC_ML_TRACK_TYPE_UNKNOWN,
67 VLC_ML_TRACK_TYPE_VIDEO,
68 VLC_ML_TRACK_TYPE_AUDIO,
69 } vlc_ml_track_type_t;
71 typedef enum vlc_ml_thumbnail_size_t
73 VLC_ML_THUMBNAIL_SMALL,
74 VLC_ML_THUMBNAIL_BANNER,
76 VLC_ML_THUMBNAIL_SIZE_COUNT
77 } vlc_ml_thumbnail_size_t;
79 typedef struct vlc_ml_thumbnail_t
81 char* psz_mrl;
82 /**
83 * True if a thumbnail is available, or if thumbnail generation was
84 * attempted but failed
86 bool b_generated;
87 } vlc_ml_thumbnail_t;
89 typedef struct vlc_ml_movie_t
91 char* psz_summary;
92 char* psz_imdb_id;
93 } vlc_ml_movie_t;
95 typedef struct vlc_ml_show_episode_t
97 char* psz_summary;
98 char* psz_tvdb_id;
99 uint32_t i_episode_nb;
100 uint32_t i_season_number;
101 } vlc_ml_show_episode_t;
103 typedef struct vlc_ml_show_t
105 int64_t i_id;
106 char* psz_name;
107 char* psz_summary;
108 char* psz_artwork_mrl;
109 char* psz_tvdb_id;
110 unsigned int i_release_year;
111 uint32_t i_nb_episodes;
112 uint32_t i_nb_seasons;
113 } vlc_ml_show_t;
115 typedef struct vlc_ml_album_track_t
117 int64_t i_artist_id;
118 int64_t i_album_id;
119 int64_t i_genre_id;
121 int i_track_nb;
122 int i_disc_nb;
123 } vlc_ml_album_track_t;
125 typedef struct vlc_ml_label_t
127 int64_t i_id;
128 char* psz_name;
129 } vlc_ml_label_t;
131 typedef struct vlc_ml_label_list_t
133 size_t i_nb_items;
134 vlc_ml_label_t p_items[];
135 } vlc_ml_label_list_t;
137 typedef struct vlc_ml_file_t
139 char* psz_mrl;
140 vlc_ml_file_type_t i_type;
141 bool b_external;
142 bool b_removable;
143 bool b_present;
144 } vlc_ml_file_t;
146 typedef struct vlc_ml_file_list_t
148 size_t i_nb_items;
149 vlc_ml_file_t p_items[];
150 } vlc_ml_file_list_t;
152 typedef struct vlc_ml_media_track_t
154 char* psz_codec;
155 char* psz_language;
156 char* psz_description;
157 vlc_ml_track_type_t i_type;
158 uint32_t i_bitrate;
159 union
161 struct
163 // Audio
164 uint32_t i_nbChannels;
165 uint32_t i_sampleRate;
166 } a;
167 struct
169 // Video
170 uint32_t i_height;
171 uint32_t i_width;
172 uint32_t i_sarNum;
173 uint32_t i_sarDen;
174 uint32_t i_fpsNum;
175 uint32_t i_fpsDen;
176 } v;
178 } vlc_ml_media_track_t;
180 typedef struct vlc_ml_media_track_list_t
182 size_t i_nb_items;
183 vlc_ml_media_track_t p_items[];
184 } vlc_ml_media_track_list_t;
186 typedef struct vlc_ml_media_t
188 int64_t i_id;
190 vlc_ml_media_type_t i_type;
191 vlc_ml_media_subtype_t i_subtype;
193 vlc_ml_file_list_t* p_files;
194 vlc_ml_media_track_list_t* p_tracks;
196 int32_t i_year;
197 /* Duration in milliseconds */
198 int64_t i_duration;
199 uint32_t i_playcount;
200 time_t i_last_played_date;
201 char* psz_title;
203 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
205 bool b_is_favorite;
207 union
209 vlc_ml_show_episode_t show_episode;
210 vlc_ml_movie_t movie;
211 vlc_ml_album_track_t album_track;
213 } vlc_ml_media_t;
215 typedef struct vlc_ml_playlist_t
217 int64_t i_id;
218 char* psz_name;
219 uint32_t i_creation_date;
220 char* psz_artwork_mrl;
221 } vlc_ml_playlist_t;
223 typedef struct vlc_ml_artist_t
225 int64_t i_id;
226 char* psz_name;
227 char* psz_shortbio;
228 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
229 char* psz_mb_id;
231 unsigned int i_nb_album;
232 unsigned int i_nb_tracks;
233 } vlc_ml_artist_t;
235 typedef struct vlc_ml_artist_list_t
237 size_t i_nb_items;
238 vlc_ml_artist_t p_items[];
239 } vlc_ml_artist_list_t;
241 typedef struct vlc_ml_album_t {
242 int64_t i_id;
243 char* psz_title;
244 char* psz_summary;
245 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
246 char* psz_artist;
247 int64_t i_artist_id;
249 size_t i_nb_tracks;
250 unsigned int i_duration;
251 unsigned int i_year;
252 } vlc_ml_album_t;
254 typedef struct vlc_ml_genre_t
256 int64_t i_id;
257 char* psz_name;
258 size_t i_nb_tracks;
259 } vlc_ml_genre_t;
261 typedef struct vlc_ml_media_list_t
263 size_t i_nb_items;
264 vlc_ml_media_t p_items[];
265 } vlc_ml_media_list_t;
267 typedef struct vlc_ml_album_list_t
269 size_t i_nb_items;
270 vlc_ml_album_t p_items[];
271 } vlc_ml_album_list_t;
273 typedef struct vlc_ml_show_list_t
275 size_t i_nb_items;
276 vlc_ml_show_t p_items[];
277 } vlc_ml_show_list_t;
279 typedef struct vlc_ml_genre_list_t
281 size_t i_nb_items;
282 vlc_ml_genre_t p_items[];
283 } vlc_ml_genre_list_t;
285 typedef struct vlc_ml_playlist_list_t
287 size_t i_nb_items;
288 vlc_ml_playlist_t p_items[];
289 } vlc_ml_playlist_list_t;
291 typedef struct vlc_ml_entry_point_t
293 char* psz_mrl; /**< This entrypoint's MRL. Will be NULL if b_present is false */
294 bool b_present; /**< The presence state for this entrypoint. */
295 bool b_banned; /**< Will be true if the user required this entrypoint to be excluded */
296 } vlc_ml_entry_point_t;
298 typedef struct vlc_ml_entry_point_list_t
300 size_t i_nb_items;
301 vlc_ml_entry_point_t p_items[];
302 } vlc_ml_entry_point_list_t;
304 /* Opaque medialibrary pointer, to be used by any non-medialibrary module */
305 typedef struct vlc_medialibrary_t vlc_medialibrary_t;
306 /* "Private" medialibrary pointer, to be used by the core & medialibrary modules */
307 typedef struct vlc_medialibrary_module_t vlc_medialibrary_module_t;
308 /* Opaque event callback type */
309 typedef struct vlc_ml_event_callback_t vlc_ml_event_callback_t;
311 typedef enum vlc_ml_sorting_criteria_t
314 * Default depends on the entity type:
315 * - By track number (and disc number) for album tracks
316 * - Alphabetical order for others
318 VLC_ML_SORTING_DEFAULT,
319 VLC_ML_SORTING_ALPHA,
320 VLC_ML_SORTING_DURATION,
321 VLC_ML_SORTING_INSERTIONDATE,
322 VLC_ML_SORTING_LASTMODIFICATIONDATE,
323 VLC_ML_SORTING_RELEASEDATE,
324 VLC_ML_SORTING_FILESIZE,
325 VLC_ML_SORTING_ARTIST,
326 VLC_ML_SORTING_PLAYCOUNT,
327 VLC_ML_SORTING_ALBUM,
328 VLC_ML_SORTING_FILENAME,
329 VLC_ML_SORTING_TRACKNUMBER,
330 } vlc_ml_sorting_criteria_t;
332 typedef struct vlc_ml_query_params_t vlc_ml_query_params_t;
333 struct vlc_ml_query_params_t
335 const char* psz_pattern;
336 uint32_t i_nbResults;
337 uint32_t i_offset;
338 vlc_ml_sorting_criteria_t i_sort;
339 bool b_desc;
342 enum vlc_ml_get_queries
344 VLC_ML_GET_MEDIA, /**< arg1: Media ID; ret: vlc_ml_media_t* */
345 VLC_ML_GET_MEDIA_BY_MRL, /**< arg1: Media MRL; ret: vlc_ml_media_t* */
346 VLC_ML_GET_INPUT_ITEM, /**< arg1: Media ID; ret: input_item_t* */
347 VLC_ML_GET_INPUT_ITEM_BY_MRL,/**< arg1: Media MRL; ret: input_item_t* */
348 VLC_ML_GET_ALBUM, /**< arg1: Album ID; ret: vlc_ml_album_t* */
349 VLC_ML_GET_ARTIST, /**< arg1: Artist ID; ret: vlc_ml_artist_t* */
350 VLC_ML_GET_GENRE, /**< arg1: Genre ID; ret: vlc_ml_genre_t* */
351 VLC_ML_GET_SHOW, /**< arg1: Show ID; ret: vlc_ml_show_t* */
352 VLC_ML_GET_PLAYLIST, /**< arg1: Playlist ID; ret: vlc_ml_playlist_t* */
355 enum vlc_ml_list_queries
357 /* General listing: */
359 VLC_ML_LIST_VIDEOS, /**< arg1 (out): vlc_ml_media_list_t** */
360 VLC_ML_COUNT_VIDEOS, /**< arg1 (out): size_t* */
361 VLC_ML_LIST_AUDIOS, /**< arg1 (out): vlc_ml_media_list_t** */
362 VLC_ML_COUNT_AUDIOS, /**< arg1 (out): size_t* */
363 VLC_ML_LIST_ALBUMS, /**< arg1 (out): vlc_ml_album_list_t** */
364 VLC_ML_COUNT_ALBUMS, /**< arg1 (out): size_t* */
365 VLC_ML_LIST_GENRES, /**< arg1 (out): vlc_ml_genre_list_t** */
366 VLC_ML_COUNT_GENRES, /**< arg1 (out): size_t* */
367 VLC_ML_LIST_ARTISTS, /**< arg1 bool: includeAll; arg2 (out): vlc_ml_genre_list_t** */
368 VLC_ML_COUNT_ARTISTS, /**< arg1 bool: includeAll; arg2 (out): size_t* */
369 VLC_ML_LIST_SHOWS, /**< arg1 (out): vlc_ml_show_list_t** */
370 VLC_ML_COUNT_SHOWS, /**< arg1 (out): size_t* */
371 VLC_ML_LIST_PLAYLISTS, /**< arg1 (out): vlc_ml_playlist_list_t** */
372 VLC_ML_COUNT_PLAYLISTS, /**< arg1 (out): size_t* */
373 VLC_ML_LIST_HISTORY, /**< arg1 (out): vlc_ml_media_list_t** */
374 VLC_ML_LIST_STREAM_HISTORY, /**< arg1 (out): vlc_ml_media_list_t** */
376 /* Album specific listings */
377 VLC_ML_LIST_ALBUM_TRACKS, /**< arg1: The album id. arg2 (out): vlc_ml_media_list_t** */
378 VLC_ML_COUNT_ALBUM_TRACKS, /**< arg1: The album id. arg2 (out): size_t* */
379 VLC_ML_LIST_ALBUM_ARTISTS, /**< arg1: The album id. arg2 (out): vlc_ml_album_list_t** */
380 VLC_ML_COUNT_ALBUM_ARTISTS, /**< arg1: The album id. arg2 (out): size_t* */
382 /* Artist specific listings */
383 VLC_ML_LIST_ARTIST_ALBUMS, /**< arg1: The artist id. arg2(out): vlc_ml_album_list_t** */
384 VLC_ML_COUNT_ARTIST_ALBUMS, /**< arg1: The artist id. arg2(out): size_t* */
385 VLC_ML_LIST_ARTIST_TRACKS, /**< arg1: The artist id. arg2(out): vlc_ml_media_list_t** */
386 VLC_ML_COUNT_ARTIST_TRACKS, /**< arg1: The artist id. arg2(out): size_t* */
388 /* Genre specific listings */
389 VLC_ML_LIST_GENRE_ARTISTS, /**< arg1: genre id; arg2 (out): vlc_ml_artist_list_t** */
390 VLC_ML_COUNT_GENRE_ARTISTS, /**< arg1: genre id; arg2 (out): size_t* */
391 VLC_ML_LIST_GENRE_TRACKS, /**< arg1: genre id; arg2 (out): vlc_ml_media_list_t** */
392 VLC_ML_COUNT_GENRE_TRACKS, /**< arg1: genre id; arg2 (out): size_t* */
393 VLC_ML_LIST_GENRE_ALBUMS, /**< arg1: genre id; arg2 (out): vlc_ml_album_list_t** */
394 VLC_ML_COUNT_GENRE_ALBUMS, /**< arg1: genre id; arg2 (out): size_t* */
396 /* Show specific listings */
397 VLC_ML_LIST_SHOW_EPISODES, /**< arg1: show id; arg2(out): vlc_ml_media_list_t** */
398 VLC_ML_COUNT_SHOW_EPISODES, /**< arg1: show id; arg2(out): size_t* */
400 /* Media specific listings */
401 VLC_ML_LIST_MEDIA_LABELS, /**< arg1: media id; arg2 (out): vlc_ml_label_list_t** */
402 VLC_ML_COUNT_MEDIA_LABELS, /**< arg1: media id; arg2 (out): size_t* */
404 /* Playlist specific listings */
405 VLC_ML_LIST_PLAYLIST_MEDIA, /**< arg1: playlist id; arg2 (out): vlc_ml_media_list_t** */
406 VLC_ML_COUNT_PLAYLIST_MEDIA, /**< arg1: playlist id; arg2 (out): size_t* */
408 /* Children entities listing */
409 VLC_ML_LIST_MEDIA_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_media_list_t** */
410 VLC_ML_COUNT_MEDIA_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
411 VLC_ML_LIST_ARTISTS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_artist_list_t** */
412 VLC_ML_COUNT_ARTISTS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
413 VLC_ML_LIST_ALBUMS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_album_list_t** */
414 VLC_ML_COUNT_ALBUMS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
417 enum vlc_ml_parent_type
419 VLC_ML_PARENT_UNKNOWN,
420 VLC_ML_PARENT_ALBUM,
421 VLC_ML_PARENT_ARTIST,
422 VLC_ML_PARENT_SHOW,
423 VLC_ML_PARENT_GENRE,
424 VLC_ML_PARENT_PLAYLIST,
427 enum vlc_ml_control
429 /* Adds a folder to discover through the medialibrary */
430 VLC_ML_ADD_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
431 VLC_ML_REMOVE_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
432 VLC_ML_BAN_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
433 VLC_ML_UNBAN_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
434 VLC_ML_LIST_FOLDERS, /**< arg1: entrypoints (vlc_ml_entry_point_list_t**); res: can fail */
435 VLC_ML_IS_INDEXED, /**< arg1: mrl (const char*) arg2 (out): bool*; res: can fail */
437 * Reload a specific folder, or all.
438 * arg1: mrl (const char*), NULL to reload all folders
439 * res: can't fail
441 VLC_ML_RELOAD_FOLDER,
443 /* Pause/resume background operations, such as media discovery & media analysis */
444 VLC_ML_PAUSE_BACKGROUND, /**< no args; can't fail */
445 VLC_ML_RESUME_BACKGROUND, /**< no args; can't fail */
447 /* Misc operations */
448 VLC_ML_CLEAR_HISTORY, /**< no args; can't fail */
450 /* Create media */
451 VLC_ML_NEW_EXTERNAL_MEDIA, /**< arg1: const char*; arg2(out): vlc_ml_media_t** */
452 VLC_ML_NEW_STREAM, /**< arg1: const char*; arg2(out): vlc_ml_media_t** */
454 /* Media management */
455 VLC_ML_MEDIA_INCREASE_PLAY_COUNT, /**< arg1: media id; can fail */
456 VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: char**; */
457 VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: const char*; */
458 VLC_ML_MEDIA_SET_THUMBNAIL, /**< arg1: media id; arg2: const char*; arg3: vlc_ml_thumbnail_size_t */
459 VLC_ML_MEDIA_GENERATE_THUMBNAIL, /**< arg1: media id; arg2: vlc_ml_thumbnail_size_t; arg3: width; arg4: height; arg5: position */
460 VLC_ML_MEDIA_ADD_EXTERNAL_MRL, /**< arg1: media id; arg2: const char*; arg3: type(vlc_ml_file_type_t) */
464 * User playback settings.
465 * All values/units are up to the caller and are not interpreted by the media
466 * library.
467 * All values are stored and returned as strings.
468 * When calling vlc_medialibrary_t::pf_control with vlc_ml_MEDIA_GET_MEDIA_PLAYBACK_STATE,
469 * the value will be returned stored in the provided char**. If the state was
470 * not set yet, NULL will be returned.
471 * When setting a state, NULL can be provided as a value to unset it.
473 enum vlc_ml_playback_state
475 VLC_ML_PLAYBACK_STATE_RATING,
476 VLC_ML_PLAYBACK_STATE_PROGRESS,
477 VLC_ML_PLAYBACK_STATE_SPEED,
478 VLC_ML_PLAYBACK_STATE_TITLE,
479 VLC_ML_PLAYBACK_STATE_CHAPTER,
480 VLC_ML_PLAYBACK_STATE_PROGRAM,
481 VLC_ML_PLAYBACK_STATE_SEEN,
482 VLC_ML_PLAYBACK_STATE_VIDEO_TRACK,
483 VLC_ML_PLAYBACK_STATE_ASPECT_RATIO,
484 VLC_ML_PLAYBACK_STATE_ZOOM,
485 VLC_ML_PLAYBACK_STATE_CROP,
486 VLC_ML_PLAYBACK_STATE_DEINTERLACE,
487 VLC_ML_PLAYBACK_STATE_VIDEO_FILTER,
488 VLC_ML_PLAYBACK_STATE_AUDIO_TRACK,
489 VLC_ML_PLAYBACK_STATE_GAIN,
490 VLC_ML_PLAYBACK_STATE_AUDIO_DELAY,
491 VLC_ML_PLAYBACK_STATE_SUBTITLE_TRACK,
492 VLC_ML_PLAYBACK_STATE_SUBTITLE_DELAY,
493 VLC_ML_PLAYBACK_STATE_APP_SPECIFIC,
496 enum vlc_ml_event_type
499 * Entity modification callbacks. The affected entity will be passed:
500 * - As a vlc_ml_<type>_t, depending on the type of the modified/inserted
501 * entity, in vlc_ml_event_t::modification::p_<type>
502 * for ADDED and UPDATED variants.
503 * - as an id, in vlc_ml_event_t::deletion::i_entity_id
504 * When _DELETED callbacks get invoked, the entity will already have been
505 * deleted from the database, and cannot be retrieved anymore
507 VLC_ML_EVENT_MEDIA_ADDED,
508 VLC_ML_EVENT_MEDIA_UPDATED,
509 VLC_ML_EVENT_MEDIA_DELETED,
510 VLC_ML_EVENT_ARTIST_ADDED,
511 VLC_ML_EVENT_ARTIST_UPDATED,
512 VLC_ML_EVENT_ARTIST_DELETED,
513 VLC_ML_EVENT_ALBUM_ADDED,
514 VLC_ML_EVENT_ALBUM_UPDATED,
515 VLC_ML_EVENT_ALBUM_DELETED,
516 VLC_ML_EVENT_PLAYLIST_ADDED,
517 VLC_ML_EVENT_PLAYLIST_UPDATED,
518 VLC_ML_EVENT_PLAYLIST_DELETED,
519 VLC_ML_EVENT_GENRE_ADDED,
520 VLC_ML_EVENT_GENRE_UPDATED,
521 VLC_ML_EVENT_GENRE_DELETED,
523 * A discovery started.
524 * For each VLC_ML_EVENT_DISCOVERY_STARTED event, there will be
525 * 1 VLC_ML_EVENT_DISCOVERY_COMPLETED event, and N
526 * VLC_ML_EVENT_DISCOVERY_PROGRESS events.
527 * The entry point being discovered is stored in
528 * vlc_ml_event_t::discovery_started::psz_entry_point.
530 VLC_ML_EVENT_DISCOVERY_STARTED,
532 * Sent when a discovery or reload operation starts analyzing a new folder.
533 * The discovered entry point is stored in
534 * vlc_ml_event_t::discovery_progress::psz_entry_point.
536 VLC_ML_EVENT_DISCOVERY_PROGRESS,
538 * Sent when an entry point discovery is completed.
539 * The entry point that was being discovered is stored in
540 * vlc_ml_event_t::discovery_completed::psz_entry_point.
541 * The success or failure state is stored in
542 * vlc_ml_event_t::discovery_completed::b_success
544 VLC_ML_EVENT_DISCOVERY_COMPLETED,
546 * An entry point reload operation started.
547 * For all the entry points being reloaded, N VLC_EVENT_DISCOVERY_PROGRESS
548 * and 1 VLC_EVENT_RELOAD_COMPLETED event will be sent.
549 * The entry point being reloaded is stored in
550 * vlc_ml_event_t::reload_started::psz_entry_point.
552 VLC_ML_EVENT_RELOAD_STARTED,
554 * Sent when an entry point reload is completed.
555 * The entry point that was being reloaded is stored in
556 * vlc_ml_event_t::reload_completed::psz_entry_point.
557 * The success or failure state is stored in
558 * vlc_ml_event_t::reload_completed::b_success
560 VLC_ML_EVENT_RELOAD_COMPLETED,
562 * Sent when a new entry point gets added to the database.
563 * The entry point that was added is stored in
564 * vlc::ml_event_t::entry_point_added::psz_entry_point, and the success or failure
565 * state is stored in vlc_ml_event_t::entry_point_added::b_success
566 * If successful, this event won't be emited again for this entry point.
567 * In case of failure, this event will be fired again if the same entry point
568 * is queued for discovery again.
570 VLC_ML_EVENT_ENTRY_POINT_ADDED,
572 * Sent when an entry point removal request has been processed.
573 * The removed entry point is stored in
574 * vlc_ml_event_t::entry_point_removed::psz_entry_point and the success or failure
575 * state is stored in vlc_ml_event_t::entry_point_removed::b_success
577 VLC_ML_EVENT_ENTRY_POINT_REMOVED,
579 * Sent when an entry point ban request has been processed.
580 * The banned entry point is stored in
581 * vlc_ml_event_t::entry_point_banned::psz_entry_point and the operation success
582 * state is stored in vlc_ml_event_t::entry_point_banned::b_success
584 VLC_ML_EVENT_ENTRY_POINT_BANNED,
586 * Sent when an entry point unban request has been processed.
587 * The unbanned entry point is stored in
588 * vlc_ml_event_t::entry_point_unbanned::psz_entry_point and the operation success
589 * state is stored in vlc_ml_event_t::entry_point_unbanned::b_success
591 VLC_ML_EVENT_ENTRY_POINT_UNBANNED,
593 * Sent when a discoverer or parser threads changes its idle state.
594 * The idle state is stored in vlc_ml_event_t::background_idle_changed.b_idle.
595 * False means at least one background thread is in running, true means
596 * both discoverer & parser threads are paused.
598 VLC_ML_EVENT_BACKGROUND_IDLE_CHANGED,
600 * Sent when the parsing progress percentage gets updated.
601 * The percentage is stored as a [0;100] integer, in
602 * vlc_ml_event_t::parsing_progress::i_percent
603 * This value might decrease as more media get discovered, but it will only
604 * increase once all discovery operations are completed.
606 VLC_ML_EVENT_PARSING_PROGRESS_UPDATED,
608 * Sent after a media thumbnail was generated, or if it's generation failed.
609 * The media is stored in vlc_ml_event_t::media_thumbnail_generated::p_media
610 * and the success state is stored in
611 * vlc_ml_event_t::media_thumbnail_generated::b_success
613 VLC_ML_EVENT_MEDIA_THUMBNAIL_GENERATED,
616 typedef struct vlc_ml_event_t
618 int i_type;
619 union
621 struct
623 const char* psz_entry_point;
624 } discovery_started;
625 struct
627 const char* psz_entry_point;
628 } discovery_progress;
629 struct
631 const char* psz_entry_point;
632 bool b_success;
633 } discovery_completed;
634 struct
636 const char* psz_entry_point;
637 } reload_started;
638 struct
640 const char* psz_entry_point;
641 bool b_success;
642 } reload_completed;
643 struct
645 const char* psz_entry_point;
646 bool b_success;
647 } entry_point_added;
648 struct
650 const char* psz_entry_point;
651 bool b_success;
652 } entry_point_removed;
653 struct
655 const char* psz_entry_point;
656 bool b_success;
657 } entry_point_banned;
658 struct
660 const char* psz_entry_point;
661 bool b_success;
662 } entry_point_unbanned;
663 struct
665 uint8_t i_percent;
666 } parsing_progress;
667 union
669 const vlc_ml_media_t* p_media;
670 const vlc_ml_artist_t* p_artist;
671 const vlc_ml_album_t* p_album;
672 const vlc_ml_playlist_t* p_playlist;
673 const vlc_ml_genre_t* p_genre;
674 } creation;
675 struct
677 int64_t i_entity_id;
678 } modification;
679 struct
681 int64_t i_entity_id;
682 } deletion;
683 struct
685 bool b_idle;
686 } background_idle_changed;
687 struct
689 const vlc_ml_media_t* p_media;
690 vlc_ml_thumbnail_size_t i_size;
691 bool b_success;
692 } media_thumbnail_generated;
694 } vlc_ml_event_t;
696 typedef void (*vlc_ml_callback_t)( void* p_data, const vlc_ml_event_t* p_event );
698 typedef struct vlc_medialibrary_callbacks_t
700 void (*pf_send_event)( vlc_medialibrary_module_t* p_ml, const vlc_ml_event_t* p_event );
701 } vlc_medialibrary_callbacks_t;
703 struct vlc_medialibrary_module_t
705 struct vlc_object_t obj;
707 module_t *p_module;
709 void* p_sys;
711 int (*pf_control)( struct vlc_medialibrary_module_t* p_ml, int i_query, va_list args );
713 * List some entities from the medialibrary.
715 * \param p_ml The medialibrary module instance.
716 * \param i_query The type search to be performed. \see vlc_ml_list enumeration
717 * \param p_params A pointer to a vlc_ml_query_params_t structure, or NULL for
718 * the default parameters (alphabetical ascending sort, no pagination)
720 * \return VLC_SUCCESS or an error code
722 * Refer to the individual list of vlc_ml_list requests for the additional
723 * per-query input/ouput parameters values & types
725 int (*pf_list)( struct vlc_medialibrary_module_t* p_ml, int i_query,
726 const vlc_ml_query_params_t* p_params, va_list args );
729 * Get a specific entity by its id or another unique value
731 * \return The required entity, or a NULL pointer if couldn't be found.
733 * Refer to the list of queries for the specific return type
735 void* (*pf_get)( struct vlc_medialibrary_module_t* p_ml, int i_query, va_list args );
737 const vlc_medialibrary_callbacks_t* cbs;
740 vlc_medialibrary_t* libvlc_MlCreate( libvlc_int_t* p_libvlc );
741 void libvlc_MlRelease( vlc_medialibrary_t* p_ml );
743 VLC_API vlc_medialibrary_t* vlc_ml_instance_get( vlc_object_t* p_obj ) VLC_USED;
744 #define vlc_ml_instance_get(x) vlc_ml_instance_get( VLC_OBJECT(x) )
746 VLC_API void* vlc_ml_get( vlc_medialibrary_t* p_ml, int i_query, ... ) VLC_USED;
747 VLC_API int vlc_ml_control( vlc_medialibrary_t* p_ml, int i_query, ... ) VLC_USED;
748 VLC_API int vlc_ml_list( vlc_medialibrary_t* p_ml, int i_query,
749 const vlc_ml_query_params_t* p_params, ... );
752 * \brief Registers a medialibrary callback.
753 * \returns A handle to the callback, to be passed to vlc_ml_event_unregister_callback
755 VLC_API vlc_ml_event_callback_t*
756 vlc_ml_event_register_callback( vlc_medialibrary_t* p_ml, vlc_ml_callback_t cb, void* p_data );
759 * \brief Unregisters a medialibrary callback
760 * \param p_handle The handled returned by vlc_ml_register_callback
762 VLC_API void vlc_ml_event_unregister_callback( vlc_medialibrary_t* p_ml,
763 vlc_ml_event_callback_t* p_callback );
765 * \brief Unregisters a medialibrary callback from the said callback.
766 * \param p_callback The handle returned by vlc_ml_register_callback
768 * This must only be called synchronously from the callback function provided to
769 * vlc_ml_event_register_callback
770 * The p_callback handle must be considered invalid when this function returns
772 VLC_API void vlc_ml_event_unregister_from_callback( vlc_medialibrary_t* p_ml,
773 vlc_ml_event_callback_t* p_callback );
776 VLC_API void vlc_ml_show_release( vlc_ml_show_t* p_show );
777 VLC_API void vlc_ml_artist_release( vlc_ml_artist_t* p_artist );
778 VLC_API void vlc_ml_genre_release( vlc_ml_genre_t* p_genre );
779 VLC_API void vlc_ml_media_release( vlc_ml_media_t* p_media );
780 VLC_API void vlc_ml_album_release( vlc_ml_album_t* p_album );
781 VLC_API void vlc_ml_playlist_release( vlc_ml_playlist_t* p_playlist );
783 VLC_API void vlc_ml_label_list_release( vlc_ml_label_list_t* p_list );
784 VLC_API void vlc_ml_file_list_release( vlc_ml_file_list_t* p_list );
785 VLC_API void vlc_ml_artist_list_release( vlc_ml_artist_list_t* p_list );
786 VLC_API void vlc_ml_media_list_release( vlc_ml_media_list_t* p_list );
787 VLC_API void vlc_ml_album_list_release( vlc_ml_album_list_t* p_list );
788 VLC_API void vlc_ml_show_list_release( vlc_ml_show_list_t* p_list );
789 VLC_API void vlc_ml_genre_list_release( vlc_ml_genre_list_t* p_list );
790 VLC_API void vlc_ml_playlist_list_release( vlc_ml_playlist_list_t* p_list );
791 VLC_API void vlc_ml_entry_point_list_release( vlc_ml_entry_point_list_t* p_list );
793 static inline vlc_ml_query_params_t vlc_ml_query_params_create()
795 return (vlc_ml_query_params_t) {
796 .psz_pattern = NULL,
797 .i_nbResults = 0,
798 .i_offset = 0,
799 .i_sort = VLC_ML_SORTING_DEFAULT,
800 .b_desc = false
804 static inline int vlc_ml_add_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
806 return vlc_ml_control( p_ml, VLC_ML_ADD_FOLDER, psz_folder );
809 static inline int vlc_ml_remove_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
811 return vlc_ml_control( p_ml, VLC_ML_REMOVE_FOLDER, psz_folder );
814 static inline int vlc_ml_ban_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
816 return vlc_ml_control( p_ml, VLC_ML_BAN_FOLDER, psz_folder );
819 static inline int vlc_ml_unban_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
821 return vlc_ml_control( p_ml, VLC_ML_UNBAN_FOLDER, psz_folder );
824 static inline int vlc_ml_list_folder( vlc_medialibrary_t* p_ml,
825 vlc_ml_entry_point_list_t** pp_entrypoints )
827 return vlc_ml_control( p_ml, VLC_ML_LIST_FOLDERS, pp_entrypoints );
830 static inline int vlc_ml_is_indexed( vlc_medialibrary_t* p_ml,
831 const char* psz_mrl, bool* p_res )
833 return vlc_ml_control( p_ml, VLC_ML_IS_INDEXED, psz_mrl, p_res );
836 static inline int vlc_ml_reload_folder( vlc_medialibrary_t* p_ml, const char* psz_mrl )
838 return vlc_ml_control( p_ml, VLC_ML_RELOAD_FOLDER, psz_mrl );
841 static inline int vlc_ml_pause_background( vlc_medialibrary_t* p_ml )
843 return vlc_ml_control( p_ml, VLC_ML_PAUSE_BACKGROUND );
846 static inline int vlc_ml_resume_background( vlc_medialibrary_t* p_ml )
848 return vlc_ml_control( p_ml, VLC_ML_RESUME_BACKGROUND );
851 static inline int vlc_ml_clear_history( vlc_medialibrary_t* p_ml )
853 return vlc_ml_control( p_ml, VLC_ML_CLEAR_HISTORY );
856 static inline vlc_ml_media_t* vlc_ml_new_external_media( vlc_medialibrary_t* p_ml, const char* psz_mrl )
858 vlc_ml_media_t* res;
859 if ( vlc_ml_control( p_ml, VLC_ML_NEW_EXTERNAL_MEDIA, psz_mrl, &res ) != VLC_SUCCESS )
860 return NULL;
861 return res;
864 static inline vlc_ml_media_t* vlc_ml_new_stream( vlc_medialibrary_t* p_ml, const char* psz_mrl )
866 vlc_ml_media_t* res;
867 if ( vlc_ml_control( p_ml, VLC_ML_NEW_STREAM, psz_mrl, &res ) != VLC_SUCCESS )
868 return NULL;
869 return res;
872 static inline int vlc_ml_media_increase_playcount( vlc_medialibrary_t* p_ml, int64_t i_media_id )
874 return vlc_ml_control( p_ml, VLC_ML_MEDIA_INCREASE_PLAY_COUNT, i_media_id );
877 static inline int vlc_ml_media_get_playback_state( vlc_medialibrary_t* p_ml, int64_t i_media_id, int i_state, char** ppsz_result )
879 return vlc_ml_control( p_ml, VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE, i_media_id, i_state, ppsz_result );
882 static inline int vlc_ml_media_set_playback_state( vlc_medialibrary_t* p_ml, int64_t i_media_id, int i_state, const char* psz_value )
884 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, i_media_id, i_state, psz_value );
887 static inline int vlc_ml_media_set_thumbnail( vlc_medialibrary_t* p_ml, int64_t i_media_id,
888 const char* psz_mrl, vlc_ml_thumbnail_size_t sizeType )
890 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_THUMBNAIL, i_media_id, psz_mrl, sizeType );
893 static inline int vlc_ml_media_generate_thumbnail( vlc_medialibrary_t* p_ml, int64_t i_media_id,
894 vlc_ml_thumbnail_size_t size_type,
895 uint32_t i_desired_width,
896 uint32_t i_desired_height,
897 float position )
899 return vlc_ml_control( p_ml, VLC_ML_MEDIA_GENERATE_THUMBNAIL, i_media_id,
900 size_type, i_desired_width, i_desired_height, position );
903 static inline int vlc_ml_media_add_external_mrl( vlc_medialibrary_t* p_ml, int64_t i_media_id,
904 const char* psz_mrl, int i_type )
906 return vlc_ml_control( p_ml, VLC_ML_MEDIA_ADD_EXTERNAL_MRL, i_media_id, psz_mrl, i_type );
909 static inline vlc_ml_media_t* vlc_ml_get_media( vlc_medialibrary_t* p_ml, int64_t i_media_id )
911 return (vlc_ml_media_t*)vlc_ml_get( p_ml, VLC_ML_GET_MEDIA, i_media_id );
914 static inline vlc_ml_media_t* vlc_ml_get_media_by_mrl( vlc_medialibrary_t* p_ml,
915 const char* psz_mrl )
917 return (vlc_ml_media_t*)vlc_ml_get( p_ml, VLC_ML_GET_MEDIA_BY_MRL, psz_mrl );
920 static inline input_item_t* vlc_ml_get_input_item( vlc_medialibrary_t* p_ml, int64_t i_media_id )
922 return (input_item_t*)vlc_ml_get( p_ml, VLC_ML_GET_INPUT_ITEM, i_media_id );
925 static inline input_item_t* vlc_ml_get_input_item_by_mrl( vlc_medialibrary_t* p_ml,
926 const char* psz_mrl )
928 return (input_item_t*)vlc_ml_get( p_ml, VLC_ML_GET_INPUT_ITEM_BY_MRL, psz_mrl );
931 static inline vlc_ml_album_t* vlc_ml_get_album( vlc_medialibrary_t* p_ml, int64_t i_album_id )
933 return (vlc_ml_album_t*)vlc_ml_get( p_ml, VLC_ML_GET_ALBUM, i_album_id );
936 static inline vlc_ml_artist_t* vlc_ml_get_artist( vlc_medialibrary_t* p_ml, int64_t i_artist_id )
938 return (vlc_ml_artist_t*)vlc_ml_get( p_ml, VLC_ML_GET_ARTIST, i_artist_id );
941 static inline vlc_ml_genre_t* vlc_ml_get_genre( vlc_medialibrary_t* p_ml, int64_t i_genre_id )
943 return (vlc_ml_genre_t*)vlc_ml_get( p_ml, VLC_ML_GET_GENRE, i_genre_id );
946 static inline vlc_ml_show_t* vlc_ml_get_show( vlc_medialibrary_t* p_ml, int64_t i_show_id )
948 return (vlc_ml_show_t*)vlc_ml_get( p_ml, VLC_ML_GET_SHOW, i_show_id );
951 static inline vlc_ml_playlist_t* vlc_ml_get_playlist( vlc_medialibrary_t* p_ml, int64_t i_playlist_id )
953 return (vlc_ml_playlist_t*)vlc_ml_get( p_ml, VLC_ML_GET_PLAYLIST, i_playlist_id );
956 static inline vlc_ml_media_list_t* vlc_ml_list_media_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
958 vlc_assert( p_ml != NULL );
959 vlc_ml_media_list_t* res;
960 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
961 return NULL;
962 return res;
965 static inline size_t vlc_ml_count_media_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
967 vlc_assert( p_ml != NULL );
968 size_t res;
969 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_MEDIA_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
970 return 0;
971 return res;
974 static inline vlc_ml_artist_list_t* vlc_ml_list_artist_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
976 vlc_assert( p_ml != NULL );
977 vlc_ml_artist_list_t* res;
978 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTISTS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
979 return NULL;
980 return res;
983 static inline size_t vlc_ml_count_artists_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
985 vlc_assert( p_ml != NULL );
986 size_t res;
987 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTISTS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
988 return 0;
989 return res;
992 static inline vlc_ml_album_list_t* vlc_ml_list_albums_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
994 vlc_assert( p_ml != NULL );
995 vlc_ml_album_list_t* res;
996 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUMS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
997 return NULL;
998 return res;
1001 static inline size_t vlc_ml_count_albums_of( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int i_parent_type, int64_t i_parent_id )
1003 vlc_assert( p_ml != NULL );
1004 size_t res;
1005 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUMS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1006 return 0;
1007 return res;
1010 static inline vlc_ml_media_list_t* vlc_ml_list_album_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_album_id )
1012 vlc_assert( p_ml != NULL );
1013 vlc_ml_media_list_t* res;
1014 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUM_TRACKS, params, i_album_id, &res ) != VLC_SUCCESS )
1015 return NULL;
1016 return res;
1019 static inline size_t vlc_ml_count_album_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_album_id )
1021 vlc_assert( p_ml != NULL );
1022 size_t count;
1023 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUM_TRACKS, params, i_album_id, &count ) != VLC_SUCCESS )
1024 return 0;
1025 return count;
1028 static inline vlc_ml_media_list_t* vlc_ml_list_album_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_album_id )
1030 vlc_assert( p_ml != NULL );
1031 vlc_ml_media_list_t* res;
1032 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUM_ARTISTS, params, i_album_id, &res ) != VLC_SUCCESS )
1033 return NULL;
1034 return res;
1037 static inline size_t vlc_ml_count_album_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_album_id )
1039 vlc_assert( p_ml != NULL );
1040 size_t count;
1041 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUM_ARTISTS, params, i_album_id, &count ) != VLC_SUCCESS )
1042 return 0;
1043 return count;
1046 static inline vlc_ml_album_list_t* vlc_ml_list_artist_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_artist_id )
1048 vlc_assert( p_ml != NULL );
1049 vlc_ml_album_list_t* res;
1050 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTIST_ALBUMS, params, i_artist_id, &res ) != VLC_SUCCESS )
1051 return NULL;
1052 return res;
1055 static inline size_t vlc_ml_count_artist_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_artist_id )
1057 vlc_assert( p_ml != NULL );
1058 size_t count;
1059 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTIST_ALBUMS, params, i_artist_id, &count ) != VLC_SUCCESS )
1060 return 0;
1061 return count;
1064 static inline vlc_ml_media_list_t* vlc_ml_list_artist_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_artist_id )
1066 vlc_assert( p_ml != NULL );
1067 vlc_ml_media_list_t* res;
1068 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTIST_TRACKS, params, i_artist_id, &res ) != VLC_SUCCESS )
1069 return NULL;
1070 return res;
1073 static inline size_t vlc_ml_count_artist_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_artist_id )
1075 vlc_assert( p_ml != NULL );
1076 size_t count;
1077 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTIST_TRACKS, params, i_artist_id, &count ) != VLC_SUCCESS )
1078 return 0;
1079 return count;
1082 static inline vlc_ml_media_list_t* vlc_ml_list_video_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1084 vlc_assert( p_ml != NULL );
1085 vlc_ml_media_list_t* res;
1086 if ( vlc_ml_list( p_ml, VLC_ML_LIST_VIDEOS, params, &res ) != VLC_SUCCESS )
1087 return NULL;
1088 return res;
1091 static inline size_t vlc_ml_count_video_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1093 vlc_assert( p_ml != NULL );
1094 size_t count;
1095 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_VIDEOS, params, &count ) != VLC_SUCCESS )
1096 return 0;
1097 return count;
1100 static inline vlc_ml_media_list_t* vlc_ml_list_audio_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1102 vlc_assert( p_ml != NULL );
1103 vlc_ml_media_list_t* res;
1104 if ( vlc_ml_list( p_ml, VLC_ML_LIST_AUDIOS, params, &res ) != VLC_SUCCESS )
1105 return NULL;
1106 return res;
1109 static inline size_t vlc_ml_count_audio_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1111 vlc_assert( p_ml != NULL );
1112 size_t count;
1113 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_AUDIOS, params, &count ) != VLC_SUCCESS )
1114 return 0;
1115 return count;
1118 static inline vlc_ml_album_list_t* vlc_ml_list_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1120 vlc_assert( p_ml != NULL );
1121 vlc_ml_album_list_t* res;
1122 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUMS, params, &res ) != VLC_SUCCESS )
1123 return NULL;
1124 return res;
1127 static inline size_t vlc_ml_count_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1129 vlc_assert( p_ml != NULL );
1130 size_t count;
1131 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUMS, params, &count ) != VLC_SUCCESS )
1132 return 0;
1133 return count;
1136 static inline vlc_ml_genre_list_t* vlc_ml_list_genres( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1138 vlc_assert( p_ml != NULL );
1139 vlc_ml_genre_list_t* res;
1140 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRES, params, &res ) != VLC_SUCCESS )
1141 return NULL;
1142 return res;
1145 static inline size_t vlc_ml_count_genres( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1147 vlc_assert( p_ml != NULL );
1148 size_t count;
1149 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRES, params, &count ) != VLC_SUCCESS )
1150 return 0;
1151 return count;
1155 * @brief vlc_ml_list_artists
1156 * @param params Query parameters, or NULL for the default
1157 * @param b_include_all True if you wish to fetch artists without at least one album.
1158 * @return
1160 static inline vlc_ml_artist_list_t* vlc_ml_list_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, bool b_include_all )
1162 vlc_assert( p_ml != NULL );
1163 vlc_ml_artist_list_t* res;
1164 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTISTS, params, (int)b_include_all, &res ) != VLC_SUCCESS )
1165 return NULL;
1166 return res;
1169 static inline size_t vlc_ml_count_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, bool includeAll )
1171 vlc_assert( p_ml != NULL );
1172 size_t count;
1173 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTISTS, params, includeAll, &count ) != VLC_SUCCESS )
1174 return 0;
1175 return count;
1178 static inline vlc_ml_show_list_t* vlc_ml_list_shows( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1180 vlc_assert( p_ml != NULL );
1181 vlc_ml_show_list_t* res;
1182 if ( vlc_ml_list( p_ml, VLC_ML_LIST_SHOWS, params, &res ) != VLC_SUCCESS )
1183 return NULL;
1184 return res;
1187 static inline size_t vlc_ml_count_shows( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1189 vlc_assert( p_ml != NULL );
1190 size_t count;
1191 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_SHOWS, params, &count ) != VLC_SUCCESS )
1192 return 0;
1193 return count;
1196 static inline vlc_ml_media_list_t* vlc_ml_list_genre_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1198 vlc_assert( p_ml != NULL );
1199 vlc_ml_media_list_t* res;
1200 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_ARTISTS, params, i_genre_id, &res ) != VLC_SUCCESS )
1201 return NULL;
1202 return res;
1205 static inline size_t vlc_ml_count_genre_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1207 vlc_assert( p_ml != NULL );
1208 size_t count;
1209 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ARTISTS, params, i_genre_id, &count ) != VLC_SUCCESS )
1210 return 0;
1211 return count;
1214 static inline vlc_ml_media_list_t* vlc_ml_list_genre_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1216 vlc_assert( p_ml != NULL );
1217 vlc_ml_media_list_t* res;
1218 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_TRACKS, params, i_genre_id, &res ) != VLC_SUCCESS )
1219 return NULL;
1220 return res;
1223 static inline size_t vlc_ml_count_genre_tracks( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1225 vlc_assert( p_ml != NULL );
1226 size_t count;
1227 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_TRACKS, params, i_genre_id, &count ) != VLC_SUCCESS )
1228 return 0;
1229 return count;
1232 static inline vlc_ml_album_list_t* vlc_ml_list_genre_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1234 vlc_assert( p_ml != NULL );
1235 vlc_ml_album_list_t* res;
1236 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_ALBUMS, params, i_genre_id, &res ) != VLC_SUCCESS )
1237 return NULL;
1238 return res;
1241 static inline size_t vlc_ml_count_genre_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_genre_id )
1243 vlc_assert( p_ml != NULL );
1244 size_t count;
1245 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ALBUMS, params, i_genre_id, &count ) != VLC_SUCCESS )
1246 return 0;
1247 return count;
1250 static inline vlc_ml_media_list_t* vlc_ml_list_show_episodes( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_show_id )
1252 vlc_assert( p_ml != NULL );
1253 vlc_ml_media_list_t* res;
1254 if ( vlc_ml_list( p_ml, VLC_ML_LIST_SHOW_EPISODES, params, i_show_id, &res ) != VLC_SUCCESS )
1255 return NULL;
1256 return res;
1259 static inline size_t vlc_ml_count_show_episodes( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_show_id )
1261 vlc_assert( p_ml != NULL );
1262 size_t count;
1263 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ALBUMS, params, i_show_id, &count ) != VLC_SUCCESS )
1264 return 0;
1265 return count;
1268 static inline vlc_ml_label_list_t* vlc_ml_list_media_labels( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_media_id )
1270 vlc_assert( p_ml != NULL );
1271 vlc_ml_label_list_t* res;
1272 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_LABELS, params, i_media_id, &res ) != VLC_SUCCESS )
1273 return NULL;
1274 return res;
1277 static inline size_t vlc_ml_count_media_labels( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_media_id )
1279 vlc_assert( p_ml != NULL );
1280 size_t count;
1281 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_LABELS, params, i_media_id, &count ) != VLC_SUCCESS )
1282 return 0;
1283 return count;
1286 static inline vlc_ml_media_list_t* vlc_ml_list_history( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1288 vlc_assert( p_ml != NULL );
1289 vlc_ml_media_list_t* res;
1290 if ( vlc_ml_list( p_ml, VLC_ML_LIST_HISTORY, params, &res ) != VLC_SUCCESS )
1291 return NULL;
1292 return res;
1295 static inline vlc_ml_media_list_t* vlc_ml_list_stream_history( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1297 vlc_assert( p_ml != NULL );
1298 vlc_ml_media_list_t* res;
1299 if ( vlc_ml_list( p_ml, VLC_ML_LIST_STREAM_HISTORY, params, &res ) != VLC_SUCCESS )
1300 return NULL;
1301 return res;
1304 static inline vlc_ml_playlist_list_t* vlc_ml_list_playlists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1306 vlc_assert( p_ml != NULL );
1307 vlc_ml_playlist_list_t* res;
1308 if ( vlc_ml_list( p_ml, VLC_ML_LIST_PLAYLISTS, params, &res ) != VLC_SUCCESS )
1309 return NULL;
1310 return res;
1313 static inline size_t vlc_ml_count_playlists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1315 vlc_assert( p_ml != NULL );
1316 size_t count;
1317 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_PLAYLISTS, params, &count ) != VLC_SUCCESS )
1318 return 0;
1319 return count;
1322 static inline vlc_ml_media_list_t* vlc_ml_list_playlist_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_playlist_id )
1324 vlc_assert( p_ml != NULL );
1325 vlc_ml_media_list_t* res;
1326 if ( vlc_ml_list( p_ml, VLC_ML_LIST_PLAYLIST_MEDIA, params, i_playlist_id, &res ) != VLC_SUCCESS )
1327 return NULL;
1328 return res;
1331 static inline size_t vlc_ml_count_playlist_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, int64_t i_playlist_id )
1333 vlc_assert( p_ml != NULL );
1334 size_t count;
1335 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_PLAYLIST_MEDIA, params, i_playlist_id, &count ) != VLC_SUCCESS )
1336 return 0;
1337 return count;
1340 #ifdef __cplusplus
1342 #endif /* C++ */
1344 #ifndef __cplusplus
1345 # define vlc_ml_release( OBJ ) _Generic( ( OBJ ), \
1346 vlc_ml_show_t*: vlc_ml_show_release, \
1347 vlc_ml_artist_t*: vlc_ml_artist_release, \
1348 vlc_ml_album_t*: vlc_ml_album_release, \
1349 vlc_ml_genre_t*: vlc_ml_genre_release, \
1350 vlc_ml_media_t*: vlc_ml_media_release, \
1351 vlc_ml_playlist_t*: vlc_ml_playlist_release, \
1352 vlc_ml_label_list_t*: vlc_ml_label_list_release, \
1353 vlc_ml_file_list_t*: vlc_ml_file_list_release, \
1354 vlc_ml_artist_list_t*: vlc_ml_artist_list_release, \
1355 vlc_ml_media_list_t*: vlc_ml_media_list_release, \
1356 vlc_ml_album_list_t*: vlc_ml_album_list_release, \
1357 vlc_ml_show_list_t*: vlc_ml_show_list_release, \
1358 vlc_ml_genre_list_t*: vlc_ml_genre_list_release, \
1359 vlc_ml_playlist_list_t*: vlc_ml_playlist_list_release, \
1360 vlc_ml_entry_point_list_t*: vlc_ml_entry_point_list_release \
1361 )( OBJ )
1362 #else
1363 static inline void vlc_ml_release( vlc_ml_show_t* show ) { vlc_ml_show_release( show ); }
1364 static inline void vlc_ml_release( vlc_ml_artist_t* artist ) { vlc_ml_artist_release( artist ); }
1365 static inline void vlc_ml_release( vlc_ml_album_t* album ) { vlc_ml_album_release( album ); }
1366 static inline void vlc_ml_release( vlc_ml_genre_t* genre ) { vlc_ml_genre_release( genre ); }
1367 static inline void vlc_ml_release( vlc_ml_media_t* media ) { vlc_ml_media_release( media ); }
1368 static inline void vlc_ml_release( vlc_ml_playlist_t* playlist ) { vlc_ml_playlist_release( playlist ); }
1369 static inline void vlc_ml_release( vlc_ml_label_list_t* list ) { vlc_ml_label_list_release( list ); }
1370 static inline void vlc_ml_release( vlc_ml_file_list_t* list ) { vlc_ml_file_list_release( list ); }
1371 static inline void vlc_ml_release( vlc_ml_artist_list_t* list ) { vlc_ml_artist_list_release( list ); }
1372 static inline void vlc_ml_release( vlc_ml_media_list_t* list ) { vlc_ml_media_list_release( list ); }
1373 static inline void vlc_ml_release( vlc_ml_album_list_t* list ) { vlc_ml_album_list_release( list ); }
1374 static inline void vlc_ml_release( vlc_ml_show_list_t* list ) { vlc_ml_show_list_release( list ); }
1375 static inline void vlc_ml_release( vlc_ml_genre_list_t* list ) { vlc_ml_genre_list_release( list ); }
1376 static inline void vlc_ml_release( vlc_ml_playlist_list_t* list ) { vlc_ml_playlist_list_release( list ); }
1377 static inline void vlc_ml_release( vlc_ml_entry_point_list_t* list ) { vlc_ml_entry_point_list_release( list ); }
1378 #endif
1380 #endif /* VLC_MEDIA_LIBRARY_H */