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 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
@@ -0,0 +1,3 @@
1
+ module Vidload::Mp2t
2
+ require_relative "mp2t/api"
3
+ end
@@ -0,0 +1,3 @@
1
+ module Vidload
2
+ VERSION = "0.1.0"
3
+ end
data/lib/vidload.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Vidload
2
+ require_relative "vidload/version"
3
+ require_relative "vidload/mp2t"
4
+ end
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: []