quvi 0.1.0 → 0.1.1

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: df4e609a0c156ac9c3078066ad4085bda633d045
4
- data.tar.gz: 19b0599fbe1c32905cfa0037a55ba2c709785615
3
+ metadata.gz: 7799db0a8f553674ce22b344391c3110f7bd163b
4
+ data.tar.gz: fe8160860cef0c0b29499d369d28ed55c04493ca
5
5
  SHA512:
6
- metadata.gz: f1f209a0b4fe186e218a788bb9552cdc037bbebb0f04d13d3cda2f424af0284c35dd0bc2e65f295c3c416ba3cffc80fda27bdd8d72f677e99ca7445307007880
7
- data.tar.gz: c76c59aa666494cee48d5e3522df85dbfe280835d48c1721be25add4483f3cd23f851caa03c589af688d651ccc8ef57e1cb0354d9d2101ddb73d676d7ba3aa62
6
+ metadata.gz: a6945f1f216df6367803226a2fdec01d01bd37cad973e20d3594714bb5439420b0c44c72ebf7ef06ce1121f96882132208e59f2419c3768737b2f071cebb4956
7
+ data.tar.gz: 094dab6020a0e4cc7759209e2ccf233b8d8aaaf789aac30bd1b4f36b5fb3ed1201bc7c5010a25029f5ffd30b73b67bcd7d2897269641451c9135efa79c4d7bc8
@@ -24,11 +24,126 @@ Or install it yourself as:
24
24
 
25
25
  ## Usage
26
26
 
