vidload 0.1.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 +7 -0
- data/lib/vidload/mp2t/api.rb +107 -0
- data/lib/vidload/mp2t/remuxer.sh +17 -0
- data/lib/vidload/mp2t.rb +3 -0
- data/lib/vidload/version.rb +3 -0
- data/lib/vidload.rb +4 -0
- metadata +74 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: c28a2edbe16f5f4ca8dd074c9766dcc59cabbe2643b1bd53b68520839f490ec9
|
|
4
|
+
data.tar.gz: 85030d0b1e8d20e86f764637b9f58450bc4fca83bbc48b4ba8d6dd1fe9d9b920
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: be6eb2f08bc0637d716fbf63396f8674ec08ad22e4cf19a5874919f6d526917743929ea39297821d947d9747d30fe8425ec32214e8d103fee40952e9576f0992
|
|
7
|
+
data.tar.gz: 370c2a4261a6e8682cd1c62347f334d60b47e2a2af3bf5fb39b106b4a787b6be98d8f383c219a097f203017899fd59ebafb3ad8e5654c4a3fc55efe352a823c3
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
require "playwright"
|
|
2
|
+
require "thread"
|
|
3
|
+
require "tty-spinner"
|
|
4
|
+
|
|
5
|
+
module Vidload::Mp2t::Api
|
|
6
|
+
DEMUXER_PATH = "#{__dir__}/remuxer.sh"
|
|
7
|
+
VIDEO_DOWNLOADED_EVENT_QUEUE = Queue.new
|
|
8
|
+
|
|
9
|
+
class Downloader
|
|
10
|
+
attr_reader :video_url, :video_name, :hls_url, :master_playlist_name, :playwright_cli_path, :video_referer
|
|
11
|
+
|
|
12
|
+
def initialize(
|
|
13
|
+
video_url:,
|
|
14
|
+
video_name:,
|
|
15
|
+
hls_url:,
|
|
16
|
+
master_playlist_name:,
|
|
17
|
+
playwright_cli_path:,
|
|
18
|
+
video_referer:
|
|
19
|
+
)
|
|
20
|
+
raise ArgumentError, "video_url must be provided" unless video_url
|
|
21
|
+
raise ArgumentError, "video_name must be provided" unless video_name
|
|
22
|
+
raise ArgumentError, "hls_url must be provided" unless hls_url
|
|
23
|
+
raise ArgumentError, "master_playlist_name must be provided" unless master_playlist_name
|
|
24
|
+
raise ArgumentError, "playwright_cli_path must be provided" unless playwright_cli_path
|
|
25
|
+
raise ArgumentError, "video_referer must be provided" unless video_referer
|
|
26
|
+
|
|
27
|
+
@video_url = video_url
|
|
28
|
+
@video_name = video_name
|
|
29
|
+
@hls_url = hls_url
|
|
30
|
+
@master_playlist_name = master_playlist_name
|
|
31
|
+
@playwright_cli_path = playwright_cli_path
|
|
32
|
+
@video_referer = video_referer
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.from_argv
|
|
36
|
+
new(
|
|
37
|
+
video_url: ARGV[0],
|
|
38
|
+
video_name: ARGV[1],
|
|
39
|
+
hls_url: ARGV[2],
|
|
40
|
+
master_playlist_name: ARGV[3],
|
|
41
|
+
playwright_cli_path: ARGV[4],
|
|
42
|
+
video_referer: ARGV[5]
|
|
43
|
+
)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# main func to be called in your own scripts defined under web/
|
|
47
|
+
def download_video(video_starter_callbacks: [])
|
|
48
|
+
Playwright.create(playwright_cli_executable_path: @playwright_cli_path) do |playwright|
|
|
49
|
+
browser = playwright.chromium.launch
|
|
50
|
+
page = browser.new_page
|
|
51
|
+
|
|
52
|
+
manage_video_download(page, *video_starter_callbacks)
|
|
53
|
+
wait_until_video_downloaded
|
|
54
|
+
|
|
55
|
+
browser.close
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def display_calling_args
|
|
60
|
+
puts "Constants:"
|
|
61
|
+
puts "\tDEMUXER_PATH=#{DEMUXER_PATH}"
|
|
62
|
+
puts "Called with:"
|
|
63
|
+
puts "\tvideo_url=#{@video_url}"
|
|
64
|
+
puts "\tvideo_name=#{@video_name}"
|
|
65
|
+
puts "\thls_url=#{@hls_url}"
|
|
66
|
+
puts "\tmaster_playlist_name=#{@master_playlist_name}"
|
|
67
|
+
puts "\tplaywright_cli_path=#{@playwright_cli_path}"
|
|
68
|
+
puts "\tvideo_referer=#{@video_referer}"
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def self.display_with_spinner(loading_msg = "Loading...")
|
|
72
|
+
spinner = TTY::Spinner.new("[:spinner] #{loading_msg}")
|
|
73
|
+
spinner.auto_spin
|
|
74
|
+
yield
|
|
75
|
+
spinner.success("(done)")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
def manage_video_download(page, *video_starter_callbacks)
|
|
81
|
+
page.on("request", -> (req) { listen_to_video_starts(req) })
|
|
82
|
+
navigate_to_url(@video_url, page)
|
|
83
|
+
video_starter_callbacks.each do |callback|
|
|
84
|
+
callback.call(page)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def wait_until_video_downloaded
|
|
89
|
+
VIDEO_DOWNLOADED_EVENT_QUEUE.pop
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def listen_to_video_starts(request)
|
|
93
|
+
if request.url.start_with?(@hls_url) && request.url.include?(@master_playlist_name)
|
|
94
|
+
puts "Video starts. Starting download..."
|
|
95
|
+
system(DEMUXER_PATH, request.url, @video_name, @video_referer)
|
|
96
|
+
puts "✔ Video downloaded successfully! Available in ./#{@video_name}.mp4"
|
|
97
|
+
VIDEO_DOWNLOADED_EVENT_QUEUE << true
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def navigate_to_url(url, page)
|
|
102
|
+
Downloader.display_with_spinner("Page #{url} loading...") do
|
|
103
|
+
page.goto(url)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# args
|
|
4
|
+
readonly A_URL="$1"
|
|
5
|
+
readonly A_NAME="${2:-output}"
|
|
6
|
+
readonly A_REFERER="$3"
|
|
7
|
+
|
|
8
|
+
# constants
|
|
9
|
+
readonly C_USER_AGENT="Mozilla/5.0"
|
|
10
|
+
readonly C_REFERER="$A_REFERER/"
|
|
11
|
+
|
|
12
|
+
ffmpeg \
|
|
13
|
+
-user_agent "$C_USER_AGENT" \
|
|
14
|
+
-referer "$C_REFERER" \
|
|
15
|
+
-i "$A_URL" \
|
|
16
|
+
-c copy \
|
|
17
|
+
"$A_NAME".mp4
|
data/lib/vidload/mp2t.rb
ADDED
data/lib/vidload.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: vidload
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Patacode <pata.codegineer@gmail.com>
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-03-12 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: playwright-ruby-client
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.58'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.58'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: tty-spinner
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '0.9'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '0.9'
|
|
41
|
+
description:
|
|
42
|
+
email:
|
|
43
|
+
executables: []
|
|
44
|
+
extensions: []
|
|
45
|
+
extra_rdoc_files: []
|
|
46
|
+
files:
|
|
47
|
+
- lib/vidload.rb
|
|
48
|
+
- lib/vidload/mp2t.rb
|
|
49
|
+
- lib/vidload/mp2t/api.rb
|
|
50
|
+
- lib/vidload/mp2t/remuxer.sh
|
|
51
|
+
- lib/vidload/version.rb
|
|
52
|
+
homepage:
|
|
53
|
+
licenses: []
|
|
54
|
+
metadata: {}
|
|
55
|
+
post_install_message:
|
|
56
|
+
rdoc_options: []
|
|
57
|
+
require_paths:
|
|
58
|
+
- lib
|
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
60
|
+
requirements:
|
|
61
|
+
- - ">="
|
|
62
|
+
- !ruby/object:Gem::Version
|
|
63
|
+
version: '0'
|
|
64
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - ">="
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0'
|
|
69
|
+
requirements: []
|
|
70
|
+
rubygems_version: 3.5.3
|
|
71
|
+
signing_key:
|
|
72
|
+
specification_version: 4
|
|
73
|
+
summary: Download videos from web to local
|
|
74
|
+
test_files: []
|