owntone-server/src/ff-plugins.h

165 lines
5.3 KiB
C

/*
* $Id: $
* Public plug-in interface
*
* Copyright (C) 2006 Ron Pedde (ron@pedde.com)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#ifndef _FF_PLUGINS_H_
#define _FF_PLUGINS_H_
/* Plugin types */
#define PLUGIN_OUTPUT 1
#define PLUGIN_SCANNER 2
#define PLUGIN_DATABASE 4
#define PLUGIN_EVENT 8
#define PLUGIN_TRANSCODE 16
/* plugin event types */
#define PLUGIN_EVENT_LOG 0
#define PLUGIN_EVENT_FULLSCAN_START 1
#define PLUGIN_EVENT_FULLSCAN_END 2
#define PLUGIN_EVENT_STARTING 3
#define PLUGIN_EVENT_SHUTDOWN 4
#define PLUGIN_EVENT_STARTSTREAM 5
#define PLUGIN_EVENT_ABORTSTREAM 6
#define PLUGIN_EVENT_ENDSTREAM 7
#define PLUGIN_VERSION 1
#ifndef E_FATAL
# define E_FATAL 0
# define E_LOG 1
# define E_WARN 2
# define E_INF 5
# define E_DBG 9
# define E_SPAM 10
#endif
#define COUNT_SONGS 0
#define COUNT_PLAYLISTS 1
struct tag_ws_conninfo;
/* Functions that must be exported by different plugin types */
typedef struct tag_plugin_output_fn {
int(*can_handle)(struct tag_ws_conninfo *pwsc);
void(*handler)(struct tag_ws_conninfo *pwsc);
int(*auth)(struct tag_ws_conninfo *pwsc, char *username, char *pw);
} PLUGIN_OUTPUT_FN;
typedef struct tag_plugin_event_fn {
void(*handler)(int event_id, int intval, void *vp, int len);
} PLUGIN_EVENT_FN;
typedef struct tag_plugin_transcode_fn {
void *(*ssc_init)(void);
void (*ssc_deinit)(void*);
int (*ssc_open)(void*, char *, char*, int);
int (*ssc_close)(void*);
int (*ssc_read)(void*, char*, int);
char *(*ssc_error)(void*);
} PLUGIN_TRANSCODE_FN;
/* info for rendezvous advertising */
typedef struct tag_plugin_rend_info {
char *type;
char *txt;
} PLUGIN_REND_INFO;
/* main info struct that plugins must provide */
typedef struct tag_plugin_info {
int version; /* PLUGIN_VERSION */
int type; /* PLUGIN_OUTPUT, etc */
char *server; /* Server/version format */
PLUGIN_OUTPUT_FN *output_fns; /* functions for different plugin types */
PLUGIN_EVENT_FN *event_fns;
PLUGIN_TRANSCODE_FN *transcode_fns;
PLUGIN_REND_INFO *rend_info; /* array of rend announcements */
char *codeclist; /* comma separated list of codecs */
} PLUGIN_INFO;
#define QUERY_TYPE_ITEMS 0
#define QUERY_TYPE_PLAYLISTS 1
#define QUERY_TYPE_DISTINCT 2
#define FILTER_TYPE_FIREFLY 0
#define FILTER_TYPE_APPLE 1
typedef struct tag_db_query {
int query_type;
char *distinct_field;
int filter_type;
char *filter;
int offset;
int limit;
int playlist_id; /* for items query */
int totalcount; /* returned total count */
void *priv;
} DB_QUERY;
/* version 1 plugin imports */
typedef struct tag_plugin_input_fn {
/* webserver helpers */
char* (*ws_uri)(struct tag_ws_conninfo *);
void (*ws_will_close)(struct tag_ws_conninfo *);
int (*ws_returnerror)(struct tag_ws_conninfo *, int, char *);
char* (*ws_getvar)(struct tag_ws_conninfo *, char *);
int (*ws_writefd)(struct tag_ws_conninfo *, char *, ...);
int (*ws_addresponseheader)(struct tag_ws_conninfo *, char *, char *, ...);
void (*ws_emitheaders)(struct tag_ws_conninfo *);
int (*ws_fd)(struct tag_ws_conninfo *);
char* (*ws_getrequestheader)(struct tag_ws_conninfo *, char *);
int (*ws_writebinary)(struct tag_ws_conninfo *, char *, int);
/* misc helpers */
char* (*server_ver)(void);
int (*server_name)(char *, int *);
void (*log)(int, char *, ...);
int (*should_transcode)(struct tag_ws_conninfo *, char *);
int (*db_count)(void);
int (*db_enum_start)(char **, DB_QUERY *);
int (*db_enum_fetch_row)(char **, char ***, DB_QUERY *);
int (*db_enum_end)(char **);
int (*db_enum_restart)(char **, DB_QUERY *);
void (*db_enum_dispose)(char **, DB_QUERY*);
void (*stream)(struct tag_ws_conninfo *, char *);
int (*db_add_playlist)(char **pe, char *name, int type, char *clause, char *path, int index, int *playlistid);
int (*db_add_playlist_item)(char **pe, int playlistid, int songid);
int (*db_edit_playlist)(char **pe, int id, char *name, char *clause);
int (*db_delete_playlist)(char **pe, int playlistid);
int (*db_delete_playlist_item)(char **pe, int playlistid, int songid);
int (*db_revision)(void);
int (*db_count_items)(int what);
int (*db_wait_update)(struct tag_ws_conninfo *);
char *(*conf_alloc_string)(char *section, char *key, char *dflt);
void (*conf_dispose_string)(char *str);
int (*conf_get_int)(char *section, char *key, int dflt);
void (*config_set_status)(struct tag_ws_conninfo *pwsc, int session, char *fmt, ...);
} PLUGIN_INPUT_FN;
#endif /* _FF_PLUGINS_ */