1 
2 /* libquvi
3  * Copyright (C) 2009-2011  Toni Gundogdu <legatvs@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  * 02110-1301  USA
19  */
20 
21 #ifndef quvi_h
22 #define quvi_h
23 
24 #include <stdlib.h>
25 #include <stdint.h> /* C99 header */
26 
27 /*
28  * Enum: Version
29  *
30  * QUVI_VERSION         - Version string
31  * QUVI_VERSION_LONG    - Version string, build date, etc.
32  * QUVI_VERSION_SCRIPTS - libquvi-scripts version
33  */
34 typedef enum
35 {
36   QUVI_VERSION = 0x00,
37   QUVI_VERSION_LONG,
38   QUVI_VERSION_SCRIPTS
39 } QUVIversion;
40 
41 /*
42  * Enum: Return codes
43  *
44  * QUVI_OK        - No error
45  * QUVI_MEM       - Memory allocation error
46  * QUVI_BADHANDLE - Bad handle
47  * QUVI_INVARG    - Invalid function argument
48  * QUVI_CURLINIT  - libcurl initialization failure
49  * QUVI_LAST      - Last element in list
50  * QUVI_ABORTEDBYCALLBACK - Aborted by callback function
51  * QUVI_LUAINIT      - liblua initialization failure
52  * QUVI_NOLUAWEBSITE - Failed to find any webscripts
53  * QUVI_NOLUAUTIL - Failed to find the utility scripts
54  * QUVI_NOSUPPORT - libquvi cannot handle the URL
55  * QUVI_CALLBACK  - Network callback error occurred
56  * QUVI_ICONV     - libiconv error occurred
57  * QUVI_LUA       - liblua (or webscript) error occurred
58  * QUVI_PCRE      - Deprecated since 0.2.9, removed in 0.4.0
59  * QUVI_CURL      - Deprecated since 0.2.16, removed in 0.4.0,
60  *                    use <QUVI_CALLBACK> instead
61  */
62 typedef enum
63 {
64   /* quvi_strerror returns static strings with these: */
65   QUVI_OK = 0x00,
66   QUVI_MEM,
67   QUVI_BADHANDLE,
68   QUVI_INVARG,
69   QUVI_CURLINIT,
70   QUVI_LAST,
71   QUVI_ABORTEDBYCALLBACK,
72   QUVI_LUAINIT,
73   QUVI_NOLUAWEBSITE,
74   QUVI_NOLUAUTIL,
75   _INTERNAL_QUVI_LAST,
76   /* quvi_strerror returns dynamically created error strings with these: */
77   QUVI_NOSUPPORT = 0x41,
78   QUVI_CALLBACK,
79   QUVI_ICONV,
80   QUVI_LUA
81   /* Add new ones below */
82 } QUVIcode;
83 
84 /*
85  * Enum: Status changes
86  *
87  * QUVISTATUS_FETCH   - Status changed to 'fetch' from URL
88  * QUVISTATUS_VERIFY  - Status changed to 'verify' URL
89  * QUVISTATUS_RESOLVE - Status changed to 'resolve' URL
90  * QUVISTATUS_SHORTENED - Deprecated since 0.2.16, removed in 0.4.0,
91  *                          use <QUVISTATUS_RESOLVE> instead
92  */
93 typedef enum
94 {
95   QUVISTATUS_FETCH = 0x00,
96   QUVISTATUS_VERIFY,
97   QUVISTATUS_RESOLVE
98   /* Add new ones below */
99 } QUVIstatus;
100 
101 /*
102  * Enum: Status change types
103  *
104  * QUVISTATUSTYPE_PAGE     - Status type changed to 'page'
105  * QUVISTATUSTYPE_CONFIG   - Status type changed to 'config'
106  * QUVISTATUSTYPE_PLAYLIST - Status type changed to 'playlist'
107  * QUVISTATUSTYPE_DONE     - Status type changed to 'done'
108  */
109 typedef enum
110 {
111   QUVISTATUSTYPE_PAGE = 0x00,
112   QUVISTATUSTYPE_CONFIG,
113   QUVISTATUSTYPE_PLAYLIST,
114   QUVISTATUSTYPE_DONE
115   /* Add new ones below */
116 } QUVIstatusType;
117 
118 /*
119  * Enum: Options
120  *
121  * QUVIOPT_FORMAT          - Requested format
122  * QUVIOPT_NOVERIFY        - Do not verify (HTTP) media URLs
123  * QUVIOPT_STATUSFUNCTION  - Callback function for status updates
124  * QUVIOPT_NORESOLVE       - Do not attempt to resolve URLs to new location
125  * QUVIOPT_CATEGORY        - Bit pattern of OR'd webscript categories
126  * QUVIOPT_FETCHFUNCTION   - Callback function for fetching URLs
127  * QUVIOPT_RESOLVEFUNCTION - Callback function for resolving URL redirections
128  * QUVIOPT_VERIFYFUNCTION  - Callback function for verifying media URLs
129  * QUVIOPT_WRITEFUNCTION   - Deprecated since 0.2.17, removed in 0.4.0
130  * QUVIOPT_NOSHORTENED     - Deprecated since 0.2.16, removed in 0.4.0,
131  *                            use <QUVIOPT_NORESOLVE> instead
132  */
133 typedef enum
134 {
135   QUVIOPT_FORMAT = 0x00,
136   QUVIOPT_NOVERIFY,
137   QUVIOPT_STATUSFUNCTION,
138   QUVIOPT_NORESOLVE = 0x4,
139   QUVIOPT_CATEGORY,
140   QUVIOPT_FETCHFUNCTION,
141   QUVIOPT_RESOLVEFUNCTION,
142   QUVIOPT_VERIFYFUNCTION
143   /* Add new ones below */
144 } QUVIoption;
145 
146 /*
147  * Enum: Webscript protocol categories
148  *
149  * QUVIPROTO_HTTP - Protocol category HTTP
150  * QUVIPROTO_MMS  - Protocol category MMS
151  * QUVIPROTO_RTSP - Protocol category RTSP
152  * QUVIPROTO_RTMP - Protocol category RTMP
153  * QUVIPROTO_ALL  - All protocol categories
154  */
155 typedef enum
156 {
157   QUVIPROTO_HTTP = 0x1,
158   QUVIPROTO_MMS  = 0x2,
159   QUVIPROTO_RTSP = 0x4,
160   QUVIPROTO_RTMP = 0x8,
161   QUVIPROTO_ALL  =
162   (QUVIPROTO_HTTP|QUVIPROTO_MMS|QUVIPROTO_RTSP|QUVIPROTO_RTMP)
163 } QUVIcategory;
164 
165 #define QUVIINFO_VOID       0x100000 /**< void type */
166 #define QUVIINFO_LONG       0x200000 /**< long type */
167 #define QUVIINFO_STRING     0x300000 /**< string type */
168 #define QUVIINFO_DOUBLE     0x400000 /**< double type */
169 #define QUVIINFO_TYPEMASK   0xf00000 /**< type mask */
170 
171 /*
172  * Enum: Info types
173  *
174  * QUVIINFO_CURL         - libcurl session handle
175  * QUVIINFO_RESPONSECODE - Last response code returned by server
176  * QUVIINFO_CURLCODE     - Deprecated since 0.2.16, removed in 0.4.0
177  * QUVIINFO_HTTPCODE     - Deprecated since 0.2.16, removed in 0.4.0
178  */
179 typedef enum
180 {
181   QUVIINFO_NONE         = 0x00,
182   QUVIINFO_CURL         = QUVIINFO_VOID+1,
183   QUVIINFO_RESPONSECODE = QUVIINFO_LONG+3
184   /* Add new ones below */
185 } QUVIinfo;
186 
187 #define QUVIPROPERTY_STRING     0x100000 /**< string type */
188 #define QUVIPROPERTY_LONG       0x200000 /**< long type */
189 #define QUVIPROPERTY_DOUBLE     0x300000 /**< double type */
190 #define QUVIPROPERTY_VOID       0x400000 /**< void type */
191 #define QUVIPROPERTY_TYPEMASK   0xf00000 /**< type mask */
192 
193 /*
194  * Enum: Media properties
195  *
196  * QUVIPROP_HOSTID    - Host (or website) ID, typically domain name
197  * QUVIPROP_PAGEURL   - Page URL
198  * QUVIPROP_PAGETITLE - Page title
199  * QUVIPROP_MEDIAID   - Media ID
200  * QUVIPROP_MEDIAURL  - Media URL
201  * QUVIPROP_MEDIACONTENTLENGTH - Media content length in bytes
202  * QUVIPROP_MEDIACONTENTTYPE   - Media content-type
203  * QUVIPROP_FILESUFFIX   - File suffix, parsed from the content-type
204  * QUVIPROP_RESPONSECODE - Last response code returned by server
205  * QUVIPROP_FORMAT    - _Requested_ format, see <QUVIOPT_FORMAT>
206  * QUVIPROP_STARTTIME - Start time for media, if any
207  * QUVIPROP_MEDIATHUMBNAILURL - Media cover/thumbnail URL, if any
208  * QUVIPROP_MEDIADURATION - Media duration in msecs, if any (0)
209  * QUVIPROP_VIDEOID - Deprecated since 0.2.15, use <QUVIPROP_MEDIAID> instead
210  * QUVIPROP_VIDEOURL - Deprecated since 0.2.15, use <QUVIPROP_MEDIAURL> instead
211  * QUVIPROP_VIDEOFILELENGTH - Deprecated since 0.2.15,
212  *                              use <QUVIPROP_MEDIACONTENTLENGTH> instead
213  * QUVIPROP_VIDEOFILESUFFIX - Deprecated since 0.2.15,
214  *                              use <QUVIPROP_FILESUFFIX> instead
215  * QUVIPROP_VIDEOFORMAT - Deprecated since 0.2.15,
216  *                          use <QUVIPROP_FORMAT> instead
217  * QUVIPROP_HTTPCODE    - Deprecated since 0.2.16,
218  *                          use <QUVIPROP_RESPONSECODE> instead
219  */
220 typedef enum
221 {
222   QUVIPROP_NONE               = 0x00,
223   QUVIPROP_HOSTID             = QUVIPROPERTY_STRING+1,
224   QUVIPROP_PAGEURL            = QUVIPROPERTY_STRING+2,
225   QUVIPROP_PAGETITLE          = QUVIPROPERTY_STRING+3,
226   QUVIPROP_MEDIAID            = QUVIPROPERTY_STRING+4,
227   QUVIPROP_MEDIAURL           = QUVIPROPERTY_STRING+5,
228   QUVIPROP_MEDIACONTENTLENGTH = QUVIPROPERTY_DOUBLE+6,
229   QUVIPROP_MEDIACONTENTTYPE   = QUVIPROPERTY_STRING+7,
230   QUVIPROP_FILESUFFIX         = QUVIPROPERTY_STRING+8,
231   QUVIPROP_RESPONSECODE       = QUVIPROPERTY_LONG+9,
232   QUVIPROP_FORMAT             = QUVIPROPERTY_STRING+10,
233   QUVIPROP_STARTTIME          = QUVIPROPERTY_STRING+11,
234   QUVIPROP_MEDIATHUMBNAILURL  = QUVIPROPERTY_STRING+12,
235   QUVIPROP_MEDIADURATION      = QUVIPROPERTY_DOUBLE+13
236   /* Add new ones below */
237 } QUVIproperty;
238 
239 /*
240  * Enum: Ident properties
241  *
242  * QUVI_IDENT_PROPERTY_URL        - URL
243  * QUVI_IDENT_PROPERTY_DOMAIN     - Domain
244  * QUVI_IDENT_PROPERTY_FORMATS    - Formats
245  * QUVI_IDENT_PROPERTY_CATEGORIES - Protocol categories
246  */
247 typedef enum
248 {
249   QUVI_IDENT_PROPERTY_NONE = 0x00,
250   QUVI_IDENT_PROPERTY_URL  = QUVIPROPERTY_STRING+1,
251   QUVI_IDENT_PROPERTY_DOMAIN     = QUVIPROPERTY_STRING+2,
252   QUVI_IDENT_PROPERTY_FORMATS    = QUVIPROPERTY_STRING+3,
253   QUVI_IDENT_PROPERTY_CATEGORIES = QUVIPROPERTY_STRING+4
254 } QUVIidentProperty;
255 
256 /*
257  * Typedef: Handles
258  *
259  * quvi_t       - Session handle
260  * quvi_media_t - Media handle
261  * quvi_ident_t - Ident handle
262  * quvi_video_t - Deprecated since 0.2.15, use quvi_media_t instead
263  */
264 typedef void *quvi_t;
265 typedef void *quvi_media_t;
266 typedef void *quvi_ident_t;
267 
268 /*
269  * Typedef: Callbacks
270  *
271  * quvi_callback_status - Status callback function
272  */
273 typedef int (*quvi_callback_status) (long, void*);
274 
275 /*
276  * Typedef: Other
277  *
278  * quvi_word - Word type
279  * quvi_byte - Byte type
280  */
281 typedef uint32_t quvi_word;
282 typedef uint8_t quvi_byte;
283 
284 /*
285  * Macro: Support macros
286  *
287  * quvi_lobyte - Return a low byte from a word type variable
288  * quvi_hibyte - Return a high byte from a word type variable
289  * quvi_loword - Return a low word from a long type variable
290  * quvi_hiword - Return a high word from a long type variable
291  */
292 #define quvi_lobyte(w) ((quvi_byte)((uint64_t)(w) & 0xff))
293 #define quvi_hibyte(w) ((quvi_byte)((uint64_t)(w) >> 8))
294 #define quvi_loword(l) ((quvi_word)((uint64_t)(l) & 0xffff))
295 #define quvi_hiword(l) ((quvi_word)((uint64_t)(l) >> 16))
296 
297 #ifdef __cplusplus
298 extern "C" {
299 #endif
300 
301   QUVIcode quvi_init(quvi_t*);
302   void     quvi_close(quvi_t*);
303 
304   QUVIcode quvi_setopt(quvi_t, QUVIoption, ...);
305   QUVIcode quvi_getinfo(quvi_t, QUVIinfo, ...);
306 
307   QUVIcode quvi_parse(quvi_t, char *url, quvi_media_t*);
308   void     quvi_parse_close(quvi_media_t*);
309 
310   QUVIcode quvi_getprop(quvi_media_t, QUVIproperty, ...);
311 
312   /* Support functions */
313   QUVIcode quvi_query_formats(quvi_t, char *url, char **formats);
314 
315   QUVIcode quvi_next_media_url(quvi_media_t);
316 
317   QUVIcode quvi_supported(quvi_t, char *url);
318   QUVIcode quvi_supported_ident(quvi_t, char *url, quvi_ident_t*);
319   QUVIcode quvi_ident_getprop(quvi_ident_t, QUVIidentProperty, ...);
320   void     quvi_supported_ident_close(quvi_ident_t*);
321 
322   QUVIcode quvi_next_supported_website(quvi_t, char **domain, char **formats);
323   QUVIcode quvi_next_host(char **domain, char **formats);
324 
325   char *quvi_strerror(quvi_t, QUVIcode);
326   char *quvi_version(QUVIversion);
327   void quvi_free(void*);
328 
329 #ifdef __cplusplus
330 }
331 #endif /* __cplusplus */
332 
333 #endif /* quvi_h */
334 
335 /* vim: set ts=2 sw=2 tw=72 expandtab: */
336