summaryrefslogtreecommitdiff
path: root/community/mplayer2/mplayer2-20120729-libquvi-support.patch
blob: f27fa690d6508b87ac3780c784f8893bb3aff804 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
From 37c124805c00ae0f2570c95f9543e39ce69793a6 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@mplayer2.org>
Date: Fri, 02 Mar 2012 19:24:34 +0000
Subject: quvi: Add support for streaming sites using libquvi

This enables playing URLs from libquvi supported streaming sites
directly, e.g. "mplayer http://www.youtube.com/watch?v=...."

Anything opened with mplayer is checked with libquvi. If it looks like
a URL of a supported streaming site, libquvi is used to extract the
media URL, which is then passed to the lower level mplayer code
instead of the HTML URL. Hopefully the libquvi URL checker works well
enough that it doesn't cause any problems with normal URLs, files, or
whatever else mplayer's stream layer accepts.

Add the --quvi-format option. The option value is directly passed
to libquvi as requested format. The only values that seem to work for
any streaming site seem to be "best" (best quality) and "default"
(lowest quality). The mplayer option defaults to "best" (overriding
libquvi's default).

Outstanding issues:
- Does libquvi checking every opened file really not cause problems?
  Should there be a runtime option to disable libquvi use?
  (Probably not an issue.)
- Should we check/set the supported protocol? By default libquvi has
  support for all protocols enabled. In the worst case, it might
  return an URL using a protocol not supported by mplayer, even though
  it could extract URLs with other protocols too.
  (Probably not an issue.)
- Somehow export metadata (like media title) to the mplayer frontend?
---
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index 5440de9..d8d556a 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -517,6 +517,8 @@ const m_option_t common_opts[] = {
 
     OPT_MAKE_FLAGS("hr-mp3-seek", hr_mp3_seek, 0),
 
+    OPT_STRING("quvi-format", quvi_format, 0),
+
     { "rawaudio", (void *)&demux_rawaudio_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
     { "rawvideo", (void *)&demux_rawvideo_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
 
diff --git a/configure b/configure
index 5c1e288..18bc404 100755
--- a/configure
+++ b/configure
@@ -335,6 +335,7 @@ Optional features:
   --enable-winsock2_h    enable winsock2_h [autodetect]
   --enable-smb           enable Samba (SMB) input [autodetect]
   --enable-live          enable LIVE555 Streaming Media [disable]
+  --enable-libquvi       enable libquvi [autodetect]
   --enable-nemesi        enable Nemesi Streaming Media [autodetect]
   --disable-vcd          disable VCD support [autodetect]
   --disable-bluray       disable Blu-ray support [autodetect]
@@ -650,6 +651,7 @@ _pvr=auto
 networking=yes
 _winsock2_h=auto
 _smb=auto
+_libquvi=auto
 _joystick=no
 _xvid=auto
 _libnut=auto
@@ -1009,6 +1011,8 @@ for ac_option do
   --disable-winsock2_h) _winsock2_h=no  ;;
   --enable-smb)         _smb=yes        ;;
   --disable-smb)        _smb=no ;;
+  --enable-libquvi)     _libquvi=yes    ;;
+  --disable-libquvi)    _libquvi=no     ;;
   --enable-joystick)    _joystick=yes   ;;
   --disable-joystick)   _joystick=no    ;;
   --enable-xvid)        _xvid=yes       ;;
@@ -3610,6 +3614,19 @@ else
 fi
 echores "$_smb"
 
+echocheck "libquvi support"
+if test "$_libquvi" = auto ; then
+    _libquvi=no
+    if pkg_config_add libquvi ; then
+        _libquvi=yes
+    fi
+fi
+if test "$_libquvi" = yes; then
+    def_libquvi="#define CONFIG_LIBQUVI 1"
+else
+    def_libquvi="#undef CONFIG_LIBQUVI"
+fi
+echores "$_libquvi"
 
 #########
 # VIDEO #
@@ -6325,6 +6342,7 @@ LIBNEMESI = $_nemesi
 LIBNUT = $_libnut
 LIBPOSTPROC = $libpostproc
 LIBSMBCLIENT = $_smb
+LIBQUVI = $_libquvi
 LIBTHEORA = $_theora
 LIRC = $_lirc
 LIVE555 = $_live
@@ -6668,6 +6686,7 @@ $def_live
 $def_nemesi
 $def_networking
 $def_smb
+$def_libquvi
 $def_socklen_t
 $def_vstream
 
