videotoolbox: Do not use TRUE/FALSE for Booleans
[vlc.git] / include / vlc_media_library.h
blob55a170db61c541dfb50b5aff85c3c3fabdaa41d5
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_t;
44 typedef enum vlc_ml_media_subtype_t
46 VLC_ML_MEDIA_SUBTYPE_UNKNOWN,
47 VLC_ML_MEDIA_SUBTYPE_SHOW_EPISODE,
48 VLC_ML_MEDIA_SUBTYPE_MOVIE,
49 VLC_ML_MEDIA_SUBTYPE_ALBUMTRACK,
50 } vlc_ml_media_subtype_t;
52 typedef enum vlc_ml_file_type_t
54 VLC_ML_FILE_TYPE_UNKNOWN,
55 VLC_ML_FILE_TYPE_MAIN,
56 VLC_ML_FILE_TYPE_PART,
57 VLC_ML_FILE_TYPE_SOUNDTRACK,
58 VLC_ML_FILE_TYPE_SUBTITLE,
59 VLC_ML_FILE_TYPE_PLAYLIST,
60 } vlc_ml_file_type_t;
62 typedef enum vlc_ml_track_type_t
64 VLC_ML_TRACK_TYPE_UNKNOWN,
65 VLC_ML_TRACK_TYPE_VIDEO,
66 VLC_ML_TRACK_TYPE_AUDIO,
67 } vlc_ml_track_type_t;
69 typedef enum vlc_ml_thumbnail_size_t
71 VLC_ML_THUMBNAIL_SMALL,
72 VLC_ML_THUMBNAIL_BANNER,
74 VLC_ML_THUMBNAIL_SIZE_COUNT
75 } vlc_ml_thumbnail_size_t;
77 typedef enum vlc_ml_history_type_t
79 VLC_ML_HISTORY_TYPE_MEDIA,
80 VLC_ML_HISTORY_TYPE_NETWORK,
81 } vlc_ml_history_type_t;
83 typedef struct vlc_ml_thumbnail_t
85 char* psz_mrl;
86 /**
87 * True if a thumbnail is available, or if thumbnail generation was
88 * attempted but failed
90 bool b_generated;
91 } vlc_ml_thumbnail_t;
93 typedef struct vlc_ml_movie_t
95 char* psz_summary;
96 char* psz_imdb_id;
97 } vlc_ml_movie_t;
99 typedef struct vlc_ml_show_episode_t
101 char* psz_summary;
102 char* psz_tvdb_id;
103 uint32_t i_episode_nb;
104 uint32_t i_season_number;
105 } vlc_ml_show_episode_t;
107 typedef struct vlc_ml_show_t
109 int64_t i_id;
110 char* psz_name;
111 char* psz_summary;
112 char* psz_artwork_mrl;
113 char* psz_tvdb_id;
114 unsigned int i_release_year;
115 uint32_t i_nb_episodes;
116 uint32_t i_nb_seasons;
117 } vlc_ml_show_t;
119 typedef struct vlc_ml_album_track_t
121 int64_t i_artist_id;
122 int64_t i_album_id;
123 int64_t i_genre_id;
125 int i_track_nb;
126 int i_disc_nb;
127 } vlc_ml_album_track_t;
129 typedef struct vlc_ml_label_t
131 int64_t i_id;
132 char* psz_name;
133 } vlc_ml_label_t;
135 typedef struct vlc_ml_label_list_t
137 size_t i_nb_items;
138 vlc_ml_label_t p_items[];
139 } vlc_ml_label_list_t;
141 typedef struct vlc_ml_file_t
143 char* psz_mrl;
144 vlc_ml_file_type_t i_type;
145 bool b_external;
146 bool b_removable;
147 bool b_present;
148 } vlc_ml_file_t;
150 typedef struct vlc_ml_file_list_t
152 size_t i_nb_items;
153 vlc_ml_file_t p_items[];
154 } vlc_ml_file_list_t;
156 typedef struct vlc_ml_media_track_t
158 char* psz_codec;
159 char* psz_language;
160 char* psz_description;
161 vlc_ml_track_type_t i_type;
162 uint32_t i_bitrate;
163 union
165 struct
167 // Audio
168 uint32_t i_nbChannels;
169 uint32_t i_sampleRate;
170 } a;
171 struct
173 // Video
174 uint32_t i_height;
175 uint32_t i_width;
176 uint32_t i_sarNum;
177 uint32_t i_sarDen;
178 uint32_t i_fpsNum;
179 uint32_t i_fpsDen;
180 } v;
182 } vlc_ml_media_track_t;
184 typedef struct vlc_ml_media_track_list_t
186 size_t i_nb_items;
187 vlc_ml_media_track_t p_items[];
188 } vlc_ml_media_track_list_t;
190 typedef struct vlc_ml_media_t
192 int64_t i_id;
194 vlc_ml_media_type_t i_type;
195 vlc_ml_media_subtype_t i_subtype;
197 vlc_ml_file_list_t* p_files;
198 vlc_ml_media_track_list_t* p_tracks;
200 int32_t i_year;
201 /* Duration in milliseconds */
202 int64_t i_duration;
203 uint32_t i_playcount;
204 time_t i_last_played_date;
205 char* psz_title;
207 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
209 bool b_is_favorite;
211 union
213 vlc_ml_show_episode_t show_episode;
214 vlc_ml_movie_t movie;
215 vlc_ml_album_track_t album_track;
217 } vlc_ml_media_t;
219 typedef struct vlc_ml_playlist_t
221 int64_t i_id;
222 char* psz_name;
223 uint32_t i_creation_date;
224 char* psz_artwork_mrl;
225 } vlc_ml_playlist_t;
227 typedef struct vlc_ml_artist_t
229 int64_t i_id;
230 char* psz_name;
231 char* psz_shortbio;
232 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
233 char* psz_mb_id;
235 unsigned int i_nb_album;
236 unsigned int i_nb_tracks;
237 } vlc_ml_artist_t;
239 typedef struct vlc_ml_artist_list_t
241 size_t i_nb_items;
242 vlc_ml_artist_t p_items[];
243 } vlc_ml_artist_list_t;
245 typedef struct vlc_ml_album_t {
246 int64_t i_id;
247 char* psz_title;
248 char* psz_summary;
249 vlc_ml_thumbnail_t thumbnails[VLC_ML_THUMBNAIL_SIZE_COUNT];
250 char* psz_artist;
251 int64_t i_artist_id;
253 size_t i_nb_tracks;
254 unsigned int i_duration;
255 unsigned int i_year;
256 } vlc_ml_album_t;
258 typedef struct vlc_ml_genre_t
260 int64_t i_id;
261 char* psz_name;
262 size_t i_nb_tracks;
263 } vlc_ml_genre_t;
265 typedef struct vlc_ml_media_list_t
267 size_t i_nb_items;
268 vlc_ml_media_t p_items[];
269 } vlc_ml_media_list_t;
271 typedef struct vlc_ml_album_list_t
273 size_t i_nb_items;
274 vlc_ml_album_t p_items[];
275 } vlc_ml_album_list_t;
277 typedef struct vlc_ml_show_list_t
279 size_t i_nb_items;
280 vlc_ml_show_t p_items[];
281 } vlc_ml_show_list_t;
283 typedef struct vlc_ml_genre_list_t
285 size_t i_nb_items;
286 vlc_ml_genre_t p_items[];
287 } vlc_ml_genre_list_t;
289 typedef struct vlc_ml_playlist_list_t
291 size_t i_nb_items;
292 vlc_ml_playlist_t p_items[];
293 } vlc_ml_playlist_list_t;
295 typedef struct vlc_ml_entry_point_t
297 char* psz_mrl; /**< This entrypoint's MRL. Will be NULL if b_present is false */
298 bool b_present; /**< The presence state for this entrypoint. */
299 bool b_banned; /**< Will be true if the user required this entrypoint to be excluded */
300 } vlc_ml_entry_point_t;
302 typedef struct vlc_ml_entry_point_list_t
304 size_t i_nb_items;
305 vlc_ml_entry_point_t p_items[];
306 } vlc_ml_entry_point_list_t;
308 /* Opaque medialibrary pointer, to be used by any non-medialibrary module */
309 typedef struct vlc_medialibrary_t vlc_medialibrary_t;
310 /* "Private" medialibrary pointer, to be used by the core & medialibrary modules */
311 typedef struct vlc_medialibrary_module_t vlc_medialibrary_module_t;
312 /* Opaque event callback type */
313 typedef struct vlc_ml_event_callback_t vlc_ml_event_callback_t;
315 typedef enum vlc_ml_sorting_criteria_t
318 * Default depends on the entity type:
319 * - By track number (and disc number) for album tracks
320 * - Alphabetical order for others
322 VLC_ML_SORTING_DEFAULT,
323 VLC_ML_SORTING_ALPHA,
324 VLC_ML_SORTING_DURATION,
325 VLC_ML_SORTING_INSERTIONDATE,
326 VLC_ML_SORTING_LASTMODIFICATIONDATE,
327 VLC_ML_SORTING_RELEASEDATE,
328 VLC_ML_SORTING_FILESIZE,
329 VLC_ML_SORTING_ARTIST,
330 VLC_ML_SORTING_PLAYCOUNT,
331 VLC_ML_SORTING_ALBUM,
332 VLC_ML_SORTING_FILENAME,
333 VLC_ML_SORTING_TRACKNUMBER,
334 } vlc_ml_sorting_criteria_t;
336 typedef struct vlc_ml_query_params_t vlc_ml_query_params_t;
337 struct vlc_ml_query_params_t
339 const char* psz_pattern;
340 uint32_t i_nbResults;
341 uint32_t i_offset;
342 vlc_ml_sorting_criteria_t i_sort;
343 bool b_desc;
346 enum vlc_ml_get_queries
348 VLC_ML_GET_MEDIA, /**< arg1: Media ID; ret: vlc_ml_media_t* */
349 VLC_ML_GET_MEDIA_BY_MRL, /**< arg1: Media MRL; ret: vlc_ml_media_t* */
350 VLC_ML_GET_INPUT_ITEM, /**< arg1: Media ID; ret: input_item_t* */
351 VLC_ML_GET_INPUT_ITEM_BY_MRL,/**< arg1: Media MRL; ret: input_item_t* */
352 VLC_ML_GET_ALBUM, /**< arg1: Album ID; ret: vlc_ml_album_t* */
353 VLC_ML_GET_ARTIST, /**< arg1: Artist ID; ret: vlc_ml_artist_t* */
354 VLC_ML_GET_GENRE, /**< arg1: Genre ID; ret: vlc_ml_genre_t* */
355 VLC_ML_GET_SHOW, /**< arg1: Show ID; ret: vlc_ml_show_t* */
356 VLC_ML_GET_PLAYLIST, /**< arg1: Playlist ID; ret: vlc_ml_playlist_t* */
359 enum vlc_ml_list_queries
361 /* General listing: */
363 VLC_ML_LIST_VIDEOS, /**< arg1 (out): vlc_ml_media_list_t** */
364 VLC_ML_COUNT_VIDEOS, /**< arg1 (out): size_t* */
365 VLC_ML_LIST_AUDIOS, /**< arg1 (out): vlc_ml_media_list_t** */
366 VLC_ML_COUNT_AUDIOS, /**< arg1 (out): size_t* */
367 VLC_ML_LIST_ALBUMS, /**< arg1 (out): vlc_ml_album_list_t** */
368 VLC_ML_COUNT_ALBUMS, /**< arg1 (out): size_t* */
369 VLC_ML_LIST_GENRES, /**< arg1 (out): vlc_ml_genre_list_t** */
370 VLC_ML_COUNT_GENRES, /**< arg1 (out): size_t* */
371 VLC_ML_LIST_ARTISTS, /**< arg1 bool: includeAll; arg2 (out): vlc_ml_genre_list_t** */
372 VLC_ML_COUNT_ARTISTS, /**< arg1 bool: includeAll; arg2 (out): size_t* */
373 VLC_ML_LIST_SHOWS, /**< arg1 (out): vlc_ml_show_list_t** */
374 VLC_ML_COUNT_SHOWS, /**< arg1 (out): size_t* */
375 VLC_ML_LIST_PLAYLISTS, /**< arg1 (out): vlc_ml_playlist_list_t** */
376 VLC_ML_COUNT_PLAYLISTS, /**< arg1 (out): size_t* */
377 VLC_ML_LIST_HISTORY, /**< arg1 (out): vlc_ml_media_list_t** */
378 VLC_ML_LIST_STREAM_HISTORY, /**< arg1 (out): vlc_ml_media_list_t** */
380 /* Album specific listings */
381 VLC_ML_LIST_ALBUM_TRACKS, /**< arg1: The album id. arg2 (out): vlc_ml_media_list_t** */
382 VLC_ML_COUNT_ALBUM_TRACKS, /**< arg1: The album id. arg2 (out): size_t* */
383 VLC_ML_LIST_ALBUM_ARTISTS, /**< arg1: The album id. arg2 (out): vlc_ml_album_list_t** */
384 VLC_ML_COUNT_ALBUM_ARTISTS, /**< arg1: The album id. arg2 (out): size_t* */
386 /* Artist specific listings */
387 VLC_ML_LIST_ARTIST_ALBUMS, /**< arg1: The artist id. arg2(out): vlc_ml_album_list_t** */
388 VLC_ML_COUNT_ARTIST_ALBUMS, /**< arg1: The artist id. arg2(out): size_t* */
389 VLC_ML_LIST_ARTIST_TRACKS, /**< arg1: The artist id. arg2(out): vlc_ml_media_list_t** */
390 VLC_ML_COUNT_ARTIST_TRACKS, /**< arg1: The artist id. arg2(out): size_t* */
392 /* Genre specific listings */
393 VLC_ML_LIST_GENRE_ARTISTS, /**< arg1: genre id; arg2 (out): vlc_ml_artist_list_t** */
394 VLC_ML_COUNT_GENRE_ARTISTS, /**< arg1: genre id; arg2 (out): size_t* */
395 VLC_ML_LIST_GENRE_TRACKS, /**< arg1: genre id; arg2 (out): vlc_ml_media_list_t** */
396 VLC_ML_COUNT_GENRE_TRACKS, /**< arg1: genre id; arg2 (out): size_t* */
397 VLC_ML_LIST_GENRE_ALBUMS, /**< arg1: genre id; arg2 (out): vlc_ml_album_list_t** */
398 VLC_ML_COUNT_GENRE_ALBUMS, /**< arg1: genre id; arg2 (out): size_t* */
400 /* Show specific listings */
401 VLC_ML_LIST_SHOW_EPISODES, /**< arg1: show id; arg2(out): vlc_ml_media_list_t** */
402 VLC_ML_COUNT_SHOW_EPISODES, /**< arg1: show id; arg2(out): size_t* */
404 /* Media specific listings */
405 VLC_ML_LIST_MEDIA_LABELS, /**< arg1: media id; arg2 (out): vlc_ml_label_list_t** */
406 VLC_ML_COUNT_MEDIA_LABELS, /**< arg1: media id; arg2 (out): size_t* */
408 /* Playlist specific listings */
409 VLC_ML_LIST_PLAYLIST_MEDIA, /**< arg1: playlist id; arg2 (out): vlc_ml_media_list_t** */
410 VLC_ML_COUNT_PLAYLIST_MEDIA, /**< arg1: playlist id; arg2 (out): size_t* */
412 /* Children entities listing */
413 VLC_ML_LIST_MEDIA_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_media_list_t** */
414 VLC_ML_COUNT_MEDIA_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
415 VLC_ML_LIST_ARTISTS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_artist_list_t** */
416 VLC_ML_COUNT_ARTISTS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
417 VLC_ML_LIST_ALBUMS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): ml_album_list_t** */
418 VLC_ML_COUNT_ALBUMS_OF, /**< arg1: parent entity type; arg2: parent entity id; arg3(out): size_t* */
421 enum vlc_ml_parent_type
423 VLC_ML_PARENT_UNKNOWN,
424 VLC_ML_PARENT_ALBUM,
425 VLC_ML_PARENT_ARTIST,
426 VLC_ML_PARENT_SHOW,
427 VLC_ML_PARENT_GENRE,
428 VLC_ML_PARENT_PLAYLIST,
431 enum vlc_ml_control
433 /* Adds a folder to discover through the medialibrary */
434 VLC_ML_ADD_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
435 VLC_ML_REMOVE_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
436 VLC_ML_BAN_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
437 VLC_ML_UNBAN_FOLDER, /**< arg1: mrl (const char*) res: can't fail */
438 VLC_ML_LIST_FOLDERS, /**< arg1: entrypoints (vlc_ml_entry_point_list_t**); res: can fail */
439 VLC_ML_IS_INDEXED, /**< arg1: mrl (const char*) arg2 (out): bool*; res: can fail */
441 * Reload a specific folder, or all.
442 * arg1: mrl (const char*), NULL to reload all folders
443 * res: can't fail
445 VLC_ML_RELOAD_FOLDER,
447 /* Pause/resume background operations, such as media discovery & media analysis */
448 VLC_ML_PAUSE_BACKGROUND, /**< no args; can't fail */
449 VLC_ML_RESUME_BACKGROUND, /**< no args; can't fail */
451 /* Misc operations */
452 VLC_ML_CLEAR_HISTORY, /**< no args; can't fail */
454 /* Create media */
455 VLC_ML_NEW_EXTERNAL_MEDIA, /**< arg1: const char*; arg2(out): vlc_ml_media_t** */
456 VLC_ML_NEW_STREAM, /**< arg1: const char*; arg2(out): vlc_ml_media_t** */
458 /* Media management */
459 VLC_ML_MEDIA_INCREASE_PLAY_COUNT, /**< arg1: media id; can fail */
460 VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: char**; */
461 VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, /**< arg1: media id; arg2: vlc_ml_playback_state; arg3: const char*; */
462 VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES, /**< arg1: media id; arg2(out): vlc_ml_playback_states_all* */
463 VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES, /**< arg1: media id; arg2: const vlc_ml_playback_states_all* */
464 VLC_ML_MEDIA_SET_THUMBNAIL, /**< arg1: media id; arg2: const char*; arg3: vlc_ml_thumbnail_size_t */
465 VLC_ML_MEDIA_GENERATE_THUMBNAIL, /**< arg1: media id; arg2: vlc_ml_thumbnail_size_t; arg3: width; arg4: height; arg5: position */
466 VLC_ML_MEDIA_ADD_EXTERNAL_MRL, /**< arg1: media id; arg2: const char*; arg3: type(vlc_ml_file_type_t) */
467 VLC_ML_MEDIA_SET_TYPE, /**< arg1: media id; arg2: vlc_ml_media_type_t */
471 * User playback settings.
472 * All values/units are up to the caller and are not interpreted by the media
473 * library.
474 * All values are stored and returned as strings.
475 * When calling vlc_medialibrary_t::pf_control with vlc_ml_MEDIA_GET_MEDIA_PLAYBACK_STATE,
476 * the value will be returned stored in the provided char**. If the state was
477 * not set yet, NULL will be returned.
478 * When setting a state, NULL can be provided as a value to unset it.
480 enum vlc_ml_playback_state
482 VLC_ML_PLAYBACK_STATE_RATING,
483 VLC_ML_PLAYBACK_STATE_PROGRESS,
484 VLC_ML_PLAYBACK_STATE_SPEED,
485 VLC_ML_PLAYBACK_STATE_TITLE,
486 VLC_ML_PLAYBACK_STATE_CHAPTER,
487 VLC_ML_PLAYBACK_STATE_PROGRAM,
488 VLC_ML_PLAYBACK_STATE_SEEN,
489 VLC_ML_PLAYBACK_STATE_VIDEO_TRACK,
490 VLC_ML_PLAYBACK_STATE_ASPECT_RATIO,
491 VLC_ML_PLAYBACK_STATE_ZOOM,
492 VLC_ML_PLAYBACK_STATE_CROP,
493 VLC_ML_PLAYBACK_STATE_DEINTERLACE,
494 VLC_ML_PLAYBACK_STATE_VIDEO_FILTER,
495 VLC_ML_PLAYBACK_STATE_AUDIO_TRACK,
496 VLC_ML_PLAYBACK_STATE_GAIN,
497 VLC_ML_PLAYBACK_STATE_AUDIO_DELAY,
498 VLC_ML_PLAYBACK_STATE_SUBTITLE_TRACK,
499 VLC_ML_PLAYBACK_STATE_SUBTITLE_DELAY,
500 VLC_ML_PLAYBACK_STATE_APP_SPECIFIC,
503 typedef struct vlc_ml_playback_states_all
505 float progress;
506 float rate;
507 float zoom;
508 int current_title;
509 int current_video_track;
510 int current_audio_track;
511 int current_subtitle_track;
512 char* aspect_ratio;
513 char* crop;
514 char* deinterlace;
515 char* video_filter;
516 } vlc_ml_playback_states_all;
518 enum vlc_ml_event_type
521 * Entity modification callbacks. The affected entity will be passed:
522 * - As a vlc_ml_<type>_t, depending on the type of the modified/inserted
523 * entity, in vlc_ml_event_t::modification::p_<type>
524 * for ADDED and UPDATED variants.
525 * - as an id, in vlc_ml_event_t::deletion::i_entity_id
526 * When _DELETED callbacks get invoked, the entity will already have been
527 * deleted from the database, and cannot be retrieved anymore
529 VLC_ML_EVENT_MEDIA_ADDED,
530 VLC_ML_EVENT_MEDIA_UPDATED,
531 VLC_ML_EVENT_MEDIA_DELETED,
532 VLC_ML_EVENT_ARTIST_ADDED,
533 VLC_ML_EVENT_ARTIST_UPDATED,
534 VLC_ML_EVENT_ARTIST_DELETED,
535 VLC_ML_EVENT_ALBUM_ADDED,
536 VLC_ML_EVENT_ALBUM_UPDATED,
537 VLC_ML_EVENT_ALBUM_DELETED,
538 VLC_ML_EVENT_PLAYLIST_ADDED,
539 VLC_ML_EVENT_PLAYLIST_UPDATED,
540 VLC_ML_EVENT_PLAYLIST_DELETED,
541 VLC_ML_EVENT_GENRE_ADDED,
542 VLC_ML_EVENT_GENRE_UPDATED,
543 VLC_ML_EVENT_GENRE_DELETED,
545 * A discovery started.
546 * For each VLC_ML_EVENT_DISCOVERY_STARTED event, there will be
547 * 1 VLC_ML_EVENT_DISCOVERY_COMPLETED event, and N
548 * VLC_ML_EVENT_DISCOVERY_PROGRESS events.
549 * The entry point being discovered is stored in
550 * vlc_ml_event_t::discovery_started::psz_entry_point.
552 VLC_ML_EVENT_DISCOVERY_STARTED,
554 * Sent when a discovery or reload operation starts analyzing a new folder.
555 * The discovered entry point is stored in
556 * vlc_ml_event_t::discovery_progress::psz_entry_point.
558 VLC_ML_EVENT_DISCOVERY_PROGRESS,
560 * Sent when an entry point discovery is completed.
561 * The entry point that was being discovered is stored in
562 * vlc_ml_event_t::discovery_completed::psz_entry_point.
563 * The success or failure state is stored in
564 * vlc_ml_event_t::discovery_completed::b_success
566 VLC_ML_EVENT_DISCOVERY_COMPLETED,
568 * An entry point reload operation started.
569 * For all the entry points being reloaded, N VLC_EVENT_DISCOVERY_PROGRESS
570 * and 1 VLC_EVENT_RELOAD_COMPLETED event will be sent.
571 * The entry point being reloaded is stored in
572 * vlc_ml_event_t::reload_started::psz_entry_point.
574 VLC_ML_EVENT_RELOAD_STARTED,
576 * Sent when an entry point reload is completed.
577 * The entry point that was being reloaded is stored in
578 * vlc_ml_event_t::reload_completed::psz_entry_point.
579 * The success or failure state is stored in
580 * vlc_ml_event_t::reload_completed::b_success
582 VLC_ML_EVENT_RELOAD_COMPLETED,
584 * Sent when a new entry point gets added to the database.
585 * The entry point that was added is stored in
586 * vlc::ml_event_t::entry_point_added::psz_entry_point, and the success or failure
587 * state is stored in vlc_ml_event_t::entry_point_added::b_success
588 * If successful, this event won't be emited again for this entry point.
589 * In case of failure, this event will be fired again if the same entry point
590 * is queued for discovery again.
592 VLC_ML_EVENT_ENTRY_POINT_ADDED,
594 * Sent when an entry point removal request has been processed.
595 * The removed entry point is stored in
596 * vlc_ml_event_t::entry_point_removed::psz_entry_point and the success or failure
597 * state is stored in vlc_ml_event_t::entry_point_removed::b_success
599 VLC_ML_EVENT_ENTRY_POINT_REMOVED,
601 * Sent when an entry point ban request has been processed.
602 * The banned entry point is stored in
603 * vlc_ml_event_t::entry_point_banned::psz_entry_point and the operation success
604 * state is stored in vlc_ml_event_t::entry_point_banned::b_success
606 VLC_ML_EVENT_ENTRY_POINT_BANNED,
608 * Sent when an entry point unban request has been processed.
609 * The unbanned entry point is stored in
610 * vlc_ml_event_t::entry_point_unbanned::psz_entry_point and the operation success
611 * state is stored in vlc_ml_event_t::entry_point_unbanned::b_success
613 VLC_ML_EVENT_ENTRY_POINT_UNBANNED,
615 * Sent when a discoverer or parser threads changes its idle state.
616 * The idle state is stored in vlc_ml_event_t::background_idle_changed.b_idle.
617 * False means at least one background thread is in running, true means
618 * both discoverer & parser threads are paused.
620 VLC_ML_EVENT_BACKGROUND_IDLE_CHANGED,
622 * Sent when the parsing progress percentage gets updated.
623 * The percentage is stored as a [0;100] integer, in
624 * vlc_ml_event_t::parsing_progress::i_percent
625 * This value might decrease as more media get discovered, but it will only
626 * increase once all discovery operations are completed.
628 VLC_ML_EVENT_PARSING_PROGRESS_UPDATED,
630 * Sent after a media thumbnail was generated, or if it's generation failed.
631 * The media is stored in vlc_ml_event_t::media_thumbnail_generated::p_media
632 * and the success state is stored in
633 * vlc_ml_event_t::media_thumbnail_generated::b_success
635 VLC_ML_EVENT_MEDIA_THUMBNAIL_GENERATED,
637 * Sent after the history gets changed. It can be either cleaned, or simply
638 * modified because a media was recently played/removed from the history.
639 * The history type (media/network) is stored in
640 * vlc_ml_event_t::history_changed::history_type
642 VLC_ML_EVENT_HISTORY_CHANGED,
644 * Sent when an application requested rescan starts being processed.
646 VLC_ML_EVENT_RESCAN_STARTED,
649 typedef struct vlc_ml_event_t
651 int i_type;
652 union
654 struct
656 const char* psz_entry_point;
657 } discovery_started;
658 struct
660 const char* psz_entry_point;
661 } discovery_progress;
662 struct
664 const char* psz_entry_point;
665 bool b_success;
666 } discovery_completed;
667 struct
669 const char* psz_entry_point;
670 } reload_started;
671 struct
673 const char* psz_entry_point;
674 bool b_success;
675 } reload_completed;
676 struct
678 const char* psz_entry_point;
679 bool b_success;
680 } entry_point_added;
681 struct
683 const char* psz_entry_point;
684 bool b_success;
685 } entry_point_removed;
686 struct
688 const char* psz_entry_point;
689 bool b_success;
690 } entry_point_banned;
691 struct
693 const char* psz_entry_point;
694 bool b_success;
695 } entry_point_unbanned;
696 struct
698 uint8_t i_percent;
699 } parsing_progress;
700 union
702 const vlc_ml_media_t* p_media;
703 const vlc_ml_artist_t* p_artist;
704 const vlc_ml_album_t* p_album;
705 const vlc_ml_playlist_t* p_playlist;
706 const vlc_ml_genre_t* p_genre;
707 } creation;
708 struct
710 int64_t i_entity_id;
711 } modification;
712 struct
714 int64_t i_entity_id;
715 } deletion;
716 struct
718 bool b_idle;
719 } background_idle_changed;
720 struct
722 const vlc_ml_media_t* p_media;
723 vlc_ml_thumbnail_size_t i_size;
724 bool b_success;
725 } media_thumbnail_generated;
726 struct
728 vlc_ml_history_type_t history_type;
729 } history_changed;
731 } vlc_ml_event_t;
733 typedef void (*vlc_ml_callback_t)( void* p_data, const vlc_ml_event_t* p_event );
735 typedef struct vlc_medialibrary_callbacks_t
737 void (*pf_send_event)( vlc_medialibrary_module_t* p_ml, const vlc_ml_event_t* p_event );
738 } vlc_medialibrary_callbacks_t;
740 struct vlc_medialibrary_module_t
742 struct vlc_object_t obj;
744 module_t *p_module;
746 void* p_sys;
748 int (*pf_control)( struct vlc_medialibrary_module_t* p_ml, int i_query, va_list args );
750 * List some entities from the medialibrary.
752 * \param p_ml The medialibrary module instance.
753 * \param i_query The type search to be performed. \see vlc_ml_list enumeration
754 * \param p_params A pointer to a vlc_ml_query_params_t structure, or NULL for
755 * the default parameters (alphabetical ascending sort, no pagination)
757 * \return VLC_SUCCESS or an error code
759 * Refer to the individual list of vlc_ml_list requests for the additional
760 * per-query input/ouput parameters values & types
762 int (*pf_list)( struct vlc_medialibrary_module_t* p_ml, int i_query,
763 const vlc_ml_query_params_t* p_params, va_list args );
766 * Get a specific entity by its id or another unique value
768 * \return The required entity, or a NULL pointer if couldn't be found.
770 * Refer to the list of queries for the specific return type
772 void* (*pf_get)( struct vlc_medialibrary_module_t* p_ml, int i_query, va_list args );
774 const vlc_medialibrary_callbacks_t* cbs;
777 vlc_medialibrary_t* libvlc_MlCreate( libvlc_int_t* p_libvlc );
778 void libvlc_MlRelease( vlc_medialibrary_t* p_ml );
780 VLC_API vlc_medialibrary_t* vlc_ml_instance_get( vlc_object_t* p_obj ) VLC_USED;
781 #define vlc_ml_instance_get(x) vlc_ml_instance_get( VLC_OBJECT(x) )
783 VLC_API void* vlc_ml_get( vlc_medialibrary_t* p_ml, int i_query, ... ) VLC_USED;
784 VLC_API int vlc_ml_control( vlc_medialibrary_t* p_ml, int i_query, ... ) VLC_USED;
785 VLC_API int vlc_ml_list( vlc_medialibrary_t* p_ml, int i_query,
786 const vlc_ml_query_params_t* p_params, ... );
789 * \brief Registers a medialibrary callback.
790 * \returns A handle to the callback, to be passed to vlc_ml_event_unregister_callback
792 VLC_API vlc_ml_event_callback_t*
793 vlc_ml_event_register_callback( vlc_medialibrary_t* p_ml, vlc_ml_callback_t cb, void* p_data );
796 * \brief Unregisters a medialibrary callback
797 * \param p_handle The handled returned by vlc_ml_register_callback
799 VLC_API void vlc_ml_event_unregister_callback( vlc_medialibrary_t* p_ml,
800 vlc_ml_event_callback_t* p_callback );
802 * \brief Unregisters a medialibrary callback from the said callback.
803 * \param p_callback The handle returned by vlc_ml_register_callback
805 * This must only be called synchronously from the callback function provided to
806 * vlc_ml_event_register_callback
807 * The p_callback handle must be considered invalid when this function returns
809 VLC_API void vlc_ml_event_unregister_from_callback( vlc_medialibrary_t* p_ml,
810 vlc_ml_event_callback_t* p_callback );
813 VLC_API void vlc_ml_show_release( vlc_ml_show_t* p_show );
814 VLC_API void vlc_ml_artist_release( vlc_ml_artist_t* p_artist );
815 VLC_API void vlc_ml_genre_release( vlc_ml_genre_t* p_genre );
816 VLC_API void vlc_ml_media_release( vlc_ml_media_t* p_media );
817 VLC_API void vlc_ml_album_release( vlc_ml_album_t* p_album );
818 VLC_API void vlc_ml_playlist_release( vlc_ml_playlist_t* p_playlist );
820 VLC_API void vlc_ml_label_list_release( vlc_ml_label_list_t* p_list );
821 VLC_API void vlc_ml_file_list_release( vlc_ml_file_list_t* p_list );
822 VLC_API void vlc_ml_artist_list_release( vlc_ml_artist_list_t* p_list );
823 VLC_API void vlc_ml_media_list_release( vlc_ml_media_list_t* p_list );
824 VLC_API void vlc_ml_album_list_release( vlc_ml_album_list_t* p_list );
825 VLC_API void vlc_ml_show_list_release( vlc_ml_show_list_t* p_list );
826 VLC_API void vlc_ml_genre_list_release( vlc_ml_genre_list_t* p_list );
827 VLC_API void vlc_ml_playlist_list_release( vlc_ml_playlist_list_t* p_list );
828 VLC_API void vlc_ml_entry_point_list_release( vlc_ml_entry_point_list_t* p_list );
829 VLC_API void vlc_ml_playback_states_all_release( vlc_ml_playback_states_all* prefs );
831 static inline vlc_ml_query_params_t vlc_ml_query_params_create()
833 return (vlc_ml_query_params_t) {
834 .psz_pattern = NULL,
835 .i_nbResults = 0,
836 .i_offset = 0,
837 .i_sort = VLC_ML_SORTING_DEFAULT,
838 .b_desc = false
842 static inline int vlc_ml_add_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
844 return vlc_ml_control( p_ml, VLC_ML_ADD_FOLDER, psz_folder );
847 static inline int vlc_ml_remove_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
849 return vlc_ml_control( p_ml, VLC_ML_REMOVE_FOLDER, psz_folder );
852 static inline int vlc_ml_ban_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
854 return vlc_ml_control( p_ml, VLC_ML_BAN_FOLDER, psz_folder );
857 static inline int vlc_ml_unban_folder( vlc_medialibrary_t* p_ml, const char* psz_folder )
859 return vlc_ml_control( p_ml, VLC_ML_UNBAN_FOLDER, psz_folder );
862 static inline int vlc_ml_list_folder( vlc_medialibrary_t* p_ml,
863 vlc_ml_entry_point_list_t** pp_entrypoints )
865 return vlc_ml_control( p_ml, VLC_ML_LIST_FOLDERS, pp_entrypoints );
868 static inline int vlc_ml_is_indexed( vlc_medialibrary_t* p_ml,
869 const char* psz_mrl, bool* p_res )
871 return vlc_ml_control( p_ml, VLC_ML_IS_INDEXED, psz_mrl, p_res );
874 static inline int vlc_ml_reload_folder( vlc_medialibrary_t* p_ml, const char* psz_mrl )
876 return vlc_ml_control( p_ml, VLC_ML_RELOAD_FOLDER, psz_mrl );
879 static inline int vlc_ml_pause_background( vlc_medialibrary_t* p_ml )
881 return vlc_ml_control( p_ml, VLC_ML_PAUSE_BACKGROUND );
884 static inline int vlc_ml_resume_background( vlc_medialibrary_t* p_ml )
886 return vlc_ml_control( p_ml, VLC_ML_RESUME_BACKGROUND );
889 static inline int vlc_ml_clear_history( vlc_medialibrary_t* p_ml )
891 return vlc_ml_control( p_ml, VLC_ML_CLEAR_HISTORY );
894 static inline vlc_ml_media_t* vlc_ml_new_external_media( vlc_medialibrary_t* p_ml, const char* psz_mrl )
896 vlc_ml_media_t* res;
897 if ( vlc_ml_control( p_ml, VLC_ML_NEW_EXTERNAL_MEDIA, psz_mrl, &res ) != VLC_SUCCESS )
898 return NULL;
899 return res;
902 static inline vlc_ml_media_t* vlc_ml_new_stream( vlc_medialibrary_t* p_ml, const char* psz_mrl )
904 vlc_ml_media_t* res;
905 if ( vlc_ml_control( p_ml, VLC_ML_NEW_STREAM, psz_mrl, &res ) != VLC_SUCCESS )
906 return NULL;
907 return res;
910 static inline int vlc_ml_media_increase_playcount( vlc_medialibrary_t* p_ml, int64_t i_media_id )
912 return vlc_ml_control( p_ml, VLC_ML_MEDIA_INCREASE_PLAY_COUNT, i_media_id );
915 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 )
917 return vlc_ml_control( p_ml, VLC_ML_MEDIA_GET_MEDIA_PLAYBACK_STATE, i_media_id, i_state, ppsz_result );
920 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 )
922 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_MEDIA_PLAYBACK_STATE, i_media_id, i_state, psz_value );
925 static inline int vlc_ml_media_get_all_playback_pref( vlc_medialibrary_t* p_ml,
926 int64_t i_media_id,
927 vlc_ml_playback_states_all* prefs )
929 return vlc_ml_control( p_ml,VLC_ML_MEDIA_GET_ALL_MEDIA_PLAYBACK_STATES, i_media_id, prefs );
932 static inline int vlc_ml_media_set_all_playback_states( vlc_medialibrary_t* p_ml,
933 int64_t i_media_id,
934 const vlc_ml_playback_states_all* prefs )
936 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_ALL_MEDIA_PLAYBACK_STATES, i_media_id, prefs );
939 static inline int vlc_ml_media_set_thumbnail( vlc_medialibrary_t* p_ml, int64_t i_media_id,
940 const char* psz_mrl, vlc_ml_thumbnail_size_t sizeType )
942 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_THUMBNAIL, i_media_id, psz_mrl, sizeType );
945 static inline int vlc_ml_media_generate_thumbnail( vlc_medialibrary_t* p_ml, int64_t i_media_id,
946 vlc_ml_thumbnail_size_t size_type,
947 uint32_t i_desired_width,
948 uint32_t i_desired_height,
949 float position )
951 return vlc_ml_control( p_ml, VLC_ML_MEDIA_GENERATE_THUMBNAIL, i_media_id,
952 size_type, i_desired_width, i_desired_height, position );
955 static inline int vlc_ml_media_add_external_mrl( vlc_medialibrary_t* p_ml, int64_t i_media_id,
956 const char* psz_mrl, int i_type )
958 return vlc_ml_control( p_ml, VLC_ML_MEDIA_ADD_EXTERNAL_MRL, i_media_id, psz_mrl, i_type );
961 static inline int vlc_ml_media_set_type( vlc_medialibrary_t* p_ml, int64_t i_media_id,
962 vlc_ml_media_type_t i_type )
964 return vlc_ml_control( p_ml, VLC_ML_MEDIA_SET_TYPE, i_media_id, (int)i_type );
967 static inline vlc_ml_media_t* vlc_ml_get_media( vlc_medialibrary_t* p_ml, int64_t i_media_id )
969 return (vlc_ml_media_t*)vlc_ml_get( p_ml, VLC_ML_GET_MEDIA, i_media_id );
972 static inline vlc_ml_media_t* vlc_ml_get_media_by_mrl( vlc_medialibrary_t* p_ml,
973 const char* psz_mrl )
975 return (vlc_ml_media_t*)vlc_ml_get( p_ml, VLC_ML_GET_MEDIA_BY_MRL, psz_mrl );
978 static inline input_item_t* vlc_ml_get_input_item( vlc_medialibrary_t* p_ml, int64_t i_media_id )
980 return (input_item_t*)vlc_ml_get( p_ml, VLC_ML_GET_INPUT_ITEM, i_media_id );
983 static inline input_item_t* vlc_ml_get_input_item_by_mrl( vlc_medialibrary_t* p_ml,
984 const char* psz_mrl )
986 return (input_item_t*)vlc_ml_get( p_ml, VLC_ML_GET_INPUT_ITEM_BY_MRL, psz_mrl );
989 static inline vlc_ml_album_t* vlc_ml_get_album( vlc_medialibrary_t* p_ml, int64_t i_album_id )
991 return (vlc_ml_album_t*)vlc_ml_get( p_ml, VLC_ML_GET_ALBUM, i_album_id );
994 static inline vlc_ml_artist_t* vlc_ml_get_artist( vlc_medialibrary_t* p_ml, int64_t i_artist_id )
996 return (vlc_ml_artist_t*)vlc_ml_get( p_ml, VLC_ML_GET_ARTIST, i_artist_id );
999 static inline vlc_ml_genre_t* vlc_ml_get_genre( vlc_medialibrary_t* p_ml, int64_t i_genre_id )
1001 return (vlc_ml_genre_t*)vlc_ml_get( p_ml, VLC_ML_GET_GENRE, i_genre_id );
1004 static inline vlc_ml_show_t* vlc_ml_get_show( vlc_medialibrary_t* p_ml, int64_t i_show_id )
1006 return (vlc_ml_show_t*)vlc_ml_get( p_ml, VLC_ML_GET_SHOW, i_show_id );
1009 static inline vlc_ml_playlist_t* vlc_ml_get_playlist( vlc_medialibrary_t* p_ml, int64_t i_playlist_id )
1011 return (vlc_ml_playlist_t*)vlc_ml_get( p_ml, VLC_ML_GET_PLAYLIST, i_playlist_id );
1014 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 )
1016 vlc_assert( p_ml != NULL );
1017 vlc_ml_media_list_t* res;
1018 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1019 return NULL;
1020 return res;
1023 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 )
1025 vlc_assert( p_ml != NULL );
1026 size_t res;
1027 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_MEDIA_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1028 return 0;
1029 return res;
1032 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 )
1034 vlc_assert( p_ml != NULL );
1035 vlc_ml_artist_list_t* res;
1036 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTISTS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1037 return NULL;
1038 return res;
1041 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 )
1043 vlc_assert( p_ml != NULL );
1044 size_t res;
1045 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTISTS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1046 return 0;
1047 return res;
1050 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 )
1052 vlc_assert( p_ml != NULL );
1053 vlc_ml_album_list_t* res;
1054 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUMS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1055 return NULL;
1056 return res;
1059 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 )
1061 vlc_assert( p_ml != NULL );
1062 size_t res;
1063 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUMS_OF, params, i_parent_type, i_parent_id, &res ) != VLC_SUCCESS )
1064 return 0;
1065 return res;
1068 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 )
1070 vlc_assert( p_ml != NULL );
1071 vlc_ml_media_list_t* res;
1072 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUM_TRACKS, params, i_album_id, &res ) != VLC_SUCCESS )
1073 return NULL;
1074 return res;
1077 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 )
1079 vlc_assert( p_ml != NULL );
1080 size_t count;
1081 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUM_TRACKS, params, i_album_id, &count ) != VLC_SUCCESS )
1082 return 0;
1083 return count;
1086 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 )
1088 vlc_assert( p_ml != NULL );
1089 vlc_ml_media_list_t* res;
1090 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUM_ARTISTS, params, i_album_id, &res ) != VLC_SUCCESS )
1091 return NULL;
1092 return res;
1095 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 )
1097 vlc_assert( p_ml != NULL );
1098 size_t count;
1099 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUM_ARTISTS, params, i_album_id, &count ) != VLC_SUCCESS )
1100 return 0;
1101 return count;
1104 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 )
1106 vlc_assert( p_ml != NULL );
1107 vlc_ml_album_list_t* res;
1108 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTIST_ALBUMS, params, i_artist_id, &res ) != VLC_SUCCESS )
1109 return NULL;
1110 return res;
1113 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 )
1115 vlc_assert( p_ml != NULL );
1116 size_t count;
1117 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTIST_ALBUMS, params, i_artist_id, &count ) != VLC_SUCCESS )
1118 return 0;
1119 return count;
1122 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 )
1124 vlc_assert( p_ml != NULL );
1125 vlc_ml_media_list_t* res;
1126 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTIST_TRACKS, params, i_artist_id, &res ) != VLC_SUCCESS )
1127 return NULL;
1128 return res;
1131 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 )
1133 vlc_assert( p_ml != NULL );
1134 size_t count;
1135 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTIST_TRACKS, params, i_artist_id, &count ) != VLC_SUCCESS )
1136 return 0;
1137 return count;
1140 static inline vlc_ml_media_list_t* vlc_ml_list_video_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1142 vlc_assert( p_ml != NULL );
1143 vlc_ml_media_list_t* res;
1144 if ( vlc_ml_list( p_ml, VLC_ML_LIST_VIDEOS, params, &res ) != VLC_SUCCESS )
1145 return NULL;
1146 return res;
1149 static inline size_t vlc_ml_count_video_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1151 vlc_assert( p_ml != NULL );
1152 size_t count;
1153 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_VIDEOS, params, &count ) != VLC_SUCCESS )
1154 return 0;
1155 return count;
1158 static inline vlc_ml_media_list_t* vlc_ml_list_audio_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1160 vlc_assert( p_ml != NULL );
1161 vlc_ml_media_list_t* res;
1162 if ( vlc_ml_list( p_ml, VLC_ML_LIST_AUDIOS, params, &res ) != VLC_SUCCESS )
1163 return NULL;
1164 return res;
1167 static inline size_t vlc_ml_count_audio_media( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1169 vlc_assert( p_ml != NULL );
1170 size_t count;
1171 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_AUDIOS, params, &count ) != VLC_SUCCESS )
1172 return 0;
1173 return count;
1176 static inline vlc_ml_album_list_t* vlc_ml_list_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1178 vlc_assert( p_ml != NULL );
1179 vlc_ml_album_list_t* res;
1180 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ALBUMS, params, &res ) != VLC_SUCCESS )
1181 return NULL;
1182 return res;
1185 static inline size_t vlc_ml_count_albums( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1187 vlc_assert( p_ml != NULL );
1188 size_t count;
1189 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ALBUMS, params, &count ) != VLC_SUCCESS )
1190 return 0;
1191 return count;
1194 static inline vlc_ml_genre_list_t* vlc_ml_list_genres( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1196 vlc_assert( p_ml != NULL );
1197 vlc_ml_genre_list_t* res;
1198 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRES, params, &res ) != VLC_SUCCESS )
1199 return NULL;
1200 return res;
1203 static inline size_t vlc_ml_count_genres( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1205 vlc_assert( p_ml != NULL );
1206 size_t count;
1207 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRES, params, &count ) != VLC_SUCCESS )
1208 return 0;
1209 return count;
1213 * @brief vlc_ml_list_artists
1214 * @param params Query parameters, or NULL for the default
1215 * @param b_include_all True if you wish to fetch artists without at least one album.
1216 * @return
1218 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 )
1220 vlc_assert( p_ml != NULL );
1221 vlc_ml_artist_list_t* res;
1222 if ( vlc_ml_list( p_ml, VLC_ML_LIST_ARTISTS, params, (int)b_include_all, &res ) != VLC_SUCCESS )
1223 return NULL;
1224 return res;
1227 static inline size_t vlc_ml_count_artists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params, bool includeAll )
1229 vlc_assert( p_ml != NULL );
1230 size_t count;
1231 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_ARTISTS, params, includeAll, &count ) != VLC_SUCCESS )
1232 return 0;
1233 return count;
1236 static inline vlc_ml_show_list_t* vlc_ml_list_shows( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1238 vlc_assert( p_ml != NULL );
1239 vlc_ml_show_list_t* res;
1240 if ( vlc_ml_list( p_ml, VLC_ML_LIST_SHOWS, params, &res ) != VLC_SUCCESS )
1241 return NULL;
1242 return res;
1245 static inline size_t vlc_ml_count_shows( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1247 vlc_assert( p_ml != NULL );
1248 size_t count;
1249 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_SHOWS, params, &count ) != VLC_SUCCESS )
1250 return 0;
1251 return count;
1254 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 )
1256 vlc_assert( p_ml != NULL );
1257 vlc_ml_media_list_t* res;
1258 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_ARTISTS, params, i_genre_id, &res ) != VLC_SUCCESS )
1259 return NULL;
1260 return res;
1263 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 )
1265 vlc_assert( p_ml != NULL );
1266 size_t count;
1267 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ARTISTS, params, i_genre_id, &count ) != VLC_SUCCESS )
1268 return 0;
1269 return count;
1272 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 )
1274 vlc_assert( p_ml != NULL );
1275 vlc_ml_media_list_t* res;
1276 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_TRACKS, params, i_genre_id, &res ) != VLC_SUCCESS )
1277 return NULL;
1278 return res;
1281 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 )
1283 vlc_assert( p_ml != NULL );
1284 size_t count;
1285 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_TRACKS, params, i_genre_id, &count ) != VLC_SUCCESS )
1286 return 0;
1287 return count;
1290 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 )
1292 vlc_assert( p_ml != NULL );
1293 vlc_ml_album_list_t* res;
1294 if ( vlc_ml_list( p_ml, VLC_ML_LIST_GENRE_ALBUMS, params, i_genre_id, &res ) != VLC_SUCCESS )
1295 return NULL;
1296 return res;
1299 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 )
1301 vlc_assert( p_ml != NULL );
1302 size_t count;
1303 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ALBUMS, params, i_genre_id, &count ) != VLC_SUCCESS )
1304 return 0;
1305 return count;
1308 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 )
1310 vlc_assert( p_ml != NULL );
1311 vlc_ml_media_list_t* res;
1312 if ( vlc_ml_list( p_ml, VLC_ML_LIST_SHOW_EPISODES, params, i_show_id, &res ) != VLC_SUCCESS )
1313 return NULL;
1314 return res;
1317 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 )
1319 vlc_assert( p_ml != NULL );
1320 size_t count;
1321 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_GENRE_ALBUMS, params, i_show_id, &count ) != VLC_SUCCESS )
1322 return 0;
1323 return count;
1326 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 )
1328 vlc_assert( p_ml != NULL );
1329 vlc_ml_label_list_t* res;
1330 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_LABELS, params, i_media_id, &res ) != VLC_SUCCESS )
1331 return NULL;
1332 return res;
1335 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 )
1337 vlc_assert( p_ml != NULL );
1338 size_t count;
1339 if ( vlc_ml_list( p_ml, VLC_ML_LIST_MEDIA_LABELS, params, i_media_id, &count ) != VLC_SUCCESS )
1340 return 0;
1341 return count;
1344 static inline vlc_ml_media_list_t* vlc_ml_list_history( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1346 vlc_assert( p_ml != NULL );
1347 vlc_ml_media_list_t* res;
1348 if ( vlc_ml_list( p_ml, VLC_ML_LIST_HISTORY, params, &res ) != VLC_SUCCESS )
1349 return NULL;
1350 return res;
1353 static inline vlc_ml_media_list_t* vlc_ml_list_stream_history( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1355 vlc_assert( p_ml != NULL );
1356 vlc_ml_media_list_t* res;
1357 if ( vlc_ml_list( p_ml, VLC_ML_LIST_STREAM_HISTORY, params, &res ) != VLC_SUCCESS )
1358 return NULL;
1359 return res;
1362 static inline vlc_ml_playlist_list_t* vlc_ml_list_playlists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1364 vlc_assert( p_ml != NULL );
1365 vlc_ml_playlist_list_t* res;
1366 if ( vlc_ml_list( p_ml, VLC_ML_LIST_PLAYLISTS, params, &res ) != VLC_SUCCESS )
1367 return NULL;
1368 return res;
1371 static inline size_t vlc_ml_count_playlists( vlc_medialibrary_t* p_ml, const vlc_ml_query_params_t* params )
1373 vlc_assert( p_ml != NULL );
1374 size_t count;
1375 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_PLAYLISTS, params, &count ) != VLC_SUCCESS )
1376 return 0;
1377 return count;
1380 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 )
1382 vlc_assert( p_ml != NULL );
1383 vlc_ml_media_list_t* res;
1384 if ( vlc_ml_list( p_ml, VLC_ML_LIST_PLAYLIST_MEDIA, params, i_playlist_id, &res ) != VLC_SUCCESS )
1385 return NULL;
1386 return res;
1389 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 )
1391 vlc_assert( p_ml != NULL );
1392 size_t count;
1393 if ( vlc_ml_list( p_ml, VLC_ML_COUNT_PLAYLIST_MEDIA, params, i_playlist_id, &count ) != VLC_SUCCESS )
1394 return 0;
1395 return count;
1398 #ifdef __cplusplus
1400 #endif /* C++ */
1402 #ifndef __cplusplus
1403 # define vlc_ml_release( OBJ ) _Generic( ( OBJ ), \
1404 vlc_ml_show_t*: vlc_ml_show_release, \
1405 vlc_ml_artist_t*: vlc_ml_artist_release, \
1406 vlc_ml_album_t*: vlc_ml_album_release, \
1407 vlc_ml_genre_t*: vlc_ml_genre_release, \
1408 vlc_ml_media_t*: vlc_ml_media_release, \
1409 vlc_ml_playlist_t*: vlc_ml_playlist_release, \
1410 vlc_ml_label_list_t*: vlc_ml_label_list_release, \
1411 vlc_ml_file_list_t*: vlc_ml_file_list_release, \
1412 vlc_ml_artist_list_t*: vlc_ml_artist_list_release, \
1413 vlc_ml_media_list_t*: vlc_ml_media_list_release, \
1414 vlc_ml_album_list_t*: vlc_ml_album_list_release, \
1415 vlc_ml_show_list_t*: vlc_ml_show_list_release, \
1416 vlc_ml_genre_list_t*: vlc_ml_genre_list_release, \
1417 vlc_ml_playlist_list_t*: vlc_ml_playlist_list_release, \
1418 vlc_ml_entry_point_list_t*: vlc_ml_entry_point_list_release, \
1419 vlc_ml_playback_states_all*: vlc_ml_playback_states_all_release \
1420 )( OBJ )
1421 #else
1422 static inline void vlc_ml_release( vlc_ml_show_t* show ) { vlc_ml_show_release( show ); }
1423 static inline void vlc_ml_release( vlc_ml_artist_t* artist ) { vlc_ml_artist_release( artist ); }
1424 static inline void vlc_ml_release( vlc_ml_album_t* album ) { vlc_ml_album_release( album ); }
1425 static inline void vlc_ml_release( vlc_ml_genre_t* genre ) { vlc_ml_genre_release( genre ); }
1426 static inline void vlc_ml_release( vlc_ml_media_t* media ) { vlc_ml_media_release( media ); }
1427 static inline void vlc_ml_release( vlc_ml_playlist_t* playlist ) { vlc_ml_playlist_release( playlist ); }
1428 static inline void vlc_ml_release( vlc_ml_label_list_t* list ) { vlc_ml_label_list_release( list ); }
1429 static inline void vlc_ml_release( vlc_ml_file_list_t* list ) { vlc_ml_file_list_release( list ); }
1430 static inline void vlc_ml_release( vlc_ml_artist_list_t* list ) { vlc_ml_artist_list_release( list ); }
1431 static inline void vlc_ml_release( vlc_ml_media_list_t* list ) { vlc_ml_media_list_release( list ); }
1432 static inline void vlc_ml_release( vlc_ml_album_list_t* list ) { vlc_ml_album_list_release( list ); }
1433 static inline void vlc_ml_release( vlc_ml_show_list_t* list ) { vlc_ml_show_list_release( list ); }
1434 static inline void vlc_ml_release( vlc_ml_genre_list_t* list ) { vlc_ml_genre_list_release( list ); }
1435 static inline void vlc_ml_release( vlc_ml_playlist_list_t* list ) { vlc_ml_playlist_list_release( list ); }
1436 static inline void vlc_ml_release( vlc_ml_entry_point_list_t* list ) { vlc_ml_entry_point_list_release( list ); }
1437 static inline void vlc_ml_release( vlc_ml_playback_states_all* prefs ) { vlc_ml_playback_states_all_release( prefs ); }
1438 #endif
1440 #endif /* VLC_MEDIA_LIBRARY_H */