libvalhalla  2.0.0
valhalla.h
Go to the documentation of this file.
1 /*
2  * GeeXboX Valhalla: tiny media scanner API.
3  * Copyright (C) 2009-2010 Mathieu Schroeter <mathieu.schroeter@gamesover.ch>
4  *
5  * This file is part of libvalhalla.
6  *
7  * libvalhalla is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * libvalhalla is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with libvalhalla; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #ifndef VALHALLA_H
23 #define VALHALLA_H
24 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif /* __cplusplus */
34 
35 #define VH_STRINGIFY(s) #s
36 #define VH_TOSTRING(s) VH_STRINGIFY(s)
37 
38 #define VH_VERSION_INT(a, b, c) (a << 16 | b << 8 | c)
39 #define VH_VERSION_DOT(a, b, c) a ##.## b ##.## c
40 #define VH_VERSION(a, b, c) VH_VERSION_DOT(a, b, c)
41 
42 #define LIBVALHALLA_VERSION_MAJOR 2
43 #define LIBVALHALLA_VERSION_MINOR 0
44 #define LIBVALHALLA_VERSION_MICRO 0
45 
46 #define LIBVALHALLA_DB_VERSION 2
47 
48 #define LIBVALHALLA_VERSION_INT VH_VERSION_INT(LIBVALHALLA_VERSION_MAJOR, \
49  LIBVALHALLA_VERSION_MINOR, \
50  LIBVALHALLA_VERSION_MICRO)
51 #define LIBVALHALLA_VERSION VH_VERSION(LIBVALHALLA_VERSION_MAJOR, \
52  LIBVALHALLA_VERSION_MINOR, \
53  LIBVALHALLA_VERSION_MICRO)
54 #define LIBVALHALLA_VERSION_STR VH_TOSTRING(LIBVALHALLA_VERSION)
55 #define LIBVALHALLA_BUILD LIBVALHALLA_VERSION_INT
56 
57 #include <inttypes.h>
58 #include <stdarg.h>
59 
63 unsigned int libvalhalla_version (void);
64 
66 typedef enum valhalla_lang {
75 
76 typedef enum valhalla_file_type {
77  VALHALLA_FILE_TYPE_NULL = 0,
78  VALHALLA_FILE_TYPE_AUDIO,
79  VALHALLA_FILE_TYPE_IMAGE,
80  VALHALLA_FILE_TYPE_PLAYLIST,
81  VALHALLA_FILE_TYPE_VIDEO,
82 } valhalla_file_type_t;
83 
85 typedef enum valhalla_meta_grp {
90 
96 
102 
107 
115 
120 
125 
130 
135 
141 
146 
151 
156 
162 
167 
169 
175 /* Classification */
176 #define VALHALLA_METADATA_CATEGORY "category"
177 #define VALHALLA_METADATA_EPISODE "episode"
178 #define VALHALLA_METADATA_GENRE "genre"
179 #define VALHALLA_METADATA_MPAA "mpaa"
180 #define VALHALLA_METADATA_RUNTIME "runtime"
181 #define VALHALLA_METADATA_SEASON "season"
182 #define VALHALLA_METADATA_SYNOPSIS "synopsis"
183 #define VALHALLA_METADATA_SYNOPSIS_SHOW "synopsis_show"
184 
185 /* Commercial */
186 #define VALHALLA_METADATA_BUDGET "budget"
187 #define VALHALLA_METADATA_COUNTRY "country"
188 #define VALHALLA_METADATA_REVENUE "revenue"
189 #define VALHALLA_METADATA_STUDIO "studio"
190 
191 /* Entities */
192 #define VALHALLA_METADATA_ACTOR "actor"
193 #define VALHALLA_METADATA_ARTIST "artist"
194 #define VALHALLA_METADATA_AUTHOR "author"
195 #define VALHALLA_METADATA_CASTING "casting"
196 #define VALHALLA_METADATA_COMPOSER "composer"
197 #define VALHALLA_METADATA_CREDITS "credits"
198 #define VALHALLA_METADATA_DIRECTOR "director"
199 #define VALHALLA_METADATA_DIRECTOR_PHOTO "director_photo"
200 #define VALHALLA_METADATA_EDITOR "editor"
201 #define VALHALLA_METADATA_PRODUCER "producer"
202 #define VALHALLA_METADATA_WRITER "writer"
203 
204 /* Miscellaneous */
205 #define VALHALLA_METADATA_COVER "cover"
206 #define VALHALLA_METADATA_COVER_SEASON "cover_season"
207 #define VALHALLA_METADATA_COVER_SHOW "cover_show"
208 #define VALHALLA_METADATA_COVER_SHOW_HEADER "cover_show_header"
209 #define VALHALLA_METADATA_FAN_ART "fanart"
210 #define VALHALLA_METADATA_LYRICS "lyrics"
211 #define VALHALLA_METADATA_THUMBNAIL "thumbnail"
212 
213 /* Organizational */
214 #define VALHALLA_METADATA_TRACK "track"
215 
216 /* Personal */
217 #define VALHALLA_METADATA_PLAY_COUNT "playcount"
218 #define VALHALLA_METADATA_RATING "rating"
219 #define VALHALLA_METADATA_WATCHED "watched"
220 
221 /* Technical */
222 #define VALHALLA_METADATA_AUDIO_BITRATE "audio_bitrate"
223 #define VALHALLA_METADATA_AUDIO_CHANNELS "audio_channels"
224 #define VALHALLA_METADATA_AUDIO_CODEC "audio_codec"
225 #define VALHALLA_METADATA_AUDIO_LANG "audio_lang"
226 #define VALHALLA_METADATA_AUDIO_STREAMS "audio_streams"
227 #define VALHALLA_METADATA_DURATION "duration"
228 #define VALHALLA_METADATA_FILESIZE "filesize"
229 #define VALHALLA_METADATA_HEIGHT "height"
230 #define VALHALLA_METADATA_PICTURE_ORIENTATION "picture_orientation"
231 #define VALHALLA_METADATA_SUB_LANG "sub_lang"
232 #define VALHALLA_METADATA_SUB_STREAMS "sub_streams"
233 #define VALHALLA_METADATA_VIDEO_ASPECT "video_aspect"
234 #define VALHALLA_METADATA_VIDEO_BITRATE "video_bitrate"
235 #define VALHALLA_METADATA_VIDEO_CODEC "video_codec"
236 #define VALHALLA_METADATA_VIDEO_STREAMS "video_streams"
237 #define VALHALLA_METADATA_WIDTH "width"
238 
239 /* Temporal */
240 #define VALHALLA_METADATA_DATE "date"
241 #define VALHALLA_METADATA_PREMIERED "premiered"
242 #define VALHALLA_METADATA_YEAR "year"
243 
244 /* Titles */
245 #define VALHALLA_METADATA_ALBUM "album"
246 #define VALHALLA_METADATA_TITLE "title"
247 #define VALHALLA_METADATA_TITLE_ALTERNATIVE "title_alternative"
248 #define VALHALLA_METADATA_TITLE_SHOW "title_show"
249 
254 /******************************************************************************/
255 /* */
256 /* Valhalla Handling */
257 /* */
258 /******************************************************************************/
259 
261 typedef struct valhalla_s valhalla_t;
262 
270 };
271 
273 typedef enum valhalla_verb {
281 
283 typedef enum valhalla_dl {
288  VALHALLA_DL_LAST
289 } valhalla_dl_t;
290 
292 typedef enum valhalla_event_od {
297 
299 typedef enum valhalla_event_gl {
306 
308 typedef enum valhalla_event_md {
312 
314 typedef enum valhalla_stats_type {
318 
324 typedef enum valhalla_metadata_pl {
335 
337 typedef struct valhalla_metadata_s {
338  const char *name;
339  const char *value;
340  valhalla_meta_grp_t group;
341  valhalla_lang_t lang;
343 
345 typedef struct valhalla_file_s {
346  const char *path;
347  int64_t mtime;
348  int64_t size;
349  valhalla_file_type_t type;
351 
352 #define VH_CFG_RANGE 8
354 #define VH_VOID_T (0 << VH_CFG_RANGE)
355 #define VH_VOIDP_T (1 << VH_CFG_RANGE)
356 #define VH_INT_T (2 << VH_CFG_RANGE)
357 #define VH_VOIDP_2_T (4 << VH_CFG_RANGE)
360 #define VH_CFG_INIT(name, type, num) VALHALLA_CFG_##name = ((type) + (num))
361 
382 typedef enum valhalla_cfg {
393  VH_CFG_INIT (DOWNLOADER_DEST, VH_VOIDP_T | VH_INT_T, 2),
394 
413  VH_CFG_INIT (GRABBER_PRIORITY, VH_VOIDP_T | VH_INT_T | VH_VOIDP_2_T, 0),
414 
424  VH_CFG_INIT (GRABBER_STATE, VH_VOIDP_T | VH_INT_T, 0),
425 
465  VH_CFG_INIT (PARSER_KEYWORD, VH_VOIDP_T, 0),
466 
476  VH_CFG_INIT (SCANNER_PATH, VH_VOIDP_T | VH_INT_T, 1),
477 
489  VH_CFG_INIT (SCANNER_SUFFIX, VH_VOIDP_T, 1),
490 
492 
494 typedef struct valhalla_init_param_s {
499  unsigned int parser_nb;
509  unsigned int grabber_nb;
515  unsigned int commit_int;
523  unsigned int decrapifier : 1;
524 
536  void (*od_cb) (const char *file, valhalla_event_od_t e,
537  const char *id, void *data);
539  void *od_data;
540 
545  void (*gl_cb) (valhalla_event_gl_t e, void *data);
547  void *gl_data;
548 
559  void (*md_cb) (valhalla_event_md_t e, const char *id,
560  const valhalla_file_t *file,
561  const valhalla_metadata_t *md, void *data);
563  void *md_data;
564 
566 
573 /* This function must not be used directly; refer to valhalla_config_set(). */
574 int valhalla_config_set_orig (valhalla_t *handle, valhalla_cfg_t conf, ...);
599 #define valhalla_config_set(handle, conf, arg...) \
600  valhalla_config_set_orig (handle, VALHALLA_CFG_##conf, ##arg, ~0)
601 
619 valhalla_t *valhalla_init (const char *db, valhalla_init_param_t *param);
620 
629 void valhalla_uninit (valhalla_t *handle);
630 
640 
651 
664 const char *valhalla_grabber_next (valhalla_t *handle, const char *id);
665 
687  const char *id,
688  const char **meta);
689 
701 const char *valhalla_stats_group_next (valhalla_t *handle, const char *id);
702 
717 uint64_t valhalla_stats_read_next (valhalla_t *handle, const char *id,
719  const char **item);
720 
740 int valhalla_run (valhalla_t *handle,
741  int loop, uint16_t timeout, uint16_t delay, int priority);
742 
758 void valhalla_wait (valhalla_t *handle);
759 
771 void valhalla_scanner_wakeup (valhalla_t *handle);
772 
784 void valhalla_ondemand (valhalla_t *handle, const char *file);
785 
790 /******************************************************************************/
791 /* */
792 /* Database Selections */
793 /* */
794 /******************************************************************************/
795 
797 typedef struct valhalla_db_stmt_s valhalla_db_stmt_t;
798 
800 typedef enum valhalla_db_type {
801  VALHALLA_DB_TYPE_ID,
802  VALHALLA_DB_TYPE_TEXT,
803  VALHALLA_DB_TYPE_GROUP,
805 
807 typedef enum valhalla_db_operator {
808  VALHALLA_DB_OPERATOR_IN,
809  VALHALLA_DB_OPERATOR_NOTIN,
810  VALHALLA_DB_OPERATOR_EQUAL,
812 
814 typedef struct valhalla_db_item_s {
815  valhalla_db_type_t type;
816  int64_t id;
817  const char *text;
818  valhalla_meta_grp_t group;
819  valhalla_lang_t lang;
820  valhalla_metadata_pl_t priority;
822 
824 typedef struct valhalla_db_metares_s {
825  int64_t meta_id, data_id;
826  const char *meta_name, *data_value;
827  valhalla_meta_grp_t group;
828  valhalla_lang_t lang;
829  int external;
831 
833 typedef struct valhalla_db_fileres_s {
834  int64_t id;
835  const char *path;
836  valhalla_file_type_t type;
838 
840 typedef struct valhalla_db_restrict_s {
841  struct valhalla_db_restrict_s *next;
843  valhalla_db_item_t meta;
844  valhalla_db_item_t data;
846 
847 
865 #define VALHALLA_DB_SEARCH(id, txt, g, t, l, p) \
866  { \
867  /* .type = */ VALHALLA_DB_TYPE_##t, \
868  /* .id = */ id, \
869  /* .text = */ txt, \
870  /* .group = */ VALHALLA_META_GRP_##g, \
871  /* .lang = */ l, \
872  /* .priority = */ p \
873  }
874 
890 #define VALHALLA_DB_RESTRICT(op, m_id, d_id, m_txt, d_txt, m_t, d_t, l, p) \
891  { \
892  /* .next = */ NULL, \
893  /* .op = */ VALHALLA_DB_OPERATOR_##op, \
894  /* .meta = */ VALHALLA_DB_SEARCH (m_id, m_txt, NIL, m_t, l, p), \
895  /* .data = */ VALHALLA_DB_SEARCH (d_id, d_txt, NIL, d_t, l, p) \
896  }
897 
899 #define VALHALLA_DB_SEARCH_ID(meta_id, group, l, p) \
900  VALHALLA_DB_SEARCH (meta_id, NULL, group, ID, l, p)
901 
902 #define VALHALLA_DB_SEARCH_TEXT(meta_name, group, l, p) \
903  VALHALLA_DB_SEARCH (0, meta_name, group, TEXT, l, p)
904 
905 #define VALHALLA_DB_SEARCH_GRP(group, l, p) \
906  VALHALLA_DB_SEARCH (0, NULL, group, GROUP, l, p)
907 
909 #define VALHALLA_DB_RESTRICT_INT(op, meta, data, l, p) \
910  VALHALLA_DB_RESTRICT (op, meta, data, NULL, NULL, ID, ID, l, p)
911 
912 #define VALHALLA_DB_RESTRICT_STR(op, meta, data, l, p) \
913  VALHALLA_DB_RESTRICT (op, 0, 0, meta, data, TEXT, TEXT, l, p)
914 
915 #define VALHALLA_DB_RESTRICT_INTSTR(op, meta, data, l, p) \
916  VALHALLA_DB_RESTRICT (op, meta, 0, NULL, data, ID, TEXT, l, p)
917 
918 #define VALHALLA_DB_RESTRICT_STRINT(op, meta, data, l, p) \
919  VALHALLA_DB_RESTRICT (op, 0, data, meta, NULL, TEXT, ID, l, p)
920 
921 #define VALHALLA_DB_RESTRICT_LINK(from, to) \
922  do {(to).next = &(from);} while (0)
923 
952  valhalla_db_item_t *search,
953  valhalla_file_type_t filetype,
954  valhalla_db_restrict_t *restriction);
955 
967 const valhalla_db_metares_t *
969 
992  valhalla_file_type_t filetype,
993  valhalla_db_restrict_t *restriction);
994 
1006 const valhalla_db_fileres_t *
1008 
1033 valhalla_db_file_get (valhalla_t *handle, int64_t id, const char *path,
1034  valhalla_db_restrict_t *restriction);
1035 
1047 const valhalla_db_metares_t *
1049 
1121 int valhalla_db_metadata_insert (valhalla_t *handle, const char *path,
1122  const char *meta, const char *data,
1123  valhalla_lang_t lang,
1124  valhalla_meta_grp_t group);
1125 
1145 int valhalla_db_metadata_update (valhalla_t *handle, const char *path,
1146  const char *meta, const char *data,
1147  const char *ndata, valhalla_lang_t lang);
1148 
1163 int valhalla_db_metadata_delete (valhalla_t *handle, const char *path,
1164  const char *meta, const char *data);
1165 
1184 int valhalla_db_metadata_priority (valhalla_t *handle, const char *path,
1185  const char *meta, const char *data,
1187 
1192 #ifdef __cplusplus
1193 }
1194 #endif /* __cplusplus */
1195 
1196 #endif /* VALHALLA_H */