youtube-dl.rb 0.2.5.2016.02.22 → 0.3.0.2016.02.22

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: 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