libvalhalla 2.0.0

valhalla.h

Go to the documentation of this file.
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 */