vidload 0.2.1 → 0.3.1

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: e25ffa5a4bdbfdadd4ee261da31fab7f78e15f6865196bec9ed6824d827918cc
4
- data.tar.gz: 85cbad777cffda334cf26c8992fe42b8a209eaed2b6210cea733e1f54f7cadcb
3
+ metadata.gz: b09d979bfbf863a31dc59989acb918041c1132e0001975383f4baf3d51f34681
4
+ data.tar.gz: 524ba3271e3c7e79505d7185d547c3c9413b0097e1be173ca8100f994fa36eaa
5
5
  SHA512:
6
- metadata.gz: 898294dbb222d1d84f31cde9b4b30f7689de6cd18bacf2dd452496346be24f83245d24f52c1125291256020533e5b759091f4c67a7d7a9b47ed7457416a29633
7
- data.tar.gz: 6bfae7fb0047df91c7aecfc6cc0f6302f895b6872e52dedad7751a2fbb39f97ee29966a437a5f1ba8b1dfd8324c34704e846cd930e1768324e8a2f0d64343bde
6
+ metadata.gz: 9549bd83c953a50dac61429be0118eab75b1a63feef3cfeb727efd4d45f2022a5b34bddcc5998eb29872a1269537dbe04a14c718e7bea1849dd53ca818e590f2
7
+ data.tar.gz: c0b17cc85d56bb53d5cd36a9f947c217ce38dd7e7e7c15aabd5f31b4cc6dbf6f1c6d41ec5a3fced8a7872667d8e88a69aff694c3326968dfeb228784461fdea5
data/lib/vidload/cli.rb CHANGED
@@ -23,10 +23,27 @@ module Vidload
23
23
  process_mp2t(params)
24
24
  end
25
25
 
26
+ desc 'mp4 VIDEO_URL', 'download a mp4 video'
27
+ method_option :video_name, type: :string, required: false
28
+ method_option :video_hub_url, type: :string, required: true
29
+ method_option :playwright_cli_path, type: :string, required: true
30
+ def mp4(video_url)
31
+ params = {
32
+ video_url: video_url,
33
+ **options
34
+ }
35
+
36
+ process_mp4(params)
37
+ end
38
+
26
39
  private
27
40
 
28
41
  def process_mp2t(params)
29
42
  raise NotImplementedError
30
43
  end
44
+
45
+ def process_mp4(params)
46
+ raise NotImplementedError
47
+ end
31
48
  end
32
49
  end
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'playwright'
4
+ require 'open3'
5
+ require 'io/console'
6
+
7
+ module Vidload
8
+ module Mp4
9
+ module Api
10
+ VIDEO_DOWNLOADED_EVENT_QUEUE = Queue.new
11
+
12
+ class DownloaderBuilder
13
+ REQUIRED_ARGS = %i[video_url video_hub_url playwright_cli_path].freeze
14
+
15
+ def initialize
16
+ @kwargs = {}
17
+ end
18
+
19
+ def with_kwargs(**kwargs)
20
+ @kwargs = kwargs
21
+ self
22
+ end
23
+
24
+ def with_video_name(video_name)
25
+ @kwargs[:video_name] = video_name
26
+ self
27
+ end
28
+
29
+ def with_video_url(video_url)
30
+ @kwargs[:video_url] = video_url
31
+ self
32
+ end
33
+
34
+ def with_video_hub_url(video_hub_url)
35
+ @kwargs[:video_hub_url] = video_hub_url
36
+ self
37
+ end
38
+
39
+ def with_playwright_cli_path(playwright_cli_path)
40
+ @kwargs[:playwright_cli_path] = playwright_cli_path
41
+ self
42
+ end
43
+
44
+ def build
45
+ REQUIRED_ARGS.each do |required_arg|
46
+ raise ArgumentError, "#{required_arg} must be provided" unless @kwargs[required_arg]
47
+ end
48
+
49
+ @kwargs[:video_name] = @kwargs[:video_url].split('/').last unless @kwargs[:video_name]
50
+
51
+ Downloader.new(**@kwargs)
52
+ end
53
+ end
54
+
55
+ class Downloader
56
+ def initialize(**kwargs)
57
+ @kwargs = kwargs
58
+ end
59
+
60
+ def self.builder
61
+ DownloaderBuilder.new
62
+ end
63
+
64
+ def self.from_hash(hash)
65
+ builder.with_kwargs(**hash).build
66
+ end
67
+
68
+ # main func to be called in your own scripts defined under web/
69
+ def download_video
70
+ Playwright.create(playwright_cli_executable_path: @kwargs[:playwright_cli_path]) do |playwright|
71
+ browser = playwright.chromium.launch
72
+ page = browser.new_page
73
+
74
+ manage_video_download(page)
75
+ wait_until_video_downloaded
76
+
77
+ browser.close
78
+ end
79
+ end
80
+
81
+ def display_calling_args
82
+ puts 'Called with:'
83
+ @kwargs.each do |key, value|
84
+ puts "\t#{key}=#{value}"
85
+ end
86
+ end
87
+
88
+ def self.display_with_spinner(loading_msg = 'Loading...')
89
+ spinner = TTY::Spinner.new("[:spinner] #{loading_msg}")
90
+ spinner.auto_spin
91
+ yield
92
+ spinner.success('(done)')
93
+ end
94
+
95
+ private
96
+
97
+ def manage_video_download(page)
98
+ page.on('response', ->(resp) { listen_to_video_starts(page, resp) })
99
+ navigate_to_url(@kwargs[:video_url], page)
100
+ end
101
+
102
+ def wait_until_video_downloaded
103
+ Downloader.display_with_spinner('Downloading mp4 video...') do
104
+ VIDEO_DOWNLOADED_EVENT_QUEUE.pop
105
+ end
106
+ end
107
+
108
+ def listen_to_video_starts(_page, response)
109
+ unless response.url.start_with?(@kwargs[:video_hub_url]) && response.headers['content-type']&.include?('video/mp4')
110
+ return
111
+ end
112
+
113
+ body = response.text
114
+ File.open("video-#{@kwargs[:video_name]}.mp4", 'wb') do |f|
115
+ f.write(body)
116
+ end
117
+ VIDEO_DOWNLOADED_EVENT_QUEUE << true
118
+ end
119
+
120
+ def navigate_to_url(url, page)
121
+ Downloader.display_with_spinner("Page #{url} loading...") do
122
+ page.goto(url)
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Vidload
4
+ module Mp4
5
+ require_relative 'mp4/api'
6
+ end
7
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Vidload
4
- VERSION = '0.2.1'
4
+ VERSION = '0.3.1'
5
5
  end
data/lib/vidload.rb CHANGED
@@ -3,5 +3,6 @@
3
3
  module Vidload
4
4
  require_relative 'vidload/version'
5
5
  require_relative 'vidload/mp2t'
6
+ require_relative 'vidload/mp4'
6
7
  require_relative 'vidload/cli'
7
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vidload
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Patacode <pata.codegineer@gmail.com>
@@ -105,6 +105,8 @@ files:
105
105
  - lib/vidload/mp2t.rb
106
106
  - lib/vidload/mp2t/api.rb
107
107
  - lib/vidload/mp2t/remuxer.sh
108
+ - lib/vidload/mp4.rb
109
+ - lib/vidload/mp4/api.rb
108
110
  - lib/vidload/version.rb
109
111
  homepage:
110
112
  licenses: []