rubytube 0.2.0 → 0.3.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 +4 -4
- data/.rspec +3 -3
- data/.standard.yml +3 -3
- data/CHANGELOG.md +5 -5
- data/CODE_OF_CONDUCT.md +84 -84
- data/Gemfile +12 -12
- data/LICENSE.txt +21 -21
- data/README.md +19 -19
- data/Rakefile +10 -10
- data/lib/rubytube/cipher.rb +371 -370
- data/lib/rubytube/client.rb +173 -173
- data/lib/rubytube/extractor.rb +177 -177
- data/lib/rubytube/innertube.rb +105 -105
- data/lib/rubytube/monostate.rb +5 -5
- data/lib/rubytube/parser.rb +164 -164
- data/lib/rubytube/request.rb +75 -75
- data/lib/rubytube/stream.rb +97 -89
- data/lib/rubytube/stream_format.rb +152 -152
- data/lib/rubytube/stream_query.rb +36 -38
- data/lib/rubytube/utils.rb +24 -24
- data/lib/rubytube/version.rb +5 -5
- data/lib/rubytube.rb +68 -68
- data/sig/rubytube.rbs +4 -4
- metadata +8 -7
@@ -1,152 +1,152 @@
|
|
1
|
-
module RubyTube
|
2
|
-
class StreamFormat
|
3
|
-
PROGRESSIVE_VIDEO = {
|
4
|
-
5 => ["240p", "64kbps"],
|
5
|
-
6 => ["270p", "64kbps"],
|
6
|
-
13 => ["144p", nil],
|
7
|
-
17 => ["144p", "24kbps"],
|
8
|
-
18 => ["360p", "96kbps"],
|
9
|
-
22 => ["720p", "192kbps"],
|
10
|
-
34 => ["360p", "128kbps"],
|
11
|
-
35 => ["480p", "128kbps"],
|
12
|
-
36 => ["240p", nil],
|
13
|
-
37 => ["1080p", "192kbps"],
|
14
|
-
38 => ["3072p", "192kbps"],
|
15
|
-
43 => ["360p", "128kbps"],
|
16
|
-
44 => ["480p", "128kbps"],
|
17
|
-
45 => ["720p", "192kbps"],
|
18
|
-
46 => ["1080p", "192kbps"],
|
19
|
-
59 => ["480p", "128kbps"],
|
20
|
-
78 => ["480p", "128kbps"],
|
21
|
-
82 => ["360p", "128kbps"],
|
22
|
-
83 => ["480p", "128kbps"],
|
23
|
-
84 => ["720p", "192kbps"],
|
24
|
-
85 => ["1080p", "192kbps"],
|
25
|
-
91 => ["144p", "48kbps"],
|
26
|
-
92 => ["240p", "48kbps"],
|
27
|
-
93 => ["360p", "128kbps"],
|
28
|
-
94 => ["480p", "128kbps"],
|
29
|
-
95 => ["720p", "256kbps"],
|
30
|
-
96 => ["1080p", "256kbps"],
|
31
|
-
100 => ["360p", "128kbps"],
|
32
|
-
101 => ["480p", "192kbps"],
|
33
|
-
102 => ["720p", "192kbps"],
|
34
|
-
132 => ["240p", "48kbps"],
|
35
|
-
151 => ["720p", "24kbps"],
|
36
|
-
300 => ["720p", "128kbps"],
|
37
|
-
301 => ["1080p", "128kbps"],
|
38
|
-
}
|
39
|
-
|
40
|
-
DASH_VIDEO = {
|
41
|
-
133 => ["240p", nil],
|
42
|
-
134 => ["360p", nil],
|
43
|
-
135 => ["480p", nil],
|
44
|
-
136 => ["720p", nil],
|
45
|
-
137 => ["1080p", nil],
|
46
|
-
138 => ["2160p", nil],
|
47
|
-
160 => ["144p", nil],
|
48
|
-
167 => ["360p", nil],
|
49
|
-
168 => ["480p", nil],
|
50
|
-
169 => ["720p", nil],
|
51
|
-
170 => ["1080p", nil],
|
52
|
-
212 => ["480p", nil],
|
53
|
-
218 => ["480p", nil],
|
54
|
-
219 => ["480p", nil],
|
55
|
-
242 => ["240p", nil],
|
56
|
-
243 => ["360p", nil],
|
57
|
-
244 => ["480p", nil],
|
58
|
-
245 => ["480p", nil],
|
59
|
-
246 => ["480p", nil],
|
60
|
-
247 => ["720p", nil],
|
61
|
-
248 => ["1080p", nil],
|
62
|
-
264 => ["1440p", nil],
|
63
|
-
266 => ["2160p", nil],
|
64
|
-
271 => ["1440p", nil],
|
65
|
-
272 => ["4320p", nil],
|
66
|
-
278 => ["144p", nil],
|
67
|
-
298 => ["720p", nil],
|
68
|
-
299 => ["1080p", nil],
|
69
|
-
302 => ["720p", nil],
|
70
|
-
303 => ["1080p", nil],
|
71
|
-
308 => ["1440p", nil],
|
72
|
-
313 => ["2160p", nil],
|
73
|
-
315 => ["2160p", nil],
|
74
|
-
330 => ["144p", nil],
|
75
|
-
331 => ["240p", nil],
|
76
|
-
332 => ["360p", nil],
|
77
|
-
333 => ["480p", nil],
|
78
|
-
334 => ["720p", nil],
|
79
|
-
335 => ["1080p", nil],
|
80
|
-
336 => ["1440p", nil],
|
81
|
-
337 => ["2160p", nil],
|
82
|
-
394 => ["144p", nil],
|
83
|
-
395 => ["240p", nil],
|
84
|
-
396 => ["360p", nil],
|
85
|
-
397 => ["480p", nil],
|
86
|
-
398 => ["720p", nil],
|
87
|
-
399 => ["1080p", nil],
|
88
|
-
400 => ["1440p", nil],
|
89
|
-
401 => ["2160p", nil],
|
90
|
-
402 => ["4320p", nil],
|
91
|
-
571 => ["4320p", nil],
|
92
|
-
694 => ["144p", nil],
|
93
|
-
695 => ["240p", nil],
|
94
|
-
696 => ["360p", nil],
|
95
|
-
697 => ["480p", nil],
|
96
|
-
698 => ["720p", nil],
|
97
|
-
699 => ["1080p", nil],
|
98
|
-
700 => ["1440p", nil],
|
99
|
-
701 => ["2160p", nil],
|
100
|
-
702 => ["4320p", nil]
|
101
|
-
}
|
102
|
-
|
103
|
-
DASH_AUDIO = {
|
104
|
-
139 => [nil, "48kbps"],
|
105
|
-
140 => [nil, "128kbps"],
|
106
|
-
141 => [nil, "256kbps"],
|
107
|
-
171 => [nil, "128kbps"],
|
108
|
-
172 => [nil, "256kbps"],
|
109
|
-
249 => [nil, "50kbps"],
|
110
|
-
250 => [nil, "70kbps"],
|
111
|
-
251 => [nil, "160kbps"],
|
112
|
-
256 => [nil, "192kbps"],
|
113
|
-
258 => [nil, "384kbps"],
|
114
|
-
325 => [nil, nil],
|
115
|
-
328 => [nil, nil],
|
116
|
-
}
|
117
|
-
|
118
|
-
ITAGS = {
|
119
|
-
**PROGRESSIVE_VIDEO,
|
120
|
-
**DASH_VIDEO,
|
121
|
-
**DASH_AUDIO
|
122
|
-
}
|
123
|
-
|
124
|
-
HDR = [330, 331, 332, 333, 334, 335, 336, 337]
|
125
|
-
FORMAT_3D = [82, 83, 84, 85, 100, 101, 102]
|
126
|
-
LIVE = [91, 92, 93, 94, 95, 96, 132, 151]
|
127
|
-
|
128
|
-
attr_reader :itag, :resolution, :abr
|
129
|
-
|
130
|
-
def initialize(_itag)
|
131
|
-
@itag = _itag
|
132
|
-
|
133
|
-
@resolution, @abr = ITAGS.fetch(itag)
|
134
|
-
end
|
135
|
-
|
136
|
-
def is_live?
|
137
|
-
!!LIVE[itag]
|
138
|
-
end
|
139
|
-
|
140
|
-
def is_3d?
|
141
|
-
!!FORMAT_3D[itag]
|
142
|
-
end
|
143
|
-
|
144
|
-
def is_hdr?
|
145
|
-
!!HDR[itag]
|
146
|
-
end
|
147
|
-
|
148
|
-
def is_dash?
|
149
|
-
!!DASH_AUDIO[itag] || !!DASH_VIDEO[itag]
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
1
|
+
module RubyTube
|
2
|
+
class StreamFormat
|
3
|
+
PROGRESSIVE_VIDEO = {
|
4
|
+
5 => ["240p", "64kbps"],
|
5
|
+
6 => ["270p", "64kbps"],
|
6
|
+
13 => ["144p", nil],
|
7
|
+
17 => ["144p", "24kbps"],
|
8
|
+
18 => ["360p", "96kbps"],
|
9
|
+
22 => ["720p", "192kbps"],
|
10
|
+
34 => ["360p", "128kbps"],
|
11
|
+
35 => ["480p", "128kbps"],
|
12
|
+
36 => ["240p", nil],
|
13
|
+
37 => ["1080p", "192kbps"],
|
14
|
+
38 => ["3072p", "192kbps"],
|
15
|
+
43 => ["360p", "128kbps"],
|
16
|
+
44 => ["480p", "128kbps"],
|
17
|
+
45 => ["720p", "192kbps"],
|
18
|
+
46 => ["1080p", "192kbps"],
|
19
|
+
59 => ["480p", "128kbps"],
|
20
|
+
78 => ["480p", "128kbps"],
|
21
|
+
82 => ["360p", "128kbps"],
|
22
|
+
83 => ["480p", "128kbps"],
|
23
|
+
84 => ["720p", "192kbps"],
|
24
|
+
85 => ["1080p", "192kbps"],
|
25
|
+
91 => ["144p", "48kbps"],
|
26
|
+
92 => ["240p", "48kbps"],
|
27
|
+
93 => ["360p", "128kbps"],
|
28
|
+
94 => ["480p", "128kbps"],
|
29
|
+
95 => ["720p", "256kbps"],
|
30
|
+
96 => ["1080p", "256kbps"],
|
31
|
+
100 => ["360p", "128kbps"],
|
32
|
+
101 => ["480p", "192kbps"],
|
33
|
+
102 => ["720p", "192kbps"],
|
34
|
+
132 => ["240p", "48kbps"],
|
35
|
+
151 => ["720p", "24kbps"],
|
36
|
+
300 => ["720p", "128kbps"],
|
37
|
+
301 => ["1080p", "128kbps"],
|
38
|
+
}
|
39
|
+
|
40
|
+
DASH_VIDEO = {
|
41
|
+
133 => ["240p", nil],
|
42
|
+
134 => ["360p", nil],
|
43
|
+
135 => ["480p", nil],
|
44
|
+
136 => ["720p", nil],
|
45
|
+
137 => ["1080p", nil],
|
46
|
+
138 => ["2160p", nil],
|
47
|
+
160 => ["144p", nil],
|
48
|
+
167 => ["360p", nil],
|
49
|
+
168 => ["480p", nil],
|
50
|
+
169 => ["720p", nil],
|
51
|
+
170 => ["1080p", nil],
|
52
|
+
212 => ["480p", nil],
|
53
|
+
218 => ["480p", nil],
|
54
|
+
219 => ["480p", nil],
|
55
|
+
242 => ["240p", nil],
|
56
|
+
243 => ["360p", nil],
|
57
|
+
244 => ["480p", nil],
|
58
|
+
245 => ["480p", nil],
|
59
|
+
246 => ["480p", nil],
|
60
|
+
247 => ["720p", nil],
|
61
|
+
248 => ["1080p", nil],
|
62
|
+
264 => ["1440p", nil],
|
63
|
+
266 => ["2160p", nil],
|
64
|
+
271 => ["1440p", nil],
|
65
|
+
272 => ["4320p", nil],
|
66
|
+
278 => ["144p", nil],
|
67
|
+
298 => ["720p", nil],
|
68
|
+
299 => ["1080p", nil],
|
69
|
+
302 => ["720p", nil],
|
70
|
+
303 => ["1080p", nil],
|
71
|
+
308 => ["1440p", nil],
|
72
|
+
313 => ["2160p", nil],
|
73
|
+
315 => ["2160p", nil],
|
74
|
+
330 => ["144p", nil],
|
75
|
+
331 => ["240p", nil],
|
76
|
+
332 => ["360p", nil],
|
77
|
+
333 => ["480p", nil],
|
78
|
+
334 => ["720p", nil],
|
79
|
+
335 => ["1080p", nil],
|
80
|
+
336 => ["1440p", nil],
|
81
|
+
337 => ["2160p", nil],
|
82
|
+
394 => ["144p", nil],
|
83
|
+
395 => ["240p", nil],
|
84
|
+
396 => ["360p", nil],
|
85
|
+
397 => ["480p", nil],
|
86
|
+
398 => ["720p", nil],
|
87
|
+
399 => ["1080p", nil],
|
88
|
+
400 => ["1440p", nil],
|
89
|
+
401 => ["2160p", nil],
|
90
|
+
402 => ["4320p", nil],
|
91
|
+
571 => ["4320p", nil],
|
92
|
+
694 => ["144p", nil],
|
93
|
+
695 => ["240p", nil],
|
94
|
+
696 => ["360p", nil],
|
95
|
+
697 => ["480p", nil],
|
96
|
+
698 => ["720p", nil],
|
97
|
+
699 => ["1080p", nil],
|
98
|
+
700 => ["1440p", nil],
|
99
|
+
701 => ["2160p", nil],
|
100
|
+
702 => ["4320p", nil]
|
101
|
+
}
|
102
|
+
|
103
|
+
DASH_AUDIO = {
|
104
|
+
139 => [nil, "48kbps"],
|
105
|
+
140 => [nil, "128kbps"],
|
106
|
+
141 => [nil, "256kbps"],
|
107
|
+
171 => [nil, "128kbps"],
|
108
|
+
172 => [nil, "256kbps"],
|
109
|
+
249 => [nil, "50kbps"],
|
110
|
+
250 => [nil, "70kbps"],
|
111
|
+
251 => [nil, "160kbps"],
|
112
|
+
256 => [nil, "192kbps"],
|
113
|
+
258 => [nil, "384kbps"],
|
114
|
+
325 => [nil, nil],
|
115
|
+
328 => [nil, nil],
|
116
|
+
}
|
117
|
+
|
118
|
+
ITAGS = {
|
119
|
+
**PROGRESSIVE_VIDEO,
|
120
|
+
**DASH_VIDEO,
|
121
|
+
**DASH_AUDIO
|
122
|
+
}
|
123
|
+
|
124
|
+
HDR = [330, 331, 332, 333, 334, 335, 336, 337]
|
125
|
+
FORMAT_3D = [82, 83, 84, 85, 100, 101, 102]
|
126
|
+
LIVE = [91, 92, 93, 94, 95, 96, 132, 151]
|
127
|
+
|
128
|
+
attr_reader :itag, :resolution, :abr
|
129
|
+
|
130
|
+
def initialize(_itag)
|
131
|
+
@itag = _itag
|
132
|
+
|
133
|
+
@resolution, @abr = ITAGS.fetch(itag)
|
134
|
+
end
|
135
|
+
|
136
|
+
def is_live?
|
137
|
+
!!LIVE[itag]
|
138
|
+
end
|
139
|
+
|
140
|
+
def is_3d?
|
141
|
+
!!FORMAT_3D[itag]
|
142
|
+
end
|
143
|
+
|
144
|
+
def is_hdr?
|
145
|
+
!!HDR[itag]
|
146
|
+
end
|
147
|
+
|
148
|
+
def is_dash?
|
149
|
+
!!DASH_AUDIO[itag] || !!DASH_VIDEO[itag]
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
@@ -1,38 +1,36 @@
|
|
1
|
-
module RubyTube
|
2
|
-
class StreamQuery < Array
|
3
|
-
attr_reader :streams
|
4
|
-
|
5
|
-
def initialize(fmt_streams)
|
6
|
-
super
|
7
|
-
@streams = fmt_streams
|
8
|
-
end
|
9
|
-
|
10
|
-
def filter(file_extension: nil, only_audio: false, only_video: false, resolution: nil)
|
11
|
-
filters = []
|
12
|
-
|
13
|
-
filters << ->(stream) { stream.subtype == file_extension } if file_extension
|
14
|
-
filters << ->(stream) { stream.is_audio? } if only_audio
|
15
|
-
filters << ->(stream) { stream.is_video? } if only_video
|
16
|
-
filters << ->(stream) { stream.resolution == resolution } if resolution
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
end
|
38
|
-
end
|
1
|
+
module RubyTube
|
2
|
+
class StreamQuery < Array
|
3
|
+
attr_reader :streams
|
4
|
+
|
5
|
+
def initialize(fmt_streams)
|
6
|
+
super
|
7
|
+
@streams = fmt_streams
|
8
|
+
end
|
9
|
+
|
10
|
+
def filter(file_extension: nil, only_audio: false, only_video: false, resolution: nil, progressive: false, adaptive: false)
|
11
|
+
filters = []
|
12
|
+
|
13
|
+
filters << ->(stream) { stream.subtype == file_extension } if file_extension
|
14
|
+
filters << ->(stream) { stream.is_audio? } if only_audio
|
15
|
+
filters << ->(stream) { stream.is_video? } if only_video
|
16
|
+
filters << ->(stream) { stream.resolution == resolution } if resolution
|
17
|
+
filters << ->(stream) { stream.is_progressive? } if progressive
|
18
|
+
filters << ->(stream) { stream.is_adaptive? } if adaptive
|
19
|
+
|
20
|
+
r = streams
|
21
|
+
filters.each do |f|
|
22
|
+
r = r.select(&f)
|
23
|
+
end
|
24
|
+
|
25
|
+
StreamQuery.new(r)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_by_itag(itag)
|
29
|
+
streams.find { |s| s.itag == itag }
|
30
|
+
end
|
31
|
+
|
32
|
+
def get_by_resolution(resolution)
|
33
|
+
streams.find { |s| s.resolution == resolution }
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rubytube/utils.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
module RubyTube
|
2
|
-
module Utils
|
3
|
-
module_function
|
4
|
-
|
5
|
-
def regex_search(pattern, string, group)
|
6
|
-
match = string.match(pattern)
|
7
|
-
if match
|
8
|
-
return match[group]
|
9
|
-
end
|
10
|
-
nil
|
11
|
-
end
|
12
|
-
|
13
|
-
def target_directory(output_path = nil)
|
14
|
-
if output_path
|
15
|
-
result = File.join(Dir.pwd, output_path) unless File.absolute_path?(output_path)
|
16
|
-
else
|
17
|
-
result = Dir.pwd
|
18
|
-
end
|
19
|
-
|
20
|
-
FileUtils.mkdir_p(result) unless Dir.exist?(result)
|
21
|
-
result
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
module RubyTube
|
2
|
+
module Utils
|
3
|
+
module_function
|
4
|
+
|
5
|
+
def regex_search(pattern, string, group)
|
6
|
+
match = string.match(pattern)
|
7
|
+
if match
|
8
|
+
return match[group]
|
9
|
+
end
|
10
|
+
nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def target_directory(output_path = nil)
|
14
|
+
if output_path
|
15
|
+
result = File.join(Dir.pwd, output_path) unless File.absolute_path?(output_path)
|
16
|
+
else
|
17
|
+
result = Dir.pwd
|
18
|
+
end
|
19
|
+
|
20
|
+
FileUtils.mkdir_p(result) unless Dir.exist?(result)
|
21
|
+
result
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rubytube/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RubyTube
|
4
|
-
VERSION = "0.
|
5
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RubyTube
|
4
|
+
VERSION = "0.3.0"
|
5
|
+
end
|
data/lib/rubytube.rb
CHANGED
@@ -1,68 +1,68 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'faraday'
|
4
|
-
require 'faraday/follow_redirects'
|
5
|
-
|
6
|
-
require_relative 'rubytube/version'
|
7
|
-
|
8
|
-
require_relative 'rubytube/cipher'
|
9
|
-
require_relative 'rubytube/client'
|
10
|
-
require_relative 'rubytube/extractor'
|
11
|
-
require_relative 'rubytube/innertube'
|
12
|
-
require_relative 'rubytube/monostate'
|
13
|
-
require_relative 'rubytube/parser'
|
14
|
-
require_relative 'rubytube/request'
|
15
|
-
require_relative 'rubytube/stream_format'
|
16
|
-
require_relative 'rubytube/stream_query'
|
17
|
-
require_relative 'rubytube/stream'
|
18
|
-
require_relative 'rubytube/utils'
|
19
|
-
|
20
|
-
module RubyTube
|
21
|
-
class Error < StandardError; end
|
22
|
-
class HTMLParseError < StandardError; end
|
23
|
-
class ExtractError < StandardError; end
|
24
|
-
class MaxRetriesExceeded < StandardError; end
|
25
|
-
class VideoUnavailable < StandardError; end
|
26
|
-
|
27
|
-
class RegexMatchError < StandardError
|
28
|
-
def initialize(caller, pattern)
|
29
|
-
super("Regex match error in #{caller} for pattern #{pattern}")
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
class MembersOnly < StandardError
|
34
|
-
def initialize(video_id)
|
35
|
-
super("Members only video: #{video_id}")
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class RecordingUnavailable < StandardError
|
40
|
-
def initialize(video_id)
|
41
|
-
super("Recording unavailable: #{video_id}")
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class VideoUnavailable < StandardError
|
46
|
-
def initialize(video_id)
|
47
|
-
super("Video unavailable: #{video_id}")
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class VideoPrivate < StandardError
|
52
|
-
def initialize(video_id)
|
53
|
-
super("Video is private: #{video_id}")
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class LiveStreamError < StandardError
|
58
|
-
def initialize(video_id)
|
59
|
-
super("Video is a live stream: #{video_id}")
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class << self
|
64
|
-
def new(url)
|
65
|
-
Client.new(url)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday/follow_redirects'
|
5
|
+
|
6
|
+
require_relative 'rubytube/version'
|
7
|
+
|
8
|
+
require_relative 'rubytube/cipher'
|
9
|
+
require_relative 'rubytube/client'
|
10
|
+
require_relative 'rubytube/extractor'
|
11
|
+
require_relative 'rubytube/innertube'
|
12
|
+
require_relative 'rubytube/monostate'
|
13
|
+
require_relative 'rubytube/parser'
|
14
|
+
require_relative 'rubytube/request'
|
15
|
+
require_relative 'rubytube/stream_format'
|
16
|
+
require_relative 'rubytube/stream_query'
|
17
|
+
require_relative 'rubytube/stream'
|
18
|
+
require_relative 'rubytube/utils'
|
19
|
+
|
20
|
+
module RubyTube
|
21
|
+
class Error < StandardError; end
|
22
|
+
class HTMLParseError < StandardError; end
|
23
|
+
class ExtractError < StandardError; end
|
24
|
+
class MaxRetriesExceeded < StandardError; end
|
25
|
+
class VideoUnavailable < StandardError; end
|
26
|
+
|
27
|
+
class RegexMatchError < StandardError
|
28
|
+
def initialize(caller, pattern)
|
29
|
+
super("Regex match error in #{caller} for pattern #{pattern}")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class MembersOnly < StandardError
|
34
|
+
def initialize(video_id)
|
35
|
+
super("Members only video: #{video_id}")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class RecordingUnavailable < StandardError
|
40
|
+
def initialize(video_id)
|
41
|
+
super("Recording unavailable: #{video_id}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class VideoUnavailable < StandardError
|
46
|
+
def initialize(video_id)
|
47
|
+
super("Video unavailable: #{video_id}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class VideoPrivate < StandardError
|
52
|
+
def initialize(video_id)
|
53
|
+
super("Video is private: #{video_id}")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class LiveStreamError < StandardError
|
58
|
+
def initialize(video_id)
|
59
|
+
super("Video is a live stream: #{video_id}")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class << self
|
64
|
+
def new(url)
|
65
|
+
Client.new(url)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/sig/rubytube.rbs
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module RubyTube
|
2
|
-
VERSION: String
|
3
|
-
# See the writing guide of rbs: https://github.com/ruby/rbs#guides
|
4
|
-
end
|
1
|
+
module RubyTube
|
2
|
+
VERSION: String
|
3
|
+
# See the writing guide of rbs: https://github.com/ruby/rbs#guides
|
4
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubytube
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nightswinger
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
@@ -38,7 +38,7 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
description:
|
41
|
+
description:
|
42
42
|
email:
|
43
43
|
- stardustkids83@gmail.com
|
44
44
|
executables: []
|
@@ -74,7 +74,7 @@ metadata:
|
|
74
74
|
homepage_uri: https://github.com/nightswinger/rubytube
|
75
75
|
source_code_uri: https://github.com/nightswinger/rubytube
|
76
76
|
changelog_uri: https://github.com/nightswinger/rubytube
|
77
|
-
post_install_message:
|
77
|
+
post_install_message:
|
78
78
|
rdoc_options: []
|
79
79
|
require_paths:
|
80
80
|
- lib
|
@@ -90,7 +90,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
90
90
|
version: '0'
|
91
91
|
requirements: []
|
92
92
|
rubygems_version: 3.4.10
|
93
|
-
signing_key:
|
93
|
+
signing_key:
|
94
94
|
specification_version: 4
|
95
|
-
summary:
|
95
|
+
summary: RubyTube is a Ruby adaptation of pytube, enabling simplified downloading
|
96
|
+
and streaming of YouTube videos in a Ruby-friendly manner.
|
96
97
|
test_files: []
|