rubytube 0.3.0 → 0.4.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.
@@ -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,36 +1,57 @@
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
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
+
36
+ def order(arg)
37
+ case arg
38
+ when Symbol
39
+ field = arg
40
+ dir = :asc
41
+ when Hash
42
+ field = arg.keys.first
43
+ dir = arg[field] == :desc ? :desc : :asc
44
+ end
45
+
46
+ allowed_fields = [:file_size, :itag, :resolution]
47
+ raise InvalidArgumentError unless allowed_fields.include? field
48
+
49
+ r = streams
50
+ r.sort! {|a, b| a.send(field).to_i <=> b.send(field).to_i }
51
+
52
+ r.reverse! if dir == :desc
53
+
54
+ StreamQuery.new(r)
55
+ end
56
+ end
57
+ end
@@ -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
@@ -1,5 +1,5 @@
1
- # frozen_string_literal: true
2
-
3
- module RubyTube
4
- VERSION = "0.3.0"
5
- end
1
+ # frozen_string_literal: true
2
+
3
+ module RubyTube
4
+ VERSION = "0.4.0"
5
+ end
data/lib/rubytube.rb CHANGED
@@ -1,68 +1,69 @@
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
+ class InvalidArgumentError < ArgumentError; end
27
+
28
+ class RegexMatchError < StandardError
29
+ def initialize(caller, pattern)
30
+ super("Regex match error in #{caller} for pattern #{pattern}")
31
+ end
32
+ end
33
+
34
+ class MembersOnly < StandardError
35
+ def initialize(video_id)
36
+ super("Members only video: #{video_id}")
37
+ end
38
+ end
39
+
40
+ class RecordingUnavailable < StandardError
41
+ def initialize(video_id)
42
+ super("Recording unavailable: #{video_id}")
43
+ end
44
+ end
45
+
46
+ class VideoUnavailable < StandardError
47
+ def initialize(video_id)
48
+ super("Video unavailable: #{video_id}")
49
+ end
50
+ end
51
+
52
+ class VideoPrivate < StandardError
53
+ def initialize(video_id)
54
+ super("Video is private: #{video_id}")
55
+ end
56
+ end
57
+
58
+ class LiveStreamError < StandardError
59
+ def initialize(video_id)
60
+ super("Video is a live stream: #{video_id}")
61
+ end
62
+ end
63
+
64
+ class << self
65
+ def new(url)
66
+ Client.new(url)
67
+ end
68
+ end
69
+ 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.3.0
4
+ version: 0.4.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-28 00:00:00.000000000 Z
11
+ date: 2023-09-30 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,7 @@ 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
95
  summary: RubyTube is a Ruby adaptation of pytube, enabling simplified downloading
96
96
  and streaming of YouTube videos in a Ruby-friendly manner.