diff --git a/options.h b/options.h
index 48f5c53..89324bd 100644
--- a/options.h
+++ b/options.h
@@ -78,6 +78,7 @@ typedef struct MPOpts {
     char **audio_lang;
     char **sub_lang;
     int hr_mp3_seek;
+    char *quvi_format;
 
     char *audio_stream;
     int audio_stream_cache;
diff --git a/stream/open.c b/stream/open.c
index ce0a415..91e9ae2 100644
--- a/stream/open.c
+++ b/stream/open.c
@@ -26,12 +26,14 @@
 
 #include "config.h"
 #include "mp_msg.h"
+#include "talloc.h"
 
 #ifdef __FreeBSD__
 #include <sys/cdrio.h>
 #endif
 
 #include "m_option.h"
+#include "options.h"
 #include "stream.h"
 #include "libmpdemux/demuxer.h"
 
@@ -42,6 +44,62 @@ char* cdrom_device=NULL;
 char* dvd_device=NULL;
 int dvd_title=0;
 
+#ifdef CONFIG_LIBQUVI
+
+#include <quvi/quvi.h>
+
+static const char *resolve_quvi(const char *url, struct MPOpts *opts)
+{
+    char *media_title, *media_url;
+    quvi_media_t m;
+    QUVIcode rc;
+    quvi_t q;
+
+    rc = quvi_init(&q);
+    if (rc != QUVI_OK)
+        return NULL;
+
+    // Don't try to use quvi on an URL that's not directly supported, since
+    // quvi will do a network access anyway in order to check for HTTP
+    // redirections etc.
+    // The documentation says this will fail on "shortened" URLs.
+    if (quvi_supported(q, (char *)url) != QUVI_OK) {
+        quvi_close(&q);
+        return NULL;
+    }
+
+    mp_msg(MSGT_OPEN, MSGL_INFO, "[quvi] Checking URL...\n");
+
+    // Can use quvi_query_formats() to get a list of formats like this:
+    // "fmt05_240p|fmt18_360p|fmt34_360p|fmt35_480p|fmt43_360p|fmt44_480p"
+    // (This example is youtube specific.)
+    // That call requires an extra net access. quvi_next_media_url() doesn't
+    // seem to do anything useful. So we can't really do anything useful
+    // except pass through the user's format setting.
+    quvi_setopt(q, QUVIOPT_FORMAT, opts->quvi_format
+                                   ? opts->quvi_format : "best");
+
+    rc = quvi_parse(q, (char *)url, &m);
+    if (rc != QUVI_OK) {
+        mp_msg(MSGT_OPEN, MSGL_ERR, "[quvi] %s\n", quvi_strerror(q, rc));
+        quvi_close(&q);
+        return NULL;
+    }
+
+    quvi_getprop(m, QUVIPROP_PAGETITLE, &media_title);
+    quvi_getprop(m, QUVIPROP_MEDIAURL, &media_url);
+
+    mp_msg(MSGT_OPEN, MSGL_INFO, "[quvi] Site media title: '%s'\n",
+           media_title);
+    media_url = talloc_strdup(NULL, media_url);
+
+    quvi_parse_close(&m);
+    quvi_close(&q);
+
+    return media_url;
+}
+#endif
+
 // Open a new stream  (stdin/file/vcd/url)
 
 stream_t* open_stream(const char *filename, struct MPOpts *options,
@@ -59,7 +117,16 @@ if(!filename) {
    return NULL;
 }
 
-//============ Open STDIN or plain FILE ============
+  const char *resolved = NULL;
+
+#ifdef CONFIG_LIBQUVI
+  resolved = resolve_quvi(filename, options);
+#endif
+
+  if (resolved)
+      filename = resolved;
 
-  return open_stream_full(filename,STREAM_READ,options,file_format);
+  stream_t *res = open_stream_full(filename,STREAM_READ,options,file_format);
+  talloc_free((void *)resolved);
+  return res;
 }
--
cgit v0.9
From 86f7fe1ba61a465fb25bc30deaaa4fcf12600a43 Mon Sep 17 00:00:00 2001
From: wm4 <wm4@nowhere>
Date: Sun, 02 Sep 2012 18:45:11 +0000
Subject: configure: add version check for libquvi

I do not know what exactly is the minimum working version. Require the
latest version currently released, which is about half a year old.
---
diff --git a/configure b/configure
index 2cf7aff..6a3298f 100755
--- a/configure
+++ b/configure
@@ -3445,7 +3445,7 @@ echores "$_smb"
 echocheck "libquvi support"
 if test "$_libquvi" = auto ; then
     _libquvi=no
-    if pkg_config_add libquvi ; then
+    if pkg_config_add 'libquvi >= 0.4.1' ; then
         _libquvi=yes
     fi
 fi
--
cgit v0.9
diff --git a/cfg-mplayer.h b/cfg-mplayer.h
index b889661..8b07091 100644
--- a/cfg-mplayer.h
+++ b/cfg-mplayer.h
@@ -485,7 +485,7 @@ const m_option_t common_opts[] = {
 
     OPT_MAKE_FLAGS("hr-mp3-seek", hr_mp3_seek, 0),
 
-    OPT_STRING("quvi-format", quvi_format, 0),
+    OPT_STRING("quvi-format", quvi_format, 0, OPTDEF_STR("best")),
 
     { "rawaudio", (void *)&demux_rawaudio_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
     { "rawvideo", (void *)&demux_rawvideo_opts, CONF_TYPE_SUBCONFIG, 0, 0, 0, NULL},
diff --git a/stream/open.c b/stream/open.c
index 91e9ae2..16d0dc3 100644
--- a/stream/open.c
+++ b/stream/open.c
@@ -76,8 +76,7 @@ static const char *resolve_quvi(const char *url, struct MPOpts *opts)
     // That call requires an extra net access. quvi_next_media_url() doesn't
     // seem to do anything useful. So we can't really do anything useful
     // except pass through the user's format setting.
-    quvi_setopt(q, QUVIOPT_FORMAT, opts->quvi_format
-                                   ? opts->quvi_format : "best");
+    quvi_setopt(q, QUVIOPT_FORMAT, opts->quvi_format);
 
     rc = quvi_parse(q, (char *)url, &m);
     if (rc != QUVI_OK) {
--
cgit v0.9