quvi 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 359166f0e88ec5af25871328dc81fb6d14ff8175
4
- data.tar.gz: 9a9bf7bd5272d39b38061deb82b5b9f68793cbe0
3
+ metadata.gz: df4e609a0c156ac9c3078066ad4085bda633d045
4
+ data.tar.gz: 19b0599fbe1c32905cfa0037a55ba2c709785615
5
5
  SHA512:
6
- metadata.gz: 0e9ef3ee76330c57f7bd133c11b78988a7b1abbfe56fe6ee8f235e674169eb05812a776f0caebe22281c5436e39fe75376096ad897da1c8c8cd8ef517194a34f
7
- data.tar.gz: 80bcdf1cc1b99a2cfc45467a6531cccd636d37ac0f607ad648c2faa9f8b540c1d62ba08fd60b49ee017f3016926fcb3d821cf32d43302ff01bf07bcf1c7f8d37
6
+ metadata.gz: f1f209a0b4fe186e218a788bb9552cdc037bbebb0f04d13d3cda2f424af0284c35dd0bc2e65f295c3c416ba3cffc80fda27bdd8d72f677e99ca7445307007880
7
+ data.tar.gz: c76c59aa666494cee48d5e3522df85dbfe280835d48c1721be25add4483f3cd23f851caa03c589af688d651ccc8ef57e1cb0354d9d2101ddb73d676d7ba3aa62
@@ -14,14 +14,33 @@ VALUE qv_eError;
14
14
 
15
15
  VALUE qv_DEFAULT_USER_AGENT;
16
16
 
17
- ID qv_sym_any;
18
- ID qv_sym_autoproxy;
19
- ID qv_sym_media;
20
- ID qv_sym_online;
21
- ID qv_sym_playlist;
22
- ID qv_sym_subtitle;
23
- ID qv_sym_type;
24
- ID qv_sym_user_agent;
17
+ VALUE qv_sym_any;
18
+ VALUE qv_sym_autoproxy;
19
+ VALUE qv_sym_media;
20
+ VALUE qv_sym_online;
21
+ VALUE qv_sym_playlist;
22
+ VALUE qv_sym_subtitle;
23
+ VALUE qv_sym_type;
24
+ VALUE qv_sym_user_agent;
25
+ VALUE qv_sym_export_format;
26
+ VALUE qv_sym_filepath;
27
+ VALUE qv_sym_domains;
28
+ VALUE qv_sym_sha1;
29
+ VALUE qv_sym_title;
30
+ VALUE qv_sym_id;
31
+ VALUE qv_sym_thumbnail_url;
32
+ VALUE qv_sym_start_time_ms;
33
+ VALUE qv_sym_duration_ms;
34
+ VALUE qv_sym_video_height;
35
+ VALUE qv_sym_video_width;
36
+ VALUE qv_sym_video_encoding;
37
+ VALUE qv_sym_video_bitrate_kbit_s;
38
+ VALUE qv_sym_audio_encoding;
39
+ VALUE qv_sym_audio_bitrate_kbit_s;
40
+ VALUE qv_sym_container;
41
+ VALUE qv_sym_url;
42
+ VALUE qv_sym_streams;
43
+ VALUE qv_sym_best;
25
44
 
26
45
  typedef struct qv_handle_st
27
46
  {
@@ -45,21 +64,21 @@ static void qv_handle_free(void *ptr)
45
64
  }
46
65
 
47
66
  #define qv_raise(handle, message) qv_raise_at(handle, message, __FILE__, __LINE__)
48
- static void qv_raise_at(qv_handle_t *handle, const char *message, const char *file, int line)
67
+ static void qv_raise_at(qv_handle_t *handle, VALUE message, const char *file, int line)
49
68
  {
50
69
  VALUE exc, str;
51
70
  const char *qv_msg;
52
71
  char buf[10];
53
72
  int qv_code;
54
73
 
55
- str = rb_str_buf_new_cstr(message ? message : "");
74
+ str = rb_str_new_shared(message);
56
75
  qv_msg = quvi_errmsg(handle->q);
57
76
  qv_code = quvi_errcode(handle->q);
58
77
  if (qv_msg) {
59
- rb_str_buf_cat_ascii(str, ": \"");
78
+ snprintf(buf, 10, ": (0x%02x) \"", qv_code);
79
+ rb_str_buf_cat_ascii(str, buf);
60
80
  rb_str_buf_cat_ascii(str, qv_msg);
61
81
  rb_str_buf_cat_ascii(str, "\" ");
62
- snprintf(buf, 10, "\" (%d)", qv_code);
63
82
  }
64
83
  rb_str_buf_cat_ascii(str, " at ");
65
84
  rb_str_buf_cat_ascii(str, file);
@@ -101,7 +120,7 @@ VALUE qv_handle_init(int argc, VALUE *argv, VALUE self)
101
120
  }
