rubytube 0.1.0 → 0.2.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 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
  - - ">="