libvalhalla 2.0.0
|
00001 /* 00002 * GeeXboX Valhalla: tiny media scanner API. 00003 * Copyright (C) 2009-2010 Mathieu Schroeter <mathieu.schroeter@gamesover.ch> 00004 * 00005 * This file is part of libvalhalla. 00006 * 00007 * libvalhalla is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU Lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * libvalhalla is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * Lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU Lesser General Public 00018 * License along with libvalhalla; if not, write to the Free Software 00019 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 00020 */ 00021 00022 #ifndef VALHALLA_H 00023 #define VALHALLA_H 00024 00031 #ifdef __cplusplus 00032 extern "C" { 00033 #endif /* __cplusplus */ 00034 00035 #define VH_STRINGIFY(s) #s 00036 #define VH_TOSTRING(s) VH_STRINGIFY(s) 00037 00038 #define VH_VERSION_INT(a, b, c) (a << 16 | b << 8 | c) 00039 #define VH_VERSION_DOT(a, b, c) a ##.## b ##.## c 00040 #define VH_VERSION(a, b, c) VH_VERSION_DOT(a, b, c) 00041 00042 #define LIBVALHALLA_VERSION_MAJOR 2 00043 #define LIBVALHALLA_VERSION_MINOR 0 00044 #define LIBVALHALLA_VERSION_MICRO 0 00045 00046 #define LIBVALHALLA_DB_VERSION 2 00047 00048 #define LIBVALHALLA_VERSION_INT VH_VERSION_INT(LIBVALHALLA_VERSION_MAJOR, \ 00049 LIBVALHALLA_VERSION_MINOR, \ 00050 LIBVALHALLA_VERSION_MICRO) 00051 #define LIBVALHALLA_VERSION VH_VERSION(LIBVALHALLA_VERSION_MAJOR, \ 00052 LIBVALHALLA_VERSION_MINOR, \ 00053 LIBVALHALLA_VERSION_MICRO) 00054 #define LIBVALHALLA_VERSION_STR VH_TOSTRING(LIBVALHALLA_VERSION) 00055 #define LIBVALHALLA_BUILD LIBVALHALLA_VERSION_INT 00056 00057 #include <inttypes.h> 00058 #include <stdarg.h> 00059 00063 unsigned int libvalhalla_version (void); 00064 00066 typedef enum valhalla_lang { 00067 VALHALLA_LANG_ALL = -1, 00068 VALHALLA_LANG_UNDEF = 0, 00069 VALHALLA_LANG_DE, 00070 VALHALLA_LANG_EN, 00071 VALHALLA_LANG_ES, 00072 VALHALLA_LANG_FR, 00073 VALHALLA_LANG_IT, 00074 } valhalla_lang_t; 00075 00076 typedef enum valhalla_file_type { 00077 VALHALLA_FILE_TYPE_NULL = 0, 00078 VALHALLA_FILE_TYPE_AUDIO, 00079 VALHALLA_FILE_TYPE_IMAGE, 00080 VALHALLA_FILE_TYPE_PLAYLIST, 00081 VALHALLA_FILE_TYPE_VIDEO, 00082 } valhalla_file_type_t; 00083 00085 typedef enum valhalla_meta_grp { 00089 VALHALLA_META_GRP_NIL = 0, 00090 00095 VALHALLA_META_GRP_CLASSIFICATION, 00096 00101 VALHALLA_META_GRP_COMMERCIAL, 00102 00106 VALHALLA_META_GRP_CONTACT, 00107 00114 VALHALLA_META_GRP_ENTITIES, 00115 00119 VALHALLA_META_GRP_IDENTIFIER, 00120 00124 VALHALLA_META_GRP_LEGAL, 00125 00129 VALHALLA_META_GRP_MISCELLANEOUS, 00130 00134 VALHALLA_META_GRP_MUSICAL, 00135 00140 VALHALLA_META_GRP_ORGANIZATIONAL, 00141 00145 VALHALLA_META_GRP_PERSONAL, 00146 00150 VALHALLA_META_GRP_SPACIAL, 00151 00155 VALHALLA_META_GRP_TECHNICAL, 00156 00161 VALHALLA_META_GRP_TEMPORAL, 00162 00166 VALHALLA_META_GRP_TITLES, 00167 00168 } valhalla_meta_grp_t; 00169 00175 /* Classification */ 00176 #define VALHALLA_METADATA_CATEGORY "category" 00177 #define VALHALLA_METADATA_EPISODE "episode" 00178 #define VALHALLA_METADATA_GENRE "genre" 00179 #define VALHALLA_METADATA_MPAA "mpaa" 00180 #define VALHALLA_METADATA_RUNTIME "runtime" 00181 #define VALHALLA_METADATA_SEASON "season" 00182 #define VALHALLA_METADATA_SYNOPSIS "synopsis" 00183 #define VALHALLA_METADATA_SYNOPSIS_SHOW "synopsis_show" 00184 00185 /* Commercial */ 00186 #define VALHALLA_METADATA_BUDGET "budget" 00187 #define VALHALLA_METADATA_COUNTRY "country" 00188 #define VALHALLA_METADATA_REVENUE "revenue" 00189 #define VALHALLA_METADATA_STUDIO "studio" 00190 00191 /* Entities */ 00192 #define VALHALLA_METADATA_ACTOR "actor" 00193 #define VALHALLA_METADATA_ARTIST "artist" 00194 #define VALHALLA_METADATA_AUTHOR "author" 00195 #define VALHALLA_METADATA_CASTING "casting" 00196 #define VALHALLA_METADATA_COMPOSER "composer" 00197 #define VALHALLA_METADATA_CREDITS "credits" 00198 #define VALHALLA_METADATA_DIRECTOR "director" 00199 #define VALHALLA_METADATA_DIRECTOR_PHOTO "director_photo" 00200 #define VALHALLA_METADATA_EDITOR "editor" 00201 #define VALHALLA_METADATA_PRODUCER "producer" 00202 #define VALHALLA_METADATA_WRITER "writer" 00203 00204 /* Miscellaneous */ 00205 #define VALHALLA_METADATA_COVER "cover" 00206 #define VALHALLA_METADATA_COVER_SEASON "cover_season" 00207 #define VALHALLA_METADATA_COVER_SHOW "cover_show" 00208 #define VALHALLA_METADATA_COVER_SHOW_HEADER "cover_show_header" 00209 #define VALHALLA_METADATA_FAN_ART "fanart" 00210 #define VALHALLA_METADATA_LYRICS "lyrics" 00211 #define VALHALLA_METADATA_THUMBNAIL "thumbnail" 00212 00213 /* Organizational */ 00214 #define VALHALLA_METADATA_TRACK "track" 00215 00216 /* Personal */ 00217 #define VALHALLA_METADATA_PLAY_COUNT "playcount" 00218 #define VALHALLA_METADATA_RATING "rating" 00219 #define VALHALLA_METADATA_WATCHED "watched" 00220 00221 /* Technical */ 00222 #define VALHALLA_METADATA_AUDIO_BITRATE "audio_bitrate" 00223 #define VALHALLA_METADATA_AUDIO_CHANNELS "audio_channels" 00224 #define VALHALLA_METADATA_AUDIO_CODEC "audio_codec" 00225 #define VALHALLA_METADATA_AUDIO_LANG "audio_lang" 00226 #define VALHALLA_METADATA_AUDIO_STREAMS "audio_streams" 00227 #define VALHALLA_METADATA_DURATION "duration" 00228 #define VALHALLA_METADATA_FILESIZE "filesize" 00229 #define VALHALLA_METADATA_HEIGHT "height" 00230 #define VALHALLA_METADATA_PICTURE_ORIENTATION "picture_orientation" 00231 #define VALHALLA_METADATA_SUB_LANG "sub_lang" 00232 #define VALHALLA_METADATA_SUB_STREAMS "sub_streams" 00233 #define VALHALLA_METADATA_VIDEO_ASPECT "video_aspect" 00234 #define VALHALLA_METADATA_VIDEO_BITRATE "video_bitrate" 00235 #define VALHALLA_METADATA_VIDEO_CODEC "video_codec" 00236 #define VALHALLA_METADATA_VIDEO_STREAMS "video_streams" 00237 #define VALHALLA_METADATA_WIDTH "width" 00238 00239 /* Temporal */ 00240 #define VALHALLA_METADATA_DATE "date" 00241 #define VALHALLA_METADATA_PREMIERED "premiered" 00242 #define VALHALLA_METADATA_YEAR "year" 00243 00244 /* Titles */ 00245 #define VALHALLA_METADATA_ALBUM "album" 00246 #define VALHALLA_METADATA_TITLE "title" 00247 #define VALHALLA_METADATA_TITLE_ALTERNATIVE "title_alternative" 00248 #define VALHALLA_METADATA_TITLE_SHOW "title_show" 00249 00254 /******************************************************************************/ 00255 /* */ 00256 /* Valhalla Handling */ 00257 /* */ 00258 /******************************************************************************/ 00259 00261 typedef struct valhalla_s valhalla_t; 00262 00264 enum valhalla_errno { 00265 VALHALLA_ERROR_DEAD = -4, 00266 VALHALLA_ERROR_PATH = -3, 00267 VALHALLA_ERROR_HANDLER = -2, 00268 VALHALLA_ERROR_THREAD = -1, 00269 VALHALLA_SUCCESS = 0, 00270 }; 00271 00273 typedef enum valhalla_verb { 00274 VALHALLA_MSG_NONE, 00275 VALHALLA_MSG_VERBOSE, 00276 VALHALLA_MSG_INFO, 00277 VALHALLA_MSG_WARNING, 00278 VALHALLA_MSG_ERROR, 00279 VALHALLA_MSG_CRITICAL, 00280 } valhalla_verb_t; 00281 00283 typedef enum valhalla_dl { 00284 VALHALLA_DL_DEFAULT = 0, 00285 VALHALLA_DL_COVER, 00286 VALHALLA_DL_THUMBNAIL, 00287 VALHALLA_DL_FAN_ART, 00288 VALHALLA_DL_LAST 00289 } valhalla_dl_t; 00290 00292 typedef enum valhalla_event_od { 00293 VALHALLA_EVENTOD_PARSED = 0, 00294 VALHALLA_EVENTOD_GRABBED, 00295 VALHALLA_EVENTOD_ENDED, 00296 } valhalla_event_od_t; 00297 00299 typedef enum valhalla_event_gl { 00300 VALHALLA_EVENTGL_SCANNER_BEGIN = 0, 00301 VALHALLA_EVENTGL_SCANNER_END, 00302 VALHALLA_EVENTGL_SCANNER_SLEEP, 00303 VALHALLA_EVENTGL_SCANNER_ACKS, 00304 VALHALLA_EVENTGL_SCANNER_EXIT, 00305 } valhalla_event_gl_t; 00306 00308 typedef enum valhalla_event_md { 00309 VALHALLA_EVENTMD_PARSER = 0, 00310 VALHALLA_EVENTMD_GRABBER, 00311 } valhalla_event_md_t; 00312 00314 typedef enum valhalla_stats_type { 00315 VALHALLA_STATS_TIMER = 0, 00316 VALHALLA_STATS_COUNTER, 00317 } valhalla_stats_type_t; 00318 00324 typedef enum valhalla_metadata_pl { 00325 VALHALLA_METADATA_PL_HIGHEST = -128, 00326 VALHALLA_METADATA_PL_HIGHER = -96, 00327 VALHALLA_METADATA_PL_HIGH = -64, 00328 VALHALLA_METADATA_PL_ABOVE = -32, 00329 VALHALLA_METADATA_PL_NORMAL = 0, 00330 VALHALLA_METADATA_PL_BELOW = 32, 00331 VALHALLA_METADATA_PL_LOW = 64, 00332 VALHALLA_METADATA_PL_LOWER = 96, 00333 VALHALLA_METADATA_PL_LOWEST = 128, 00334 } valhalla_metadata_pl_t; 00335 00337 typedef struct valhalla_metadata_s { 00338 const char *name; 00339 const char *value; 00340 valhalla_meta_grp_t group; 00341 valhalla_lang_t lang; 00342 } valhalla_metadata_t; 00343 00345 typedef struct valhalla_file_s { 00346 const char *path; 00347 int64_t mtime; 00348 int64_t size; 00349 valhalla_file_type_t type; 00350 } valhalla_file_t; 00351 00352 #define VH_CFG_RANGE 8 00354 #define VH_VOID_T (0 << VH_CFG_RANGE) 00355 #define VH_VOIDP_T (1 << VH_CFG_RANGE) 00356 #define VH_INT_T (2 << VH_CFG_RANGE) 00357 #define VH_VOIDP_2_T (4 << VH_CFG_RANGE) 00360 #define VH_CFG_INIT(name, type, num) VALHALLA_CFG_##name = ((type) + (num)) 00361 00382 typedef enum valhalla_cfg { 00393 VH_CFG_INIT (DOWNLOADER_DEST, VH_VOIDP_T | VH_INT_T, 2), 00394 00413 VH_CFG_INIT (GRABBER_PRIORITY, VH_VOIDP_T | VH_INT_T | VH_VOIDP_2_T, 0), 00414 00424 VH_CFG_INIT (GRABBER_STATE, VH_VOIDP_T | VH_INT_T, 0), 00425 00465 VH_CFG_INIT (PARSER_KEYWORD, VH_VOIDP_T, 0), 00466 00476 VH_CFG_INIT (SCANNER_PATH, VH_VOIDP_T | VH_INT_T, 1), 00477 00489 VH_CFG_INIT (SCANNER_SUFFIX, VH_VOIDP_T, 1), 00490 00491 } valhalla_cfg_t; 00492 00494 typedef struct valhalla_init_param_s { 00499 unsigned int parser_nb; 00509 unsigned int grabber_nb; 00515 unsigned int commit_int; 00523 unsigned int decrapifier : 1; 00524 00536 void (*od_cb) (const char *file, valhalla_event_od_t e, 00537 const char *id, void *data); 00539 void *od_data; 00540 00545 void (*gl_cb) (valhalla_event_gl_t e, void *data); 00547 void *gl_data; 00548 00559 void (*md_cb) (valhalla_event_md_t e, const char *id, 00560 const valhalla_file_t *file, 00561 const valhalla_metadata_t *md, void *data); 00563 void *md_data; 00564 00565 } valhalla_init_param_t; 00566 00573 /* This function must not be used directly; refer to valhalla_config_set(). */ 00574 int valhalla_config_set_orig (valhalla_t *handle, valhalla_cfg_t conf, ...); 00599 #define valhalla_config_set(handle, conf, arg...) \ 00600 valhalla_config_set_orig (handle, VALHALLA_CFG_##conf, ##arg, ~0) 00601 00619 valhalla_t *valhalla_init (const char *db, valhalla_init_param_t *param); 00620 00629 void valhalla_uninit (valhalla_t *handle); 00630 00639 void valhalla_verbosity (valhalla_verb_t level); 00640 00650 const char *valhalla_metadata_group_str (valhalla_meta_grp_t group); 00651 00664 const char *valhalla_grabber_next (valhalla_t *handle, const char *id); 00665 00686 valhalla_metadata_pl_t valhalla_grabber_priority_read (valhalla_t *handle, 00687 const char *id, 00688 const char **meta); 00689 00701 const char *valhalla_stats_group_next (valhalla_t *handle, const char *id); 00702 00717 uint64_t valhalla_stats_read_next (valhalla_t *handle, const char *id, 00718 valhalla_stats_type_t type, 00719 const char **item); 00720 00740 int valhalla_run (valhalla_t *handle, 00741 int loop, uint16_t timeout, uint16_t delay, int priority); 00742 00758 void valhalla_wait (valhalla_t *handle); 00759 00771 void valhalla_scanner_wakeup (valhalla_t *handle); 00772 00784 void valhalla_ondemand (valhalla_t *handle, const char *file); 00785 00790 /******************************************************************************/ 00791 /* */ 00792 /* Database Selections */ 00793 /* */ 00794 /******************************************************************************/ 00795 00797 typedef struct valhalla_db_stmt_s valhalla_db_stmt_t; 00798 00800 typedef enum valhalla_db_type { 00801 VALHALLA_DB_TYPE_ID, 00802 VALHALLA_DB_TYPE_TEXT, 00803 VALHALLA_DB_TYPE_GROUP, 00804 } valhalla_db_type_t; 00805 00807 typedef enum valhalla_db_operator { 00808 VALHALLA_DB_OPERATOR_IN, 00809 VALHALLA_DB_OPERATOR_NOTIN, 00810 VALHALLA_DB_OPERATOR_EQUAL, 00811 } valhalla_db_operator_t; 00812 00814 typedef struct valhalla_db_item_s { 00815 valhalla_db_type_t type; 00816 int64_t id; 00817 const char *text; 00818 valhalla_meta_grp_t group; 00819 valhalla_lang_t lang; 00820 valhalla_metadata_pl_t priority; 00821 } valhalla_db_item_t; 00822 00824 typedef struct valhalla_db_metares_s { 00825 int64_t meta_id, data_id; 00826 const char *meta_name, *data_value; 00827 valhalla_meta_grp_t group; 00828 valhalla_lang_t lang; 00829 int external; 00830 } valhalla_db_metares_t; 00831 00833 typedef struct valhalla_db_fileres_s { 00834 int64_t id; 00835 const char *path; 00836 valhalla_file_type_t type; 00837 } valhalla_db_fileres_t; 00838 00840 typedef struct valhalla_db_restrict_s { 00841 struct valhalla_db_restrict_s *next; 00842 valhalla_db_operator_t op; 00843 valhalla_db_item_t meta; 00844 valhalla_db_item_t data; 00845 } valhalla_db_restrict_t; 00846 00847 00865 #define VALHALLA_DB_SEARCH(id, txt, g, t, l, p) \ 00866 { \ 00867 /* .type = */ VALHALLA_DB_TYPE_##t, \ 00868 /* .id = */ id, \ 00869 /* .text = */ txt, \ 00870 /* .group = */ VALHALLA_META_GRP_##g, \ 00871 /* .lang = */ l, \ 00872 /* .priority = */ p \ 00873 } 00874 00890 #define VALHALLA_DB_RESTRICT(op, m_id, d_id, m_txt, d_txt, m_t, d_t, l, p) \ 00891 { \ 00892 /* .next = */ NULL, \ 00893 /* .op = */ VALHALLA_DB_OPERATOR_##op, \ 00894 /* .meta = */ VALHALLA_DB_SEARCH (m_id, m_txt, NIL, m_t, l, p), \ 00895 /* .data = */ VALHALLA_DB_SEARCH (d_id, d_txt, NIL, d_t, l, p) \ 00896 } 00897 00899 #define VALHALLA_DB_SEARCH_ID(meta_id, group, l, p) \ 00900 VALHALLA_DB_SEARCH (meta_id, NULL, group, ID, l, p) 00901 00902 #define VALHALLA_DB_SEARCH_TEXT(meta_name, group, l, p) \ 00903 VALHALLA_DB_SEARCH (0, meta_name, group, TEXT, l, p) 00904 00905 #define VALHALLA_DB_SEARCH_GRP(group, l, p) \ 00906 VALHALLA_DB_SEARCH (0, NULL, group, GROUP, l, p) 00907 00909 #define VALHALLA_DB_RESTRICT_INT(op, meta, data, l, p) \ 00910 VALHALLA_DB_RESTRICT (op, meta, data, NULL, NULL, ID, ID, l, p) 00911 00912 #define VALHALLA_DB_RESTRICT_STR(op, meta, data, l, p) \ 00913 VALHALLA_DB_RESTRICT (op, 0, 0, meta, data, TEXT, TEXT, l, p) 00914 00915 #define VALHALLA_DB_RESTRICT_INTSTR(op, meta, data, l, p) \ 00916 VALHALLA_DB_RESTRICT (op, meta, 0, NULL, data, ID, TEXT, l, p) 00917 00918 #define VALHALLA_DB_RESTRICT_STRINT(op, meta, data, l, p) \ 00919 VALHALLA_DB_RESTRICT (op, 0, data, meta, NULL, TEXT, ID, l, p) 00920 00921 #define VALHALLA_DB_RESTRICT_LINK(from, to) \ 00922 do {(to).next = &(from);} while (0) 00923 00950 valhalla_db_stmt_t * 00951 valhalla_db_metalist_get (valhalla_t *handle, 00952 valhalla_db_item_t *search, 00953 valhalla_file_type_t filetype, 00954 valhalla_db_restrict_t *restriction); 00955 00967 const valhalla_db_metares_t * 00968 valhalla_db_metalist_read (valhalla_t *handle, valhalla_db_stmt_t *vhstmt); 00969 00990 valhalla_db_stmt_t * 00991 valhalla_db_filelist_get (valhalla_t *handle, 00992 valhalla_file_type_t filetype, 00993 valhalla_db_restrict_t *restriction); 00994 01006 const valhalla_db_fileres_t * 01007 valhalla_db_filelist_read (valhalla_t *handle, valhalla_db_stmt_t *vhstmt); 01008 01032 valhalla_db_stmt_t * 01033 valhalla_db_file_get (valhalla_t *handle, int64_t id, const char *path, 01034 valhalla_db_restrict_t *restriction); 01035 01047 const valhalla_db_metares_t * 01048 valhalla_db_file_read (valhalla_t *handle, valhalla_db_stmt_t *vhstmt); 01049 01121 int valhalla_db_metadata_insert (valhalla_t *handle, const char *path, 01122 const char *meta, const char *data, 01123 valhalla_lang_t lang, 01124 valhalla_meta_grp_t group); 01125 01145 int valhalla_db_metadata_update (valhalla_t *handle, const char *path, 01146 const char *meta, const char *data, 01147 const char *ndata, valhalla_lang_t lang); 01148 01163 int valhalla_db_metadata_delete (valhalla_t *handle, const char *path, 01164 const char *meta, const char *data); 01165 01184 int valhalla_db_metadata_priority (valhalla_t *handle, const char *path, 01185 const char *meta, const char *data, 01186 valhalla_metadata_pl_t p); 01187 01192 #ifdef __cplusplus 01193 } 01194 #endif /* __cplusplus */ 01195 01196 #endif /* VALHALLA_H */