youtube-dl.rb 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/youtube-dl.rb +10 -0
- data/lib/youtube-dl/options.rb +23 -8
- data/lib/youtube-dl/runner.rb +26 -13
- data/lib/youtube-dl/support.rb +20 -0
- data/lib/youtube-dl/version.rb +1 -1
- data/test/test_helper.rb +7 -2
- data/test/youtube-dl/options_test.rb +18 -2
- data/test/youtube-dl/runner_test.rb +23 -0
- data/test/youtube-dl/support_test.rb +36 -0
- data/test/youtube-dl/youtube-dl_test.rb +32 -8
- data/vendor/bin/youtube-dl +0 -0
- data/vendor/bin/youtube-dl.exe +0 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc95699d01465f5cb0881852a1e8d37e1a9c0794
|
4
|
+
data.tar.gz: ab8b547a79cfa7a04ac8e3c56ab46da1f7df31dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4620ff0634fd5cfad55178b623ccc267e57576f4ab5f79fb8f1f967cd926c3f9e3062f5b26fd994de52c1536813c94ec5be2c0f33fecbc1d8f70d9f3fa403e9
|
7
|
+
data.tar.gz: 5f3f979b7fa7ea34cdf7f170d5a2e2466502ad753704baa11a065016e0ddac735bbab08fbfdacd2d7c0403c95651f02c7d6bde175841d5d473a78d1aa7ae07f6
|
data/lib/youtube-dl.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'youtube-dl/version'
|
2
|
+
require 'youtube-dl/support'
|
2
3
|
require 'youtube-dl/options'
|
3
4
|
require 'youtube-dl/runner'
|
4
5
|
|
5
6
|
module YoutubeDL
|
6
7
|
extend self
|
8
|
+
extend Support
|
7
9
|
|
8
10
|
# Downloads given array of URLs with any options passed
|
9
11
|
#
|
@@ -20,4 +22,12 @@ module YoutubeDL
|
|
20
22
|
end
|
21
23
|
|
22
24
|
alias_method :get, :download
|
25
|
+
|
26
|
+
def extractors
|
27
|
+
Cocaine::CommandLine.new(usable_executable_path_for('youtube-dl'), '--list-extractors').run.split("\n")
|
28
|
+
end
|
29
|
+
|
30
|
+
def binary_version
|
31
|
+
Cocaine::CommandLine.new(usable_executable_path_for('youtube-dl'), '--version').run.chomp
|
32
|
+
end
|
23
33
|
end
|
data/lib/youtube-dl/options.rb
CHANGED
@@ -54,14 +54,19 @@ module YoutubeDL
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
# Symbolizes keys in the option store
|
58
|
-
def
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
57
|
+
# Symbolizes and sanitizes keys in the option store
|
58
|
+
def sanitize_keys!
|
59
|
+
# Symbolize
|
60
|
+
manipulate_keys! { |key_name| key_name.is_a?(Symbol) ? key_name : key_name.to_sym }
|
61
|
+
|
62
|
+
# Underscoreize
|
63
|
+
manipulate_keys! { |key_name| key_name.to_s.tr('-', '_').to_sym }
|
64
|
+
end
|
65
|
+
|
66
|
+
def sanitize_keys
|
67
|
+
safe_copy = self.dup
|
68
|
+
safe_copy.sanitize_keys!
|
69
|
+
safe_copy
|
65
70
|
end
|
66
71
|
|
67
72
|
private
|
@@ -72,5 +77,15 @@ module YoutubeDL
|
|
72
77
|
def paramize(key)
|
73
78
|
key.to_s.tr("_", '-')
|
74
79
|
end
|
80
|
+
|
81
|
+
def manipulate_keys!(&block)
|
82
|
+
@store.keys.each do |old_name|
|
83
|
+
new_name = block.call(old_name)
|
84
|
+
unless new_name == old_name
|
85
|
+
@store[new_name] = @store[old_name]
|
86
|
+
@store.delete(old_name)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
75
90
|
end
|
76
91
|
end
|
data/lib/youtube-dl/runner.rb
CHANGED
@@ -2,6 +2,8 @@ require 'cocaine'
|
|
2
2
|
|
3
3
|
module YoutubeDL
|
4
4
|
class Runner
|
5
|
+
include YoutubeDL::Support
|
6
|
+
|
5
7
|
attr_accessor :url
|
6
8
|
attr_accessor :options
|
7
9
|
attr_accessor :executable_path
|
@@ -13,7 +15,7 @@ module YoutubeDL
|
|
13
15
|
def initialize(url, options=YoutubeDL::Options.new)
|
14
16
|
@url = url
|
15
17
|
@options = YoutubeDL::Options.new(options.to_hash)
|
16
|
-
@executable_path =
|
18
|
+
@executable_path = usable_executable_path_for('youtube-dl')
|
17
19
|
end
|
18
20
|
|
19
21
|
# Returns Cocaine's runner engine
|
@@ -42,6 +44,11 @@ module YoutubeDL
|
|
42
44
|
def run
|
43
45
|
cocaine_line(options_to_commands).run(@options.store)
|
44
46
|
end
|
47
|
+
alias_method :download, :run
|
48
|
+
|
49
|
+
def formats
|
50
|
+
parse_format_output(cocaine_line("--list-formats #{quoted(url)}").run)
|
51
|
+
end
|
45
52
|
|
46
53
|
private
|
47
54
|
|
@@ -50,17 +57,21 @@ module YoutubeDL
|
|
50
57
|
# @return [String] commands ready to do cocaine
|
51
58
|
def options_to_commands
|
52
59
|
commands = []
|
53
|
-
options.each_paramized_key do |key, paramized_key|
|
60
|
+
options.sanitize_keys.each_paramized_key do |key, paramized_key|
|
54
61
|
if options[key].to_s == 'true'
|
55
62
|
commands.push "--#{paramized_key}"
|
56
63
|
else
|
57
64
|
commands.push "--#{paramized_key} :#{key}"
|
58
65
|
end
|
59
66
|
end
|
60
|
-
commands.push url
|
67
|
+
commands.push quoted(url)
|
61
68
|
commands.join(' ')
|
62
69
|
end
|
63
70
|
|
71
|
+
def quoted(url)
|
72
|
+
"\"#{url}\""
|
73
|
+
end
|
74
|
+
|
64
75
|
# Helper for doing lines of cocaine (initializing, auto executable stuff, etc)
|
65
76
|
#
|
66
77
|
# @param command [String] command switches to run
|
@@ -69,18 +80,20 @@ module YoutubeDL
|
|
69
80
|
Cocaine::CommandLine.new(@executable_path, command)
|
70
81
|
end
|
71
82
|
|
72
|
-
#
|
83
|
+
# Do you like voodoo?
|
73
84
|
#
|
74
|
-
# @
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
85
|
+
# @param format_output [String] output from youtube-dl --list-formats
|
86
|
+
# @return [Array] Magic.
|
87
|
+
def parse_format_output(format_output)
|
88
|
+
# 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.
|
89
|
+
this_shit = []
|
90
|
+
format_output.slice(format_output.index('format code')..-1).split("\n").each do |line|
|
91
|
+
a = {}
|
92
|
+
a[:format_code], a[:extension], a[:resolution], a[:note] = line.scan(/\A(\d+)\s+(\w+)\s+(\S+)\s(.*)/)[0]
|
93
|
+
this_shit.push a
|
83
94
|
end
|
95
|
+
this_shit.shift
|
96
|
+
this_shit.map { |gipo| gipo[:note].strip!; gipo }
|
84
97
|
end
|
85
98
|
end
|
86
99
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module YoutubeDL
|
2
|
+
module Support
|
3
|
+
# Some support methods and glue logic.
|
4
|
+
|
5
|
+
# Returns a usable youtube-dl executable (system or vendor)
|
6
|
+
#
|
7
|
+
# @param exe [String] Executable to search for
|
8
|
+
# @return [String] executable path
|
9
|
+
def usable_executable_path_for(exe)
|
10
|
+
system_path = `which #{exe} 2> /dev/null` # This will currently only work on Unix systems. TODO: Add Windows support
|
11
|
+
if $?.exitstatus == 0 # $? is an object with information on that last command run with backticks.
|
12
|
+
system_path.strip
|
13
|
+
else
|
14
|
+
vendor_path = File.absolute_path("#{__FILE__}/../../../vendor/bin/#{exe}")
|
15
|
+
File.chmod(775, vendor_path) unless File.executable?(vendor_path) # Make sure vendor binary is executable
|
16
|
+
vendor_path
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/youtube-dl/version.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -5,18 +5,23 @@ else
|
|
5
5
|
require "codeclimate-test-reporter"
|
6
6
|
CodeClimate::TestReporter.start
|
7
7
|
end
|
8
|
+
|
9
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
10
|
+
|
8
11
|
gem 'minitest'
|
9
12
|
require 'minitest/autorun'
|
10
13
|
require 'minitest/spec'
|
11
14
|
require 'purdytest' # minitest-colorize is broken in minitest version 5
|
12
15
|
require 'pry'
|
16
|
+
require 'fileutils'
|
13
17
|
|
14
|
-
|
18
|
+
require 'youtube-dl'
|
15
19
|
|
16
|
-
TEST_URL = "https://www.youtube.com/watch?v=gvdf5n-zI14"
|
20
|
+
TEST_URL = "https://www.youtube.com/watch?feature=endscreen&v=gvdf5n-zI14"
|
17
21
|
TEST_URL2 = "https://www.youtube.com/watch?v=Mt0PUjh-nDM"
|
18
22
|
TEST_FILENAME = "nope.avi.mp4"
|
19
23
|
TEST_FORMAT = "5"
|
24
|
+
TEST_GLOB = "nope*"
|
20
25
|
|
21
26
|
def remove_downloaded_files
|
22
27
|
Dir.glob("**/nope*").each do |nope|
|
@@ -7,8 +7,8 @@ describe YoutubeDL::Options do
|
|
7
7
|
|
8
8
|
it 'should symbolize option keys' do
|
9
9
|
@options.store['key'] = "value"
|
10
|
-
@options.
|
11
|
-
|
10
|
+
@options.sanitize_keys!
|
11
|
+
assert_equal({key: 'value'}, @options.store)
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should be able to set options with method_missing' do
|
@@ -64,4 +64,20 @@ describe YoutubeDL::Options do
|
|
64
64
|
assert_equal 'some-key', paramized_key
|
65
65
|
end
|
66
66
|
end
|
67
|
+
|
68
|
+
it 'should convert hyphens to underscores in keys' do # See issue #9
|
69
|
+
@options.store[:"hyphenated-key"] = 'value'
|
70
|
+
@options.sanitize_keys!
|
71
|
+
assert_equal({hyphenated_key: 'value'}, @options.to_h)
|
72
|
+
end
|
73
|
+
|
74
|
+
it 'should not modify the original by calling sanitize_keys without bang' do
|
75
|
+
@options.store['some-key'] = "some_value"
|
76
|
+
refute_equal @options.sanitize_keys, @options
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should return instance of Options when calling sanitize_keys' do
|
80
|
+
@options.store['some-key'] = "some_value"
|
81
|
+
assert_instance_of YoutubeDL::Options, @options.sanitize_keys
|
82
|
+
end
|
67
83
|
end
|
@@ -57,4 +57,27 @@ describe YoutubeDL::Runner do
|
|
57
57
|
assert_includes r.to_command, "--some-key"
|
58
58
|
assert_includes r.to_command, "--another-key"
|
59
59
|
end
|
60
|
+
|
61
|
+
it 'might list formats' do
|
62
|
+
formats = @runner.formats
|
63
|
+
assert_instance_of Array, formats
|
64
|
+
assert_instance_of Hash, formats.first
|
65
|
+
assert_equal 4, formats.first.size
|
66
|
+
[:format_code, :resolution, :extension, :note].each do |key|
|
67
|
+
assert_includes formats.first, key
|
68
|
+
assert_includes formats.last, key
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should handle strangely-formatted options correctly' do # See issue #9
|
73
|
+
options = {
|
74
|
+
format: 'bestaudio',
|
75
|
+
:"prefer-ffmpeg" => "true",
|
76
|
+
:"extract-audio" => true,
|
77
|
+
:"audio-format" => "mp3"
|
78
|
+
}
|
79
|
+
|
80
|
+
@runner.options = YoutubeDL::Options.new(options)
|
81
|
+
assert_match /youtube-dl --format 'bestaudio' --prefer-ffmpeg --extract-audio --audio-format 'mp3'/, @runner.to_command
|
82
|
+
end
|
60
83
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative '../test_helper'
|
2
|
+
|
3
|
+
TestKlass = Class.new do
|
4
|
+
include YoutubeDL::Support
|
5
|
+
|
6
|
+
def executable_path
|
7
|
+
usable_executable_path_for 'youtube-dl'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe YoutubeDL::Support do
|
12
|
+
before do
|
13
|
+
@klass = TestKlass.new
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#usable_executable_path' do
|
17
|
+
it 'should detect system executable' do
|
18
|
+
vendor_bin = File.join(Dir.pwd, 'vendor', 'bin', 'youtube-dl')
|
19
|
+
Dir.mktmpdir do |tmpdir|
|
20
|
+
FileUtils.cp vendor_bin, tmpdir
|
21
|
+
|
22
|
+
old_path = ENV["PATH"]
|
23
|
+
ENV["PATH"] = "#{tmpdir}:#{old_path}"
|
24
|
+
|
25
|
+
usable_path = @klass.usable_executable_path_for('youtube-dl')
|
26
|
+
assert_match usable_path, "#{tmpdir}/youtube-dl"
|
27
|
+
|
28
|
+
ENV["PATH"] = old_path
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should not have a newline char in the executable_path' do
|
33
|
+
assert_match /youtube-dl\z/, @klass.executable_path
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,17 +1,41 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
2
|
|
3
3
|
describe YoutubeDL do
|
4
|
-
|
5
|
-
|
4
|
+
describe '.download' do
|
5
|
+
after do
|
6
|
+
remove_downloaded_files
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'should download videos' do
|
10
|
+
YoutubeDL.get TEST_URL, output: TEST_FILENAME, format: TEST_FORMAT
|
11
|
+
assert File.exist? TEST_FILENAME
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should download multiple videos' do
|
15
|
+
YoutubeDL.download [TEST_URL, TEST_URL2]
|
16
|
+
assert_equal Dir.glob('nope*').length, 2
|
17
|
+
end
|
6
18
|
end
|
7
19
|
|
8
|
-
|
9
|
-
|
10
|
-
|
20
|
+
describe '.extractors' do
|
21
|
+
it 'should return an Array of Strings' do
|
22
|
+
extractors = YoutubeDL.extractors
|
23
|
+
assert_instance_of Array, extractors
|
24
|
+
assert_instance_of String, extractors.first
|
25
|
+
end
|
11
26
|
end
|
12
27
|
|
13
|
-
|
14
|
-
|
15
|
-
|
28
|
+
describe '.binary_version' do
|
29
|
+
before do
|
30
|
+
@version = YoutubeDL.binary_version
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should return a string' do
|
34
|
+
assert_instance_of String, @version
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should be a specific format with no newlines' do
|
38
|
+
assert_match /\d+.\d+.\d+\z/, @version
|
39
|
+
end
|
16
40
|
end
|
17
41
|
end
|
data/vendor/bin/youtube-dl
CHANGED
Binary file
|
data/vendor/bin/youtube-dl.exe
CHANGED
Binary file
|
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.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sapslaj
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-08-
|
12
|
+
date: 2015-08-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: cocaine
|
@@ -126,10 +126,12 @@ files:
|
|
126
126
|
- lib/youtube-dl.rb
|
127
127
|
- lib/youtube-dl/options.rb
|
128
128
|
- lib/youtube-dl/runner.rb
|
129
|
+
- lib/youtube-dl/support.rb
|
129
130
|
- lib/youtube-dl/version.rb
|
130
131
|
- test/test_helper.rb
|
131
132
|
- test/youtube-dl/options_test.rb
|
132
133
|
- test/youtube-dl/runner_test.rb
|
134
|
+
- test/youtube-dl/support_test.rb
|
133
135
|
- test/youtube-dl/youtube-dl_test.rb
|
134
136
|
- vendor/bin/youtube-dl
|
135
137
|
- vendor/bin/youtube-dl.exe
|
@@ -162,4 +164,5 @@ test_files:
|
|
162
164
|
- test/test_helper.rb
|
163
165
|
- test/youtube-dl/options_test.rb
|
164
166
|
- test/youtube-dl/runner_test.rb
|
167
|
+
- test/youtube-dl/support_test.rb
|
165
168
|
- test/youtube-dl/youtube-dl_test.rb
|