rubytube 0.1.0 → 0.2.0

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
  SHA256:
3
- metadata.gz: b12cdf8d2dc05d51f957f67a932c9845cf60dfbecac9b183217a521a57bad129
4
- data.tar.gz: 6ca47773a0d13cf4ea479e628445835a7fccd7de02ea2e0aa7d7151f2f1806fe
3
+ metadata.gz: 4cc85afbbd2fe5d5810318f9cf2c7bc16c0194d10e3919673ae393991b28e473
4
+ data.tar.gz: 8e7c4102505799239962d99f8697cce2457c8d46aef47f46595a65bda35fd6e6
5
5
  SHA512:
6
- metadata.gz: 657e712bcd49674523a2fafa60f1a026b247d18bd8b5ec4390e2e6c95d4145e652016687d2060033e9fa48738c9e4a4a7e8b46abf6117025f6b33ce8a591f89b
7
- data.tar.gz: 6d5ff0d1faf7a6b6951a814430d3b2029f5a72281853d7ef2aaecd70e24e3cab78c7df330dec48e63d73928c8bb9a1d92f16e2ff2bb07cbf515a67cc19dcafd4
6
+ metadata.gz: 01aab01de46c366279769feefeaa6f9bde56da54eaf1febbba266834dc17772c57707272a239aa7b1ec8d2d23bf805ff9d7f9cae77b2182f35aeff442bd22510
7
+ data.tar.gz: e7d289d421ad60bff7e84022ba11926a2108a32cd63be2d3d768550f500cf66b9373ecc6c142b3ed61cbbc454096b7b9e4cf019d8267e57aeee359d09bb17ebd
data/README.md CHANGED
@@ -15,5 +15,5 @@ require 'rubytube'
15
15
  video = RubyTube.new('https://www.youtube.com/watch?v=dQw4w9WgXcQ')
16
16
 
17
17
  # Download video
18
- video.download(filename: 'my_video.mp4')
18
+ video.streams.first.download
19
19
  ```
@@ -140,7 +140,7 @@ module RubyTube
140
140
  mapper
141
141
  end
142
142
 
143
- def reverse(arr)
143
+ def reverse(arr, _ = nil)
144
144
  # Ruby equivalent of JavaScript's Array.reverse()
145
145
  arr.reverse!
146
146
  end
@@ -155,6 +155,7 @@ module RubyTube
155
155
  temp = arr[0]
156
156
  arr[0] = arr[index.to_i % arr.length]
157
157
  arr[index.to_i % arr.length] = temp
158
+ arr
158
159
  end
159
160
 
160
161
  def push(arr, val)
@@ -99,6 +99,14 @@ module RubyTube
99
99
  @streams = StreamQuery.new(fmt_streams)
100
100
  end
101
101
 
102
+ def thumbnail_url
103
+ thumbs = vid_info.fetch('videoDetails', {}).fetch('thumbnail', {}).fetch('thumbnails', [])
104
+
105
+ return thumbs[-1]['url'] if thumbs.size > 0
106
+
107
+ "https://img.youtube.com/vi/#{ideo_id}/maxresdefault.jpg"
108
+ end
109
+
102
110
  def vid_info
103
111
  return @vid_info if @vid_info
104
112
 
@@ -61,6 +61,10 @@ module RubyTube
61
61
  monostate.title
62
62
  end
63
63
 
64
+ def resolution
65
+ stream_format.resolution
66
+ end
67
+
64
68
  private
65
69
 
66
70
  def get_file_path(filename, output_dir, prefix = '')
@@ -77,5 +81,9 @@ module RubyTube
77
81
  def default_filename
78
82
  "#{monostate.title}.#{subtype}"
79
83
  end
84
+
85
+ def stream_format
86
+ @stream_format ||= StreamFormat.new(itag)
87
+ end
80
88
  end
81
89
  end
@@ -0,0 +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
@@ -7,12 +7,13 @@ module RubyTube
7
7
  @streams = fmt_streams
8
8
  end
9
9
 
10
- def filter(file_extension: nil, only_audio: false, only_video: false)
10
+ def filter(file_extension: nil, only_audio: false, only_video: false, resolution: nil)
11
11
  filters = []
12
12
 
13
13
  filters << ->(stream) { stream.subtype == file_extension } if file_extension
14
14
  filters << ->(stream) { stream.is_audio? } if only_audio
15
15
  filters << ->(stream) { stream.is_video? } if only_video
16
+ filters << ->(stream) { stream.resolution == resolution } if resolution
16
17
 
17
18
  r = streams
18
19
  filters.each do |f|
@@ -29,5 +30,9 @@ module RubyTube
29
30
  def get_by_itag(itag)
30
31
  streams.find { |s| s.itag == itag }
31
32
  end
33
+
34
+ def get_by_resolution(resolution)
35
+ streams.find { |s| s.resolution == resolution }
36
+ end
32
37
  end
33
38
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyTube
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
data/lib/rubytube.rb CHANGED
@@ -12,6 +12,7 @@ require_relative 'rubytube/innertube'
12
12
  require_relative 'rubytube/monostate'
13
13
  require_relative 'rubytube/parser'
14
14
  require_relative 'rubytube/request'
15
+ require_relative 'rubytube/stream_format'
15
16
  require_relative 'rubytube/stream_query'
16
17
  require_relative 'rubytube/stream'
17
18
  require_relative 'rubytube/utils'
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.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - nightswinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-09-20 00:00:00.000000000 Z
11
+ date: 2023-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -62,6 +62,7 @@ files:
62
62
  - lib/rubytube/parser.rb
63
63
  - lib/rubytube/request.rb
64
64
  - lib/rubytube/stream.rb
65
+ - lib/rubytube/stream_format.rb
65
66
  - lib/rubytube/stream_query.rb
66
67
  - lib/rubytube/utils.rb
67
68
  - lib/rubytube/version.rb
@@ -81,7 +82,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
81
82
  requirements:
82
83
  - - ">="
83
84
  - !ruby/object:Gem::Version
84
- version: 2.6.0
85
+ version: 2.7.0
85
86
  required_rubygems_version: !ruby/object:Gem::Requirement
86
87
  requirements:
87
88
  - - ">="