102
121
  handle->q = quvi_new();
103
122
  if (quvi_ok(handle->q) == QUVI_FALSE) {
104
- qv_raise(handle, "unable create quvi_t handle");
123
+ qv_raise(handle, rb_str_new_cstr("unable create quvi_t handle"));
105
124
  }
106
125
  rb_funcall2(self, rb_intern("autoproxy="), 1, &autoproxy);
107
126
  rb_funcall2(self, rb_intern("user_agent="), 1, &user_agent);
@@ -131,7 +150,7 @@ VALUE qv_handle_user_agent_set(VALUE self, VALUE val)
131
150
  typedef struct qv_supports_params_st
132
151
  {
133
152
  qv_handle_t *handle;
134
- VALUE url;
153
+ char *url;
135
154
  QuviSupportsType type;
136
155
  QuviSupportsMode mode;
137
156
  QuviBoolean res;
@@ -140,22 +159,23 @@ typedef struct qv_supports_params_st
140
159
  static void* qv_handle_supports_p_nogvl(void *data1)
141
160
  {
142
161
  qv_supports_params_t *params = data1;
143
- params->res = quvi_supports(params->handle->q, RSTRING_PTR(params->url),
162
+ params->res = quvi_supports(params->handle->q, params->url,
144
163
  params->mode, params->type);
145
164
  return 0;
146
165
  }
147
166
 
148
167
  VALUE qv_handle_supports_p(int argc, VALUE *argv, VALUE self)
149
168
  {
150
- VALUE opts;
169
+ VALUE opts, url;
151
170
  qv_supports_params_t params;
152
171
 
172
+ rb_scan_args(argc, argv, "11", &url, &opts);
173
+
153
174
  params.handle = DATA_PTR(self);
154
175
  params.type = QUVI_SUPPORTS_TYPE_ANY;
155
176
  params.mode = QUVI_SUPPORTS_MODE_OFFLINE;
156
177
  params.res = QUVI_FALSE;
157
- rb_scan_args(argc, argv, "11", &params.url, &opts);
158
- Check_Type(params.url, T_STRING);
178
+ params.url = StringValueCStr(url);
159
179
  if (opts != Qnil) {
160
180
  VALUE arg;
161
181
  Check_Type(opts, T_HASH);
@@ -174,7 +194,7 @@ VALUE qv_handle_supports_p(int argc, VALUE *argv, VALUE self)
174
194
  } else if (arg == qv_sym_any) {
175
195
  params.type = QUVI_SUPPORTS_TYPE_ANY;
176
196
  } else {
177
- rb_raise(rb_eArgError, "unknown type: %s", StringValuePtr(arg));
197
+ rb_raise(rb_eArgError, "unknown type: %s", StringValueCStr(arg));
178
198
  }
179
199
  }
180
200
  }
@@ -182,12 +202,184 @@ VALUE qv_handle_supports_p(int argc, VALUE *argv, VALUE self)
182
202
  if (params.res == QUVI_TRUE) {
183
203
  return Qtrue;
184
204
  }
185
- if (quvi_errcode(params.handle) != QUVI_ERROR_NO_SUPPORT) {
186
- qv_raise(params.handle, "unable to check if URL supported");
205
+ if (quvi_errcode(params.handle->q) != QUVI_ERROR_NO_SUPPORT) {
206
+ qv_raise(params.handle, rb_sprintf("unable to check if URL supported (url=%s)", params.url));
187
207
  }
188
208
  return Qfalse;
189
209
  }
190
210
 
211
+ VALUE qv_handle_each_script(VALUE self)
212
+ {
213
+ qv_handle_t *handle = DATA_PTR(self);
214
+ QuviScriptType types[] = {
215
+ QUVI_SCRIPT_TYPE_SCAN,
216
+ QUVI_SCRIPT_TYPE_PLAYLIST,
217
+ QUVI_SCRIPT_TYPE_MEDIA,
218
+ QUVI_SCRIPT_TYPE_SUBTITLE,
219
+ QUVI_SCRIPT_TYPE_SUBTITLE_EXPORT
220
+ };
221
+ VALUE type_names[] = {
222
+ rb_str_freeze(rb_external_str_new_cstr("scan")),
223
+ rb_str_freeze(rb_external_str_new_cstr("playlist")),
224
+ rb_str_freeze(rb_external_str_new_cstr("media")),
225
+ rb_str_freeze(rb_external_str_new_cstr("subtitle")),
226
+ rb_str_freeze(rb_external_str_new_cstr("subtitle_export"))
227
+ };
228
+ size_t i;
229
+
230
+ RETURN_ENUMERATOR(self, 0, NULL);
231
+
232
+ for (i = 0; i < sizeof(types) / sizeof(QuviScriptType); ++i) {
233
+ while (quvi_script_next(handle->q, types[i]) == QUVI_TRUE) {
234
+ VALUE script = rb_hash_new();
235
+ char *s;
236
+
237
+ #define set_property(key, id) \
238
+ s = NULL; \
239
+ quvi_script_get(handle->q, types[i], id, &s); \
240
+ if (s) { rb_hash_aset(script, key, rb_external_str_new_cstr(s)); }
241
+ set_property(qv_sym_sha1, QUVI_SCRIPT_PROPERTY_SHA1);
242
+ set_property(qv_sym_filepath, QUVI_SCRIPT_PROPERTY_FILEPATH);
243
+ rb_hash_aset(script, qv_sym_type, type_names[i]);
244
+ quvi_script_get(handle->q, types[i], QUVI_SCRIPT_PROPERTY_DOMAINS, &s);
245
+ if (strlen(s) > 0) {
246
+ VALUE domains = rb_external_str_new_cstr(s);
247
+ rb_hash_aset(script, qv_sym_domains, rb_str_split(domains, ","));
248
+ }
249
+ set_property(qv_sym_export_format, QUVI_SCRIPT_PROPERTY_EXPORT_FORMAT);
250
+ #undef set_property
251
+
252
+ rb_yield(script);
253
+ }
254
+ }
255
+ return Qnil;
256
+ }
257
+
258
+ typedef struct qv_media_new_params_st
259
+ {
260
+ qv_handle_t *handle;
261
+ char *url;
262
+ quvi_media_t res;
263
+ } qv_media_new_params_t;
264
+
265
+ static void* qv_media_new_nogvl(void *data1)
266
+ {
267
+ qv_media_new_params_t *params = data1;
268
+ params->res = quvi_media_new(params->handle->q, params->url);
269
+ return 0;
270
+ }
271
+
272
+ VALUE qv_handle_parse_media(VALUE self, VALUE url)
273
+ {
274
+ qv_media_new_params_t params;
275
+ VALUE media, streams, stream;
276
+ double d;
277
+ char *s, *best;
278
+
279
+ params.handle = DATA_PTR(self);
280
+ params.url = StringValueCStr(url);
281
+
282
+ rb_thread_call_without_gvl(qv_media_new_nogvl, &params, RUBY_UBF_IO, 0);
283
+ if (quvi_ok(params.handle->q) == QUVI_FALSE) {
284
+ qv_raise(params.handle, rb_sprintf("unable create quvi_media_t handle (url=%s)", params.url));
285
+ }
286
+ media = rb_hash_new();
287
+ #define set_property_str(item, key, id) \
288
+ s = NULL; \
289
+ quvi_media_get(params.res, id, &s); \
290
+ if (s) { rb_hash_aset(item, key, rb_external_str_new_cstr(s)); }
291
+ #define set_property_int(item, key, id) \
292
+ d = -1; \
293
+ quvi_media_get(params.res, id, &d); \
294
+ if (d > 0) { rb_hash_aset(item, key, INT2NUM((int)d)); }
295
+ set_property_str(media, qv_sym_id, QUVI_MEDIA_PROPERTY_ID);
296
+ set_property_str(media, qv_sym_title, QUVI_MEDIA_PROPERTY_TITLE);
297
+ set_property_str(media, qv_sym_thumbnail_url, QUVI_MEDIA_PROPERTY_THUMBNAIL_URL);
298
+ set_property_int(media, qv_sym_start_time_ms, QUVI_MEDIA_PROPERTY_START_TIME_MS);
299
+ set_property_int(media, qv_sym_duration_ms, QUVI_MEDIA_PROPERTY_DURATION_MS);
300
+ streams = rb_hash_aset(media, qv_sym_streams, rb_ary_new());
301
+ quvi_media_stream_choose_best(params.res);
302
+ quvi_media_get(params.res, QUVI_MEDIA_STREAM_PROPERTY_ID, &best);
303
+ quvi_media_stream_reset(params.res);
304
+ while (quvi_media_stream_next(params.res) == QUVI_TRUE) {
305
+ stream = rb_hash_new();
306
+ set_property_str(stream, qv_sym_id, QUVI_MEDIA_STREAM_PROPERTY_ID);
307
+ if (strcmp(best, s) == 0) {
308
+ rb_hash_aset(stream, qv_sym_best, Qtrue);
309
+ }
310
+ set_property_int(stream, qv_sym_video_height, QUVI_MEDIA_STREAM_PROPERTY_VIDEO_HEIGHT);
311
+ set_property_int(stream, qv_sym_video_width, QUVI_MEDIA_STREAM_PROPERTY_VIDEO_WIDTH);
312
+ set_property_str(stream, qv_sym_video_encoding, QUVI_MEDIA_STREAM_PROPERTY_VIDEO_ENCODING);
313
+ set_property_int(stream, qv_sym_video_bitrate_kbit_s, QUVI_MEDIA_STREAM_PROPERTY_VIDEO_BITRATE_KBIT_S);
314
+ set_property_str(stream, qv_sym_audio_encoding, QUVI_MEDIA_STREAM_PROPERTY_AUDIO_ENCODING);
315
+ set_property_int(stream, qv_sym_audio_bitrate_kbit_s, QUVI_MEDIA_STREAM_PROPERTY_AUDIO_BITRATE_KBIT_S);
316
+ set_property_str(stream, qv_sym_container, QUVI_MEDIA_STREAM_PROPERTY_CONTAINER);
317
+ set_property_str(stream, qv_sym_url, QUVI_MEDIA_STREAM_PROPERTY_URL);
318
+ rb_ary_push(streams, stream);
319
+ }
320
+
321
+ #undef set_property_str
322
+ #undef set_property_int
323
+ quvi_media_free(params.res);
324
+
325
+ return media;
326
+ }
327
+
328
+ typedef struct qv_playlist_new_params_st
329
+ {
330
+ qv_handle_t *handle;
331
+ char *url;
332
+ quvi_playlist_t res;
333
+ } qv_playlist_new_params_t;
334
+
335
+ static void* qv_playlist_new_nogvl(void *data1)
336
+ {
337
+ qv_media_new_params_t *params = data1;
338
+ params->res = quvi_playlist_new(params->handle->q, params->url);
339
+ return 0;
340
+ }
341
+
342
+ VALUE qv_handle_parse_playlist(VALUE self, VALUE url)
343
+ {
344
+ qv_playlist_new_params_t params;
345
+ VALUE playlist, media, medium;
346
+ char *s;
347
+ double d;
348
+
349
+ params.handle = DATA_PTR(self);
350
+ params.url = StringValueCStr(url);
351
+ rb_thread_call_without_gvl(qv_playlist_new_nogvl, &params, RUBY_UBF_IO, 0);
352
+ if (quvi_ok(params.handle->q) == QUVI_FALSE) {
353
+ qv_raise(params.handle, rb_sprintf("unable create quvi_media_t handle (url=%s)", params.url));
354
+ }
355
+ playlist = rb_hash_new();
356
+ #define set_property_str(item, key, id) \
357
+ s = NULL; \
358
+ quvi_playlist_get(params.res, id, &s); \
359
+ if (s) { rb_hash_aset(item, key, rb_external_str_new_cstr(s)); }
360
+ #define set_property_int(item, key, id) \
361
+ d = -1; \
362
+ quvi_playlist_get(params.res, id, &d); \
363
+ if (d > 0) { rb_hash_aset(item, key, INT2NUM((int)d)); }
364
+
365
+ set_property_str(playlist, qv_sym_id, QUVI_PLAYLIST_PROPERTY_ID);
366
+ set_property_str(playlist, qv_sym_title, QUVI_PLAYLIST_PROPERTY_TITLE);
367
+ set_property_str(playlist, qv_sym_thumbnail_url, QUVI_PLAYLIST_PROPERTY_THUMBNAIL_URL);
368
+ media = rb_hash_aset(playlist, qv_sym_media, rb_ary_new());
369
+ while (quvi_playlist_media_next(params.res) == QUVI_TRUE) {
370
+ medium = rb_hash_new();
371
+ set_property_str(medium, qv_sym_url, QUVI_PLAYLIST_MEDIA_PROPERTY_URL);
372
+ set_property_str(medium, qv_sym_title, QUVI_PLAYLIST_MEDIA_PROPERTY_TITLE);
373
+ set_property_int(medium, qv_sym_duration_ms, QUVI_PLAYLIST_MEDIA_PROPERTY_DURATION_MS);
374
+ rb_ary_push(media, medium);
375
+ }
376
+ #undef set_property_str
377
+ #undef set_property_int
378
+
379
+ quvi_playlist_free(params.res);
380
+ return playlist;
381
+ }
382
+
191
383
  void init_quvi_handle()
192
384
  {
193
385
  qv_cHandle = rb_define_class_under(qv_mQuvi, "Handle", rb_cObject);
@@ -196,6 +388,9 @@ void init_quvi_handle()
196
388
  rb_define_method(qv_cHandle, "supports?", qv_handle_supports_p, -1);
197
389
  rb_define_method(qv_cHandle, "autoproxy=", qv_handle_autoproxy_set, 1);
198
390
  rb_define_method(qv_cHandle, "user_agent=", qv_handle_user_agent_set, 1);
391
+ rb_define_method(qv_cHandle, "each_script", qv_handle_each_script, 0);
392
+ rb_define_method(qv_cHandle, "parse_media", qv_handle_parse_media, 1);
393
+ rb_define_method(qv_cHandle, "parse_playlist", qv_handle_parse_playlist, 1);
199
394
 
200
395
  qv_DEFAULT_USER_AGENT = rb_const_get(qv_cHandle, rb_intern("DEFAULT_USER_AGENT"));
201
396
  }
@@ -210,6 +405,25 @@ void init_symbols()
210
405
  qv_sym_subtitle = ID2SYM(rb_intern("subtitle"));
211
406
  qv_sym_type = ID2SYM(rb_intern("type"));
212
407
  qv_sym_user_agent = ID2SYM(rb_intern("user_agent"));
408
+ qv_sym_export_format = ID2SYM(rb_intern("export_format"));
409
+ qv_sym_filepath = ID2SYM(rb_intern("filepath"));
410
+ qv_sym_domains = ID2SYM(rb_intern("domains"));
411
+ qv_sym_sha1 = ID2SYM(rb_intern("sha1"));
412
+ qv_sym_title = ID2SYM(rb_intern("title"));
413
+ qv_sym_id = ID2SYM(rb_intern("id"));
414
+ qv_sym_thumbnail_url = ID2SYM(rb_intern("thumbnail_url"));
415
+ qv_sym_start_time_ms = ID2SYM(rb_intern("start_time_ms"));
416
+ qv_sym_duration_ms = ID2SYM(rb_intern("duration_ms"));
417
+ qv_sym_video_height = ID2SYM(rb_intern("video_height"));
418
+ qv_sym_video_width = ID2SYM(rb_intern("video_width"));
419
+ qv_sym_video_encoding = ID2SYM(rb_intern("video_encoding"));
420
+ qv_sym_video_bitrate_kbit_s = ID2SYM(rb_intern("video_bitrate_kbit_s"));
421
+ qv_sym_audio_encoding = ID2SYM(rb_intern("audio_encoding"));
422
+ qv_sym_audio_bitrate_kbit_s = ID2SYM(rb_intern("audio_bitrate_kbit_s"));
423
+ qv_sym_container = ID2SYM(rb_intern("container"));
424
+ qv_sym_url = ID2SYM(rb_intern("url"));
425
+ qv_sym_streams = ID2SYM(rb_intern("streams"));
426
+ qv_sym_best = ID2SYM(rb_intern("best"));
213
427
  }
