youtube-dl.rb 0.2.5.2016.02.22 → 0.3.0.2016.02.22

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 51f43f6483211ec511e190c6ada835014640a7c4
4
- data.tar.gz: 6dd64c57860ba8ee5c0bc06ddbea73af32f32ffa
3
+ metadata.gz: 71b0588c9e08589efa63e4e4c843848fe4c7f9b5
4
+ data.tar.gz: e1761a7dd0b9a9a60277c4d9de3faf04b1ac994e
5
5
  SHA512:
6
- metadata.gz: c5a575ac5b4c55ccb544887ca1c31981d4f3d9da9a713876d16fdc12857195e666356f2d98cd039610146adfedf4ea61888f5b697cd2d5dde4adcacf2f9a8c35
7
- data.tar.gz: 2f8d66464647b27da9174e4a0765b5358d51efadc67b0d19349d0c9a3490c1a7a65bbedf15b83f33d33a9ff1c65b92c7e56178dd96fd4e5fc0a45ff9484d2c7b
6
+ metadata.gz: bdc87830ebc48ebb30aaa346717a287f4e71d27ce98fb8b9f8c00476ca4136e04d7a7839abd413fb557163f2267b9f227405f887d65a582962e641fb24c61c1f
7
+ data.tar.gz: 543935c0880e41152a8c7345feea95621cd456d481a4d6b26b6f80bdbf552deb58d2e694958e9318778303bdb826042a4cb5df075362591a3b5a3abbbfb944b9
@@ -3,16 +3,21 @@ before_install:
3
3
  - sudo apt-get update -qq
4
4
 
5
5
  rvm:
6
- - 1.9.3 # EOL, but still supporting
7
- - 2.0.0 # Oldest stable
8
- - 2.2.3 # Current stable
9
- - jruby-head # JRuby
10
- - rbx-2 # Rubinius
6
+ - 2.0.0 # Too old stable
7
+ - 2.1.8 # Old stable
8
+ - 2.2.4 # Previous Stable
9
+ - 2.3.0 # Current stable
10
+ - ruby-head # MRI head
11
+ - jruby # JRuby RVM default
12
+ - jruby-9.0.4.0 # JRuby 9k series
13
+ - jruby-head # JRuby Head
14
+ - rbx-2 # Rubinius stable
11
15
 
12
16
  cache: bundler
13
17
 
14
18
  matrix:
15
19
  allow_failures:
20
+ - rvm: jruby
16
21
  - rvm: jruby-head
17
22
 
18
23
  notifications:
