rubytube 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4cc85afbbd2fe5d5810318f9cf2c7bc16c0194d10e3919673ae393991b28e473
4
- data.tar.gz: 8e7c4102505799239962d99f8697cce2457c8d46aef47f46595a65bda35fd6e6
3
+ metadata.gz: 81f3bc458444b3f15a63612fa193c5fbeb0fba3f2ca73a8b3936453fcf269d58
4
+ data.tar.gz: ba175f34390fd95271cacc283bec75370b543b1a0edebad81e67a4188ca94790
5
5
  SHA512:
6
- metadata.gz: 01aab01de46c366279769feefeaa6f9bde56da54eaf1febbba266834dc17772c57707272a239aa7b1ec8d2d23bf805ff9d7f9cae77b2182f35aeff442bd22510
7
- data.tar.gz: e7d289d421ad60bff7e84022ba11926a2108a32cd63be2d3d768550f500cf66b9373ecc6c142b3ed61cbbc454096b7b9e4cf019d8267e57aeee359d09bb17ebd
6
+ metadata.gz: 9652bd73252dee11c51d1fd322813660c447e1e9c0b6a863be9e4f277309927ff8eb4d2910a991c055c8b11db833986129e5c74988653a4b50441f2e546a5804
7
+ data.tar.gz: 49593099d2603a922a9db02f8147e3b69d1674af663174e4d8bb6f8e7839b7b388036072f402d053699b2aee43b5b0bb6dd1789f248f10905f5aa30615b4f1f1
data/README.md CHANGED
@@ -16,4 +16,11 @@ video = RubyTube.new('https://www.youtube.com/watch?v=dQw4w9WgXcQ')
16
16
 
17
17
  # Download video
18
18
  video.streams.first.download
19
+
20
+ # Filtering streams
21
+ video.streams
22
+ .filter(progressive: true, file_extension: 'mp4')
23
+ .order(resolution: :desc)
24
+ .first
25
+ .download
19
26
  ```
@@ -351,7 +351,8 @@ module RubyTube
351
351
  plan_regex = Regexp.new(transform_start)
352
352
  match = raw_code.match(plan_regex)
353
353
 
354
- transform_plan_raw = Parser.find_object_from_startpoint(raw_code, match.end(0) - 1)
354
+ # transform_plan_raw = Parser.find_object_from_startpoint(raw_code, match.end(0) - 1)
355
+ transform_plan_raw = js
355
356
  step_regex = %r"c\[(\d+)\]\(c\[(\d+)\](,c(\[(\d+)\]))?\)"
356
357
  matches = transform_plan_raw.scan(step_regex)
357
358
  transform_steps = []
@@ -57,6 +57,14 @@ module RubyTube
57
57
  type == 'video'
58
58
  end
59
59
 
60
+ def is_adaptive?
61
+ codecs.size % 2 == 1
62
+ end
63
+
64
+ def is_progressive?
65
+ !is_adaptive?
66
+ end
67
+
60
68
  def title
61
69
  monostate.title
62
70
  end
@@ -7,24 +7,22 @@ module RubyTube
7
7
  @streams = fmt_streams
8
8
  end
9
9
 
10
- def filter(file_extension: nil, only_audio: false, only_video: false, resolution: nil)
10
+ def filter(file_extension: nil, only_audio: false, only_video: false, resolution: nil, progressive: false, adaptive: false)
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
16
  filters << ->(stream) { stream.resolution == resolution } if resolution
17
+ filters << ->(stream) { stream.is_progressive? } if progressive
18
+ filters << ->(stream) { stream.is_adaptive? } if adaptive
17
19
 
18
20
  r = streams
19
21
  filters.each do |f|
20
22
  r = r.select(&f)
21
23
  end
22
24
 
23
- r
24
- end
25
-
26
- def first
27
- streams.first
25
+ StreamQuery.new(r)
28
26
  end
29
27
 
30
28
  def get_by_itag(itag)
@@ -34,5 +32,26 @@ module RubyTube
34
32
  def get_by_resolution(resolution)
35
33
  streams.find { |s| s.resolution == resolution }
36
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
37
56
  end
38
57
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RubyTube
4
- VERSION = "0.2.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/rubytube.rb CHANGED
@@ -23,6 +23,7 @@ module RubyTube
23
23
  class ExtractError < StandardError; end
24
24
  class MaxRetriesExceeded < StandardError; end
25
25
  class VideoUnavailable < StandardError; end
26
+ class InvalidArgumentError < ArgumentError; end
26
27
 
27
28
  class RegexMatchError < StandardError
28
29
  def initialize(caller, pattern)
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.2.0
4
+ version: 0.4.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-25 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: Write a longer description or delete this line.
41
+ description:
42
42
  email:
43
43
  - stardustkids83@gmail.com
44
44
  executables: []
@@ -92,5 +92,6 @@ requirements: []
92
92
  rubygems_version: 3.4.10
93
93
  signing_key:
94
94
  specification_version: 4
95
- summary: Write a short summary, because RubyGems requires one.
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: []