214
428
 
215
429
  void Init_quvi_ext()
@@ -2,3 +2,61 @@ require "quvi/version"
2
2
  require "quvi/error"
3
3
  require "quvi/handle"
4
4
  require "quvi_ext"
5
+
6
+ require 'thread'
7
+ require 'monitor'
8
+
9
+ module Quvi
10
+ def self.parse(*urls)
11
+ options = urls.last.is_a?(Hash) ? urls.pop : {}
12
+ res = parse_multiple(urls, options)
13
+ urls.size == 1 ? res.first : res
14
+ end
15
+
16
+ def self.parse_multiple(urls, options = {})
17
+ return [] if urls.empty?
18
+ num_threads = options.fetch(:threads) { 2 }
19
+ num_threads = [num_threads, urls.size].min
20
+ tasks = Queue.new
21
+ tasks.extend(MonitorMixin)
22
+ urls.each do |url|
23
+ tasks.push([:media, url])
24
+ tasks.push([:playlist, url])
25
+ end
26
+ tasks_tbd = tasks.size
27
+ done = tasks.new_cond
28
+ results = Queue.new
29
+ threads = Array.new(num_threads) do
30
+ Thread.new do
31
+ handle = Quvi::Handle.new(options)
32
+ loop do
33
+ type, url = tasks.pop
34
+ begin
35
+ if res = handle.parse(url, options.merge(:type => type))
36
+ results.push([url, res])
37
+ end
38
+ rescue Quvi::Error => ex
39
+ results.push([url, ex])
40
+ ensure
41
+ tasks.synchronize do
42
+ tasks_tbd -= 1
43
+ done.signal
44
+ break if tasks_tbd <= 0
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ tasks.synchronize do
51
+ done.wait_while do
52
+ tasks_tbd > 0
53
+ end
54
+ end if tasks_tbd > 0
55
+ res = []
56
+ until results.empty?
57
+ u, r = results.pop
58
+ res[urls.index(u)] = r
59
+ end
60
+ res
61
+ end
62
+ end
@@ -2,6 +2,16 @@ module Quvi
2
2
  class Handle