@@ -0,0 +1,7 @@
1
+ youtube-dl.rb hits 1.0 when:
2
+
3
+ * [x] It works on all major Unix platforms
4
+ * [x] It works on Windows
5
+ * [ ] It fully supports all features of youtube-dl in a Ruby-friendly way
6
+ * [ ] It supports logging
7
+ * [ ] [It uses v1.0 Cocaine](https://github.com/thoughtbot/cocaine/blob/master/GOALS)
@@ -1,9 +1,10 @@
1
1
  require 'cocaine'
2
+ require 'json'
3
+ require 'ostruct'
2
4
 
3
5
  require 'youtube-dl/version'
4
6
  require 'youtube-dl/support'
5
7
  require 'youtube-dl/options'
6
- require 'youtube-dl/output'
7
8
  require 'youtube-dl/runner'
8
9
  require 'youtube-dl/video'
9
10
 
@@ -1,5 +1,5 @@
1
1
  module YoutubeDL
2
2
  # Semantic Version as well as the bundled binary version.
3
- # "(semver)(pre-release)(binary-version)"
4
- VERSION = '0.2.5.2016.02.22'
3
+ # "(major).(minor).(teeny).(pre-release).(binary-version)"
4
+ VERSION = '0.3.0.2016.02.22'
5
5
  end
@@ -34,35 +34,60 @@ module YoutubeDL
34
34
  def download
35
35
  raise ArgumentError.new('url cannot be nil') if @url.nil?
36
36
  raise ArgumentError.new('url cannot be empty') if @url.empty?
37
+
37
38
  @download_options = YoutubeDL::Options.new(runner_options)
38
- @last_download_output = YoutubeDL::Runner.new(url, @download_options).run
39
+ set_information_from_json(YoutubeDL::Runner.new(url, @download_options).run)
39
40
  end
40
41
 
41
42
  alias_method :get, :download
42
43
 
43
- # Returns a list of supported formats for the video in the form of
44
- # [{:format_code => '000', :extension => 'avi', :resolution => '320x240', :note => 'More details about the format'}]
44
+ # Returns the expected filename
45
45
  #
46
- # @return [Array] Format list
47
- def formats
48
- @formats ||= YoutubeDL::Output.new(cocaine_line("--list-formats #{quoted(url)}").run).supported_formats
46
+ # @return [String] Filename downloaded to
47
+ def filename
48
+ @information._filename
49
49
  end
50
50
 
51
- # Parses the last downloaded output for a filename and returns it.
51
+ # Metadata information for the video, gotten from --print-json
52
52
  #
53
- # @return [String] Filename downloaded to
54
- def filename
55
- @filename ||= YoutubeDL::Output.new(@last_download_output).filename
53
+ # @return [OpenStruct] information
54
+ def information
55
+ @information || grab_information_without_download
56
+ end
57
+
58
+ # Redirect methods for information getting
59
+ #
60
+ # @param method [Symbol] method name
61
+ # @param args [Array] method arguments
62
+ # @param block [Proc] explict block
63
+ # @return [Object] The value from @information
64
+ def method_missing(method, *args, &block)
65
+ value = information.send(method, *args, &block)
66
+
67
+ if value.nil?
68
+ super
69
+ else
70
+ value
71
+ end
56
72
  end
57
73
 
58
- private
74
+ private
59
75
 
60
76
  # Add in other default options here.
61
77
  def runner_options
62
78
  {
63
79
  color: false,
64
- progress: false
80
+ progress: false,
81
+ print_json: true
65
82
  }.merge(@options)
66
83
  end
84
+
85
+ def set_information_from_json(json) # :nodoc:
86
+ @information = OpenStruct.new(JSON.parse(json))
87
+ end
88
+
89
+ def grab_information_without_download # :nodoc:
90
+ set_information_from_json(YoutubeDL::Runner.new(url, runner_options.merge({skip_download: true})).run)
91
+ end
67
92
  end
68
93
  end
@@ -31,10 +31,6 @@ def remove_downloaded_files
31
31
  end
32
32
  end
33
33
 
34
- def fixture(*keys)
35
- @fixtures ||= YAML.load(File.read(File.join(File.dirname(__FILE__), 'fixtures.yml')))
36
-
37
- last_path = @fixtures
38
- keys.each { |key| last_path = last_path[key] }
39
- last_path
34
+ def travis_ci?
35
+ !!ENV['TRAVIS']
40
36
  end
@@ -27,7 +27,7 @@ describe YoutubeDL::Runner do
27
27
  end
28
28
 
29
29
  it 'should not have a newline char in the executable_path' do
30
- assert_match /youtube-dl\z/, @runner.executable_path
30
+ assert_match(/youtube-dl\z/, @runner.executable_path)
31
31
  end
32
32
  end
33
33
 
@@ -51,17 +51,17 @@ describe YoutubeDL::Runner do
51
51
  it 'should handle true boolean values' do
52
52
  @runner.options.truthy_value = true
53
53
 
54
- assert_match /youtube-dl .*--truthy-value\s--|\"http.*/, @runner.to_command
54
+ assert_match(/youtube-dl .*--truthy-value\s--|\"http.*/, @runner.to_command)
55
55
  end
56
56
 
57
57
  it 'should handle false boolean values' do
58
58
  @runner.options.false_value = false
59
59
 
60
- assert_match /youtube-dl .*--no-false-value\s--|\"http.*/, @runner.to_command
60
+ assert_match(/youtube-dl .*--no-false-value\s--|\"http.*/, @runner.to_command)
61
61
  end
62
62
 
63
63
  it 'should not have newline char in to_command' do
64
- assert_match /youtube-dl\s/, @runner.to_command
64
+ assert_match(/youtube-dl\s/, @runner.to_command)
65
65
  end
66
66
  end
67
67
 
@@ -30,7 +30,7 @@ describe YoutubeDL::Support do
30
30
  end
31
31
 
32
32
  it 'should not have a newline char in the executable_path' do
33
- assert_match /youtube-dl\z/, @klass.executable_path
33
+ assert_match(/youtube-dl\z/, @klass.executable_path)
34
34
  end
35
35
  end
36
36
 
@@ -66,39 +66,6 @@ describe YoutubeDL::Video do
66
66
  end
67
67
  end
68
68
 
69
- describe '#formats' do
70
- before do
71
- @formats = @video.formats
72
- end
73
-
74
- it 'should be an Array' do
75
- assert_instance_of Array, @formats
76
- end
77
-
78
- it 'should be an Array of Hashes' do
79
- @formats.each do |f|
80
- assert_instance_of Hash, f
81
- end
82
- end
83
-
84
- it 'should have a hash size of 4' do
85
- assert_equal 4, @formats.first.size
86
- end
87
-
88
- it 'should include the correct information' do
89
- [:format_code, :resolution, :extension, :note].each do |key|
90
- assert_includes @formats.first, key
91
- assert_includes @formats.last, key
92
- end
93
- end
94
-
95
- it 'should not have any whitespace in the notes' do
96
- @formats.each do |format|
97
- assert_nil format[:note].strip!
98
- end
99
- end
100
- end
101
-
102
69
  describe '#filename' do
103
70
  before do
104
71
  @video.options.configure do |c|
@@ -111,8 +78,24 @@ describe YoutubeDL::Video do
111
78
  assert_equal TEST_FILENAME, @video.filename
112
79
  end
113
80
 
81
+ it 'should be able to be predicted' do
82
+ predicted_filename = @video.information[:_filename]
83
+ @video.download
84
+ assert_equal predicted_filename, @video.filename
85
+ end
86
+
87
+ it 'should not return previously predicted filename' do
88
+ predicted_filename = @video.information[:_filename]
89
+ @video.configure do |c|
90
+ c.output = "#{TEST_FILENAME}.2"
91
+ end
92
+ @video.download
93
+ refute_equal @video.filename, predicted_filename
94
+ end
95
+
114
96
  # Broken on Travis. Output test should be fine.
115
97
  # it 'should give the correct filename when run through ffmpeg' do
98
+ # skip if travis_ci?
116
99
  # @video.configure do |c|
117
100
  # c.output = 'nope-%(id)s.%(ext)s'
118
101
  # c.extract_audio = true
@@ -122,4 +105,32 @@ describe YoutubeDL::Video do
122
105
  # assert_equal "nope-#{TEST_ID}.mp3", @video.filename
123
106
  # end
124
107
  end
108
+
109
+ describe '#information' do
110
+ before do
111
+ @information = @video.information
112
+ end
113
+
114
+ it 'should be an OpenStruct' do
115
+ assert_instance_of OpenStruct, @information
116
+ end
117
+ end
118
+
119
+ describe '#method_missing' do
120
+ it 'should pull values from @information' do
121
+ assert_equal 'youtube', @video.information[:extractor] # Sanity Check
122
+ assert_equal 'youtube', @video.extractor
123
+ end
124
+
125
+ it 'should return correct formats for things' do
126
+ assert_instance_of Array, @video.formats
127
+ assert_instance_of Hash, @video.subtitles
128
+ end
129
+
130
+ it 'should fail if a method does not exist' do
131
+ assert_raises NoMethodError do
132
+ @video.i_dont_exist
133
+ end
134
+ end
135
+ end
125
136
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: youtube-dl.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5.2016.02.22
4
+ version: 0.3.0.2016.02.22
5
5
  platform: ruby
6
6
  authors:
7
7
  - sapslaj
@@ -135,21 +135,19 @@ files:
135
135
  - ".rubocop.yml"
136
136
  - ".rubocop_todo.yml"
137
137
  - ".travis.yml"
138
+ - 1.0_RELEASE_GOALS.md
138
139
  - Gemfile
139
140
  - LICENSE.txt
140
141
  - README.md
141
142
  - Rakefile
142
143
  - lib/youtube-dl.rb
143
144
  - lib/youtube-dl/options.rb
144
- - lib/youtube-dl/output.rb
145
145
  - lib/youtube-dl/runner.rb
146
146
  - lib/youtube-dl/support.rb
147
147
  - lib/youtube-dl/version.rb
148
148
  - lib/youtube-dl/video.rb
149
- - test/fixtures.yml
150
149
  - test/test_helper.rb
151
150
  - test/youtube-dl/options_test.rb
152
- - test/youtube-dl/output_test.rb
153
151
  - test/youtube-dl/runner_test.rb
154
152
  - test/youtube-dl/support_test.rb
155
153
  - test/youtube-dl/video_test.rb
@@ -182,10 +180,8 @@ signing_key:
182
180
  specification_version: 4
183
181
  summary: youtube-dl wrapper for Ruby
184
182
  test_files:
185
- - test/fixtures.yml
186
183
  - test/test_helper.rb
187
184
  - test/youtube-dl/options_test.rb
188
- - test/youtube-dl/output_test.rb
189
185
  - test/youtube-dl/runner_test.rb
190
186
  - test/youtube-dl/support_test.rb
191
187
  - test/youtube-dl/video_test.rb
@@ -1,63 +0,0 @@
1
- module YoutubeDL
2
- # A class of voodoo methods for parsing youtube-dl output
3
- class Output
4
- # @return [String] Whatever youtube-dl spat out.
5
- attr_accessor :output
6
-
7
- # Initialize output parser
8
- #
9
- # @param output [String] Whatever youtube-dl spat out.
10
- # @return [YoutubeDL::Output] self
11
- def initialize(output)
12
- @output = output
13
- end
14
-
15
- # Takes the output of '--list-formats'
16
- #
17
- # @return [Array] Array of supported formats
18
- def supported_formats
19
- # WARNING: This shit won't be documented or even properly tested. It's almost 3 in the morning and I have no idea what I'm doing.
20
- header_index = output.index('format code')
21
- return nil if header_index.nil?
22
-
23
- formats = []
24
- output.slice(header_index..-1).split("\n").each do |line|
25
- format = {}
26
- format[:format_code], format[:extension], format[:resolution], format[:note] = line.scan(/\A(\d+)\s+(\w+)\s+(\S+)\s(.*)/)[0]
27
- formats.push format
28
- end
29
- formats.shift # The first line is just headers
30
- return [] if formats.first.nil?
31
- formats.map do |format|
32
- format[:note].strip! # Get rid of any trailing whitespace on the note.
33
- format[:format_code] = format[:format_code].to_i # convert format code to integer
34
- format
35
- end
36
- end
37
-
38
- # Takes the output of a download
39
- #
40
- # @return [String] filename saved, nil if no match
41
- def filename
42
- # Check to see if file was already downloaded
43
- if already_downloaded?
44
- output.scan(/\[download\]\s(.*)\shas already been downloaded/)[0][0]
45
- else
46
- if output.include? 'Merging formats into'
47
- output.scan(/Merging formats into \"(.*)\"/)[0][0]
48
- else
49
- output.scan(/\[.*\] Destination:\s(.*)$/).last.last
50
- end
51
- end
52
- rescue NoMethodError # There wasn't a match somewhere. Kill it with fire
53
- nil
54
- end
55
-
56
- # Takes the output of a download
57
- #
58
- # @return [Boolean] Has the file already been downloaded?
59
- def already_downloaded?
60
- output.include? 'has already been downloaded'
61
- end
62
- end
63
- end
@@ -1,65 +0,0 @@
1
- ---
2
- :output:
3
- :download: |
4
- [youtube] gvdf5n-zI14: Downloading webpage
5
- [youtube] gvdf5n-zI14: Downloading video info webpage
6
- [youtube] gvdf5n-zI14: Extracting video information
7
- [youtube] gvdf5n-zI14: Downloading DASH manifest
8
- [youtube] gvdf5n-zI14: Downloading DASH manifest
9
- [download] Destination: nope.avi-gvdf5n-zI14.mp4
10
- [download] 100% of 1.31MiB in 00:00
11
- :download_ffmpeg: |
12
- [youtube] gvdf5n-zI14: Downloading webpage
13
- [youtube] gvdf5n-zI14: Downloading video info webpage
14
- [youtube] gvdf5n-zI14: Extracting video information
15
- [youtube] gvdf5n-zI14: Downloading DASH manifest
16
- [youtube] gvdf5n-zI14: Downloading DASH manifest
17
- [download] Destination: nope.avi-gvdf5n-zI14.f136.mp4
18
- [download] 100% of 762.83KiB in 00:04
19
- [download] Destination: nope.avi-gvdf5n-zI14.f141.m4a
20
- [download] 100% of 282.57KiB in 00:00
21
- [ffmpeg] Merging formats into "nope.avi-gvdf5n-zI14.mp4"
22
- Deleting original file nope.avi-gvdf5n-zI14.f136.mp4 (pass -k to keep)
23
- Deleting original file nope.avi-gvdf5n-zI14.f141.m4a (pass -k to keep)
24
- :download_exists: |
25
- [youtube] gvdf5n-zI14: Downloading webpage
26
- [youtube] gvdf5n-zI14: Downloading video info webpage
27
- [youtube] gvdf5n-zI14: Extracting video information
28
- [youtube] gvdf5n-zI14: Downloading DASH manifest
29
- [youtube] gvdf5n-zI14: Downloading DASH manifest
30
- [download] nope.avi-gvdf5n-zI14.mp4 has already been downloaded
31
- [download] 100% of 1.31MiB
32
- :download_audio: |
33
- [youtube] gvdf5n-zI14: Downloading webpage
34
- [youtube] gvdf5n-zI14: Downloading video info webpage
35
- [youtube] gvdf5n-zI14: Extracting video information
36
- [youtube] gvdf5n-zI14: Downloading DASH manifest
37
- [youtube] gvdf5n-zI14: Downloading DASH manifest
38
- [download] Destination: nope-gvdf5n-zI14.m4a
39
- [download] Download completed
40
- [ffmpeg] Correcting container in "nope-gvdf5n-zI14.m4a"
41
- [ffmpeg] Destination: nope-gvdf5n-zI14.mp3
42
- Deleting original file nope-gvdf5n-zI14.m4a (pass -k to keep)
43
- :list_formats: "[youtube] gvdf5n-zI14: Downloading webpage\n[youtube] gvdf5n-zI14:
44
- Downloading video info webpage\n[youtube] gvdf5n-zI14: Extracting video information\n[youtube]
45
- gvdf5n-zI14: Downloading DASH manifest\n[youtube] gvdf5n-zI14: Downloading DASH
46
- manifest\n[info] Available formats for gvdf5n-zI14:\nformat code extension resolution
47
- note\n171 webm audio only DASH audio 120k , vorbis@128k (44100Hz),
48
- 132.26KiB\n140 m4a audio only DASH audio 129k , m4a_dash container,
49
- aac @128k (44100Hz), 142.59KiB\n141 m4a audio only DASH audio
50
- \ 255k , m4a_dash container, aac @256k (44100Hz), 282.57KiB\n242 webm
51
- \ 426x240 DASH video 109k , vp9, 1fps, video only, 118.40KiB\n160 mp4
52
- \ 256x144 DASH video 110k , avc1.4d400c, 12fps, video only, 121.30KiB\n243
53
- \ webm 640x360 DASH video 189k , vp9, 1fps, video only, 200.48KiB\n134
54
- \ mp4 640x360 DASH video 237k , avc1.4d401e, 24fps, video only,
55
- 239.13KiB\n133 mp4 426x240 DASH video 248k , avc1.4d4015,
56
- 24fps, video only, 270.34KiB\n244 webm 854x480 DASH video 311k
57
- , vp9, 1fps, video only, 333.92KiB\n135 mp4 854x480 DASH video
58
- \ 430k , avc1.4d401e, 24fps, video only, 421.60KiB\n247 webm 1280x720
59
- \ DASH video 572k , vp9, 1fps, video only, 596.27KiB\n136 mp4 1280x720
60
- \ DASH video 788k , avc1.4d401f, 24fps, video only, 762.83KiB\n13 3gp
61
- \ unknown small \n17 3gp 176x144 small , mp4a.40.2,
62
- mp4v.20.3\n36 3gp 320x240 small , mp4a.40.2, mp4v.20.3\n5
63
- \ flv 400x240 small \n43 webm 640x360 medium
64
- , vorbis, vp8.0\n18 mp4 640x360 medium , mp4a.40.2, avc1.42001E\n22
65
- \ mp4 1280x720 hd720 , mp4a.40.2, avc1.64001F (best)\n"
@@ -1,75 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- describe YoutubeDL::Output do
4
- describe '#initialize' do
5
- it 'should set the output variable' do
6
- sample_output = "some sample output\n\n"
7
- parser = YoutubeDL::Output.new(sample_output)
8
- assert_equal sample_output, parser.output
9
- end
10
- end
11
-
12
- describe '#supported_formats' do
13
- before do
14
- @parser = YoutubeDL::Output.new(fixture(:output, :list_formats))
15
- end
16
-
17
- it 'should find a match given the correct output' do
18
- refute_nil @parser.supported_formats
19
- end
20
-
21
- it 'should find the correct match and in the correct format' do
22
- assert_includes(@parser.supported_formats, {format_code: 5, extension: 'flv', resolution: '400x240', note: 'small'})
23
- end
24
-
25
- it 'should return nil if no match or wrong log format' do
26
- bad_parser = YoutubeDL::Output.new(fixture(:output, :download))
27
- assert_nil bad_parser.supported_formats
28
- end
29
- end
30
-
31
- describe '#filename' do
32
- before do
33
- @parser_download = YoutubeDL::Output.new(fixture(:output, :download))
34
- @parser_download_ffmpeg = YoutubeDL::Output.new(fixture(:output, :download_ffmpeg))
35
- @parser_download_exists = YoutubeDL::Output.new(fixture(:output, :download_exists))
36
- @parser_download_audio = YoutubeDL::Output.new(fixture(:output, :download_audio))
37
- end
38
-
39
- it 'should find a match given the correct output' do
40
- refute_nil @parser_download.filename
41
- refute_nil @parser_download_ffmpeg.filename
42
- refute_nil @parser_download_exists.filename
43
- refute_nil @parser_download_audio.filename
44
- end
45
-
46
- it 'should find the correct match' do
47
- assert_equal 'nope.avi-gvdf5n-zI14.mp4', @parser_download.filename
48
- assert_equal 'nope.avi-gvdf5n-zI14.mp4', @parser_download_ffmpeg.filename
49
- assert_equal 'nope.avi-gvdf5n-zI14.mp4', @parser_download_exists.filename
50
- assert_equal 'nope-gvdf5n-zI14.mp3', @parser_download_audio.filename
51
- end
52
-
53
- it 'should return nil if no match or wrong log format' do
54
- bad_parser = YoutubeDL::Output.new(fixture(:output, :list_formats))
55
- assert_nil bad_parser.filename
56
- end
57
- end
58
-
59
- describe '#already_downloaded?' do
60
- before do
61
- @parser_download = YoutubeDL::Output.new(fixture(:output, :download))
62
- @parser_download_ffmpeg = YoutubeDL::Output.new(fixture(:output, :download_ffmpeg))
63
- @parser_download_exists = YoutubeDL::Output.new(fixture(:output, :download_exists))
64
- end
65
-
66
- it 'should return a truthy value if true' do
67
- assert @parser_download_exists.already_downloaded?
68
- end
69
-
70
- it 'should return a falsy value if false' do
71
- refute @parser_download.already_downloaded?
72
- refute @parser_download_ffmpeg.already_downloaded?
73
- end
74
- end
75
- end