27
- TODO: Write usage instructions here
27
+ Create an handle which basically encapsulates HTTP session
28
+
29
+ handle = Quvi::Handle.new(user_agent: "Chrome/33.0.1712.4")
30
+
31
+ Pass an media URL to `Quvi::Handle#parse_media` method (note how it tags the best available stream)
32
+
33
+ handle.parse_media("https://www.youtube.com/watch?v=9PLY4TWo7f0")
34
+ # {:id=>"9PLY4TWo7f0",
35
+ # :title=>"Big Ruby 2014 - Keynote by Keavy McMinn",
36
+ # :thumbnail_url=>"https://i1.ytimg.com/vi/9PLY4TWo7f0/default.jpg",
37
+ # :duration_ms=>1627000,
38
+ # :streams=>
39
+ # [{:id=>"hd720_mp4_i22_720p", :best=>true, :video_height=>720, :video_width=>1280, :video_encoding=>"avc1.64001F", :audio_encoding=>"mp4a.40.2", :container=>"mp4", :url=> "http://..."},
40
+ # {:id=>"medium_mp4_i18_360p", :video_height=>360, :video_width=>640, :video_encoding=>"avc1.42001E", :audio_encoding=>"mp4a.40.2", :container=>"mp4", :url=> "http://..."},
41
+ # {:id=>"small_flv_i05_240p", :video_height=>240, :video_width=>320, :video_encoding=>"", :audio_encoding=>"", :container=>"flv", :url=> "http://..."},
42
+ # {:id=>"small_3gpp_i36_240p", :video_height=>240, :video_width=>320, :video_encoding=>"mp4v.20.3", :audio_encoding=>"mp4a.40.2", :container=>"3gpp", :url=> "http://..."},
43
+ # {:id=>"small_3gpp_i17_144p", :video_height=>144, :video_width=>176, :video_encoding=>"mp4v.20.3", :audio_encoding=>"mp4a.40.2", :container=>"3gpp", :url=> "http://..."}]}
44
+
45
+ It can parse playlists too with `Quvi::Handle#parse_playlist`
46
+
47
+ handle.parse_playlist("https://www.youtube.com/playlist?list=PLE7tQUdRKcyYqVZi0LIbAsfwv_Jr-rrua")
48
+ # {:id=>"PLE7tQUdRKcyYqVZi0LIbAsfwv_Jr-rrua",
49
+ # :title=>"Cascadia Ruby 2013",
50
+ # :thumbnail_url=>"https://i.ytimg.com/vi/MkoTmq3I4DM/hqdefault.jpg",
51
+ # :media=>
52
+ # [{:url=>"https://www.youtube.com/watch?v=MkoTmq3I4DM&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 Coding and The Mozart Effect by PJ Hagerty", :duration_ms=>1775000},
53
+ # {:url=>"https://www.youtube.com/watch?v=0y2Sok9ikj8&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 Taking Ruby to the Movies by Jeremy Hinegardner", :duration_ms=>1776000},
54
+ # {:url=>"https://www.youtube.com/watch?v=euDXpKwtCHY&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 Tell Us Another Story Grandpa: Lessons Learned over 16 Years as a Developer", :duration_ms=>1643000},
55
+ # {:url=>"https://www.youtube.com/watch?v=FsBgpvDnUSk&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 Ruby Robotics by Josh Adams and Robby Clements", :duration_ms=>1378000},
56
+ # {:url=>"https://www.youtube.com/watch?v=rpeugzat2o4&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 We All Make Mistakes: Learning from Gaffes in the Ruby Community by Nick Cox", :duration_ms=>1868000},
57
+ # {:url=>"https://www.youtube.com/watch?v=g4LJNZKyqOw&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 We're sorry, but something went wrong by Aja Hammerly", :duration_ms=>1909000},
58
+ # {:url=>"https://www.youtube.com/watch?v=x9Kazz5-tDo&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 The hacker's guide to usability testing by Starr Horne", :duration_ms=>1487000},
59
+ # {:url=>"https://www.youtube.com/watch?v=iSug6CgxWxc&feature=youtube_gdata", :title=> "Cascadia Ruby 2013 Sentiment Analysis using Support Vector Machines in Ruby by Matthew Kirk", :duration_ms=>1518000}]}
60
+
61
+ Youtube isn't the only site it supports. You can fine full list of them in the [repository](https://github.com/legatvs/libquvi-scripts) or write your own using guides on the [libquvi-scripts site](http://quvi.sourceforge.net/r/dev/contributing/). Also it is quite easy to enumerate all accessible scripts from the ruby:
62
+
63
+ handle.each_script do |script|
64
+ p script
65
+ end
66
+ # {:sha1=>"cc2d07c64cb329d9d14209ce464030a2eb152dc6", :filepath=>"/usr/share/libquvi-scripts/0.9/scan/youtube.lua", :type=>"scan"}
67
+ # {:sha1=>"e145e40e56f27805278ae6a36352bab3225d4d77", :filepath=>"/usr/share/libquvi-scripts/0.9/scan/vzaar.lua", :type=>"scan"}
68
+ # {:sha1=>"a6e55279aaee3bbe6b372fc55b8a6f7751e34ace", :filepath=>"/usr/share/libquvi-scripts/0.9/playlist/youtube.lua", :type=>"playlist", :domains=>["youtube.com"]}
69
+ # {:sha1=>"ddc1d5aaa691131d3ef30cf1b9b482d38cacee51", :filepath=>"/usr/share/libquvi-scripts/0.9/playlist/soundcloud.lua", :type=>"playlist", :domains=>["soundcloud.com"]}
70
+ # {:sha1=>"32e0ead26b603ee10f1deba49e2352d14edd4d67", :filepath=>"/usr/share/libquvi-scripts/0.9/media/audioboo.lua", :type=>"media", :domains=>["audioboo.fm"]}
71
+ # {:sha1=>"a0879b74362cfba9dcaebc3ffe16d034368ed60c", :filepath=>"/usr/share/libquvi-scripts/0.9/media/liveleak.lua", :type=>"media", :domains=>["liveleak.com"]}
72
+ # {:sha1=>"a1427a3a019877eafa5f5f5960d086c609ab8d1f", :filepath=>"/usr/share/libquvi-scripts/0.9/media/bikeradar.lua", :type=>"media", :domains=>["bikeradar.com"]}
73
+ # {:sha1=>"7fd0a857cf904d1547c119444e2ce29297accec1", :filepath=>"/usr/share/libquvi-scripts/0.9/media/sapo.lua", :type=>"media", :domains=>["videos.sapo.pt"]}
74
+ # {:sha1=>"b935fbe2881e0869028741f630fb7471413aeffe", :filepath=>"/usr/share/libquvi-scripts/0.9/media/sevenload.lua", :type=>"media", :domains=>["sevenload.com"]}
75
+ # {:sha1=>"60a7e893e8aa5f71ed1cc5e4a4fb4f89992f85e5", :filepath=>"/usr/share/libquvi-scripts/0.9/media/ina.lua", :type=>"media", :domains=>["ina.fr"]}
76
+ # {:sha1=>"452aa94dc655090d6c30929335bf5ad73d29e92f", :filepath=>"/usr/share/libquvi-scripts/0.9/media/metacafe.lua", :type=>"media", :domains=>["metacafe.com"]}
77
+ # {:sha1=>"2db42ea01ff5700210e814806712c4892a61bda0", :filepath=>"/usr/share/libquvi-scripts/0.9/media/dailymotion.lua", :type=>"media", :domains=>["dailymotion.com"]}
78
+ # {:sha1=>"cfed259fa8f679ca5ac49f6d34144128df716939", :filepath=>"/usr/share/libquvi-scripts/0.9/media/ardmediathek.lua", :type=>"media", :domains=>["ardmediathek.de"]}
79
+ # {:sha1=>"e1ba6e629a11518c3548c69f3723118a7ac1062d", :filepath=>"/usr/share/libquvi-scripts/0.9/media/clipfish.lua", :type=>"media", :domains=>["clipfish.de"]}
80
+ # {:sha1=>"1853a56b0bd5a18d47f967e875b55c6aa3a7dbb7", :filepath=>"/usr/share/libquvi-scripts/0.9/media/101greatgoals.lua", :type=>"media", :domains=>["101greatgoals.com"]}
81
+ # {:sha1=>"363c01107cd71f360c3f8723ecef7bfba2ab3d73", :filepath=>"/usr/share/libquvi-scripts/0.9/media/gaskrank.lua", :type=>"media", :domains=>["gaskrank.tv"]}
82
+ # {:sha1=>"911433da47662580548e93f0529babcce0863853", :filepath=>"/usr/share/libquvi-scripts/0.9/media/theonion.lua", :type=>"media", :domains=>["theonion.com"]}
83
+ # {:sha1=>"0ae3b44c7b01ae3c7e2e7f4a16cd0dcec79f567a", :filepath=>"/usr/share/libquvi-scripts/0.9/media/youtube.lua", :type=>"media", :domains=>["youtube.com"]}
84
+ # {:sha1=>"69974caa7b3fcdb74b6bd791a6edb610b3dfe4ee", :filepath=>"/usr/share/libquvi-scripts/0.9/media/majestyc.lua", :type=>"media", :domains=>["tube.majestyc.net"]}
85
+ # {:sha1=>"a785a669d1bd2c1c253b64fb1f20937e26ef3609", :filepath=>"/usr/share/libquvi-scripts/0.9/media/videobash.lua", :type=>"media", :domains=>["videobash.com"]}
86
+ # {:sha1=>"c3c0e34cb0191570be0ba4cd1499fd2afa44f165", :filepath=>"/usr/share/libquvi-scripts/0.9/media/vzaar.lua", :type=>"media", :domains=>["vzaar.com"]}
87
+ # {:sha1=>"74a632c1a25807b5b094a1c90d614ec865af482d", :filepath=>"/usr/share/libquvi-scripts/0.9/media/spiegel.lua", :type=>"media", :domains=>["spiegel.de"]}
88
+ # {:sha1=>"3720f0611d54ccd665d13603896de9aa903f72f0", :filepath=>"/usr/share/libquvi-scripts/0.9/media/videa.lua", :type=>"media", :domains=>["videa.hu"]}
89
+ # {:sha1=>"d9268d6b51da1bb23932e79c5bb4a1a15c3588c4", :filepath=>"/usr/share/libquvi-scripts/0.9/media/ted.lua", :type=>"media", :domains=>["ted.com"]}
90
+ # {:sha1=>"7aebe106d954b9317f5f7b4a365dacc50933610a", :filepath=>"/usr/share/libquvi-scripts/0.9/media/soundcloud.lua", :type=>"media", :domains=>["soundcloud.com"]}
91
+ # {:sha1=>"a88735d1e0cc3d61ce45af300008ad97f49b85d3", :filepath=>"/usr/share/libquvi-scripts/0.9/media/tvlux.lua", :type=>"media", :domains=>["tvlux.be"]}
92
+ # {:sha1=>"419af1632ffd971505f61bc8d04945a271bb45d6", :filepath=>"/usr/share/libquvi-scripts/0.9/media/1tvru.lua", :type=>"media", :domains=>["1tv.ru"]}
93
+ # {:sha1=>"d3a8db790e9f4e2b55bd0cf88543d8d38e873d4a", :filepath=>"/usr/share/libquvi-scripts/0.9/media/arte.lua", :type=>"media", :domains=>["arte.tv"]}
94
+ # {:sha1=>"73bcf38c7cb2927a0b8adf29a7b750bc4b21a733", :filepath=>"/usr/share/libquvi-scripts/0.9/media/funnyordie.lua", :type=>"media", :domains=>["funnyordie.com"]}
95
+ # {:sha1=>"c027be9b93e362e451ad54adef2d14c6d4e458af", :filepath=>"/usr/share/libquvi-scripts/0.9/media/tapuz.lua", :type=>"media", :domains=>["flix.tapuz.co.il"]}
96
+ # {:sha1=>"3505d6777a8e03ea3bcf01cf113e2c8c9eeec1fd", :filepath=>"/usr/share/libquvi-scripts/0.9/media/cbsnews.lua", :type=>"media", :domains=>["cbsnews.com"]}
97
+ # {:sha1=>"780399daec55e457c766cde986b35884c79a2e52", :filepath=>"/usr/share/libquvi-scripts/0.9/media/guardian.lua", :type=>"media", :domains=>["theguardian.com", "guardian.co.uk"]}
98
+ # {:sha1=>"a82c60a96067232b3b8cdcd864e16e9509fe947d", :filepath=>"/usr/share/libquvi-scripts/0.9/media/tagtele.lua", :type=>"media", :domains=>["tagtele.com"]}
99
+ # {:sha1=>"1d353ae17cf6d7df597fefbfd81cf8c85e282b7d", :filepath=>"/usr/share/libquvi-scripts/0.9/media/publicsenat.lua", :type=>"media", :domains=>["publicsenat.fr"]}
100
+ # {:sha1=>"46000b58b080b4cb8500634087d19ea54dadab63", :filepath=>"/usr/share/libquvi-scripts/0.9/media/lego.lua", :type=>"media", :domains=>["lego.com"]}
101
+ # {:sha1=>"69ee55e3e10c73700c06695055363a6f8a064e5d", :filepath=>"/usr/share/libquvi-scripts/0.9/media/senat.lua", :type=>"media", :domains=>["videos.senat.fr"]}
102
+ # {:sha1=>"c286f739d77da6e1245ab415be7016cf5fad7e0b", :filepath=>"/usr/share/libquvi-scripts/0.9/media/myspass.lua", :type=>"media", :domains=>["myspass.de"]}
103
+ # {:sha1=>"ea16f366f98582d0d52af56cbd3dbe847930dfc3", :filepath=>"/usr/share/libquvi-scripts/0.9/subtitle/youtube.lua", :type=>"subtitle", :domains=>["youtube.com"]}
104
+ # {:sha1=>"7411739ec618bbf3486d98cc0fd64962cfee1239", :filepath=>"/usr/share/libquvi-scripts/0.9/subtitle/export/subrip.lua", :type=>"subtitle_export", :export_format=>"srt"}
105
+
106
+ To check if particular URL supported by the library, you can use
107
+ `Quvi::Handle#supports?` like this:
108
+
109
+ require 'quvi'
110
+ handle = Quvi::Handle.new
111
+ handle.supports?("https://soundcloud.com/meta-ex/burning-the-moroder-lamp")
112
+ # => false
113
+ handle.supports?("https://soundcloud.com/meta-ex/burning-the-moroder-lamp", online: true)
114
+ # => true
115
+ handle.supports?("https://www.youtube.com/watch?v=S6-L4xws9l0", type: :playlist)
116
+ # => false
117
+ handle.supports?("https://www.youtube.com/watch?v=S6-L4xws9l0", type: :media)
118
+ # => true
119
+ handle.supports?("https://www.youtube.com/watch?v=S6-L4xws9l0", type: :any)
120
+ # => true
121
+
122
+ There are also couple of handy methods defined on `Quvi` module, to
123
+ simplify argument parsing. First `Quvi.parse_multiple` accepts array
124
+ of URLs, dynamically detects type and parse each of them using simple
125
+ thread pool. As far as most of the Quvi work is IO, ruby VM can
126
+ perfectly optimize it.
127
+
128
+
129
+ ## Issues
130
+
131
+ Please use [github issues](https://github.com/avsej/quvi.rb/issues) to
132
+ report any bugs or ideas. Also do not forget to include the version of
133
+ the library into report:
134
+
135
+ $ ruby -rpp -rrubygems -rquvi -e'pp Quvi::VERSION.to_h'
136
+ {:version=>"0.1.0",
137
+ :quvi_version=>"v0.9.2",
138
+ :quvi_configuration=> "--build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-static=no --disable-rpath",
139
+ :quvi_build_cc_cflags=> "gcc, -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic",
140
+ :quvi_build_target=>"x86_64-redhat-linux-gnu",
141
+ :quvi_build_time=>"2013-08-27 04:11:40 +0000"}
142
+
28
143
 
29
144
  ## Contributing
30
145
 
31
- 1. Fork it ( http://github.com/avsej/quvi.rb/fork )
146
+ 1. Fork it ([http://github.com/avsej/quvi.rb/fork](http://github.com/avsej/quvi.rb/fork))
32
147
  2. Create your feature branch (`git checkout -b my-new-feature`)
33
148
  3. Commit your changes (`git commit -am 'Add some feature'`)
34
149
  4. Push to the branch (`git push origin my-new-feature`)
@@ -237,12 +237,12 @@ VALUE qv_handle_each_script(VALUE self)
237
237
  #define set_property(key, id) \
238
238
  s = NULL; \
239
239
  quvi_script_get(handle->q, types[i], id, &s); \
240
- if (s) { rb_hash_aset(script, key, rb_external_str_new_cstr(s)); }
240
+ if (s && s[0] != '\0') { rb_hash_aset(script, key, rb_external_str_new_cstr(s)); }
241
241
  set_property(qv_sym_sha1, QUVI_SCRIPT_PROPERTY_SHA1);
242
242
  set_property(qv_sym_filepath, QUVI_SCRIPT_PROPERTY_FILEPATH);
243
243
  rb_hash_aset(script, qv_sym_type, type_names[i]);
244
244
  quvi_script_get(handle->q, types[i], QUVI_SCRIPT_PROPERTY_DOMAINS, &s);
245
- if (strlen(s) > 0) {
245
+ if (s && s[0] != '\0') {
246
246
  VALUE domains = rb_external_str_new_cstr(s);
247
247
  rb_hash_aset(script, qv_sym_domains, rb_str_split(domains, ","));
248
248
  }
@@ -2,7 +2,7 @@ module Quvi
2
2
  module VERSION
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- PATCH = 0
5
+ PATCH = 1
6
6
  FULL = [MAJOR, MINOR, PATCH].join(".").freeze
7
7
 
8
8
  def self.to_str
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quvi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey Avseyev