3
3
  DEFAULT_USER_AGENT = "Mozilla/5.0".freeze
4
4
 
5
- attr_accessor :user_agent, :allow_cookies, :user_agent
5
+ attr_accessor :user_agent, :allow_cookies
6
+
7
+ def parse(url, options = {})
8
+ online = options.fetch(:online) { true }
9
+ type = options.fetch(:type) { true }
10
+ if supports?(url, :type => type, :online => online)
11
+ res = send("parse_#{type}", url)
12
+ res[:type] = type
13
+ res
14
+ end
15
+ end
6
16
  end
7
- end
17
+ end
@@ -1,8 +1,8 @@
1
1
  module Quvi
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 0
5
- PATCH = 1
4
+ MINOR = 1
5
+ PATCH = 0
6
6
  FULL = [MAJOR, MINOR, PATCH].join(".").freeze
7
7
 
8
8
  def self.to_str
metadata CHANGED
@@ -1,41 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quvi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Avseyev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-03 00:00:00.000000000 Z
11
+ date: 2014-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.5'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.5'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  description: This is the wrapper for libquvi library, which allows to extract media
@@ -47,7 +47,7 @@ extensions:
47
47
  - ext/quvi_ext/extconf.rb
48
48
  extra_rdoc_files: []
49
49
  files:
50
- - .gitignore
50
+ - ".gitignore"
51
51
  - Gemfile
52
52
  - Guardfile
53
53
  - LICENSE
@@ -72,17 +72,17 @@ require_paths:
72
72
  - lib
73
73
  required_ruby_version: !ruby/object:Gem::Requirement
74
74
  requirements:
75
- - - '>='
75
+ - - ">="
76
76
  - !ruby/object:Gem::Version
77
77
  version: '0'
78
78
  required_rubygems_version: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  requirements: []
84
84
  rubyforge_project:
85
- rubygems_version: 2.0.14
85
+ rubygems_version: 2.2.2
86
86
  signing_key:
87
87
  specification_version: 4
88
88
  summary: The library to parse the media stream properties.