rill-node 0.0.0-stage → 2026.11.15
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.
- package/LICENSE +202 -0
- package/NOTICE +9 -0
- package/README.md +64 -2
- package/binding.gyp +31 -0
- package/index.d.ts +45 -0
- package/index.js +112 -0
- package/native/darwin-arm64/librill.dylib +0 -0
- package/native/darwin-arm64/rill-media +0 -0
- package/native/darwin-arm64/rill_node.node +0 -0
- package/native/darwin-x64/librill.dylib +0 -0
- package/native/darwin-x64/rill-media +0 -0
- package/native/darwin-x64/rill_node.node +0 -0
- package/native/linux-arm64-gnu/librill.so +0 -0
- package/native/linux-arm64-gnu/rill-media +0 -0
- package/native/linux-arm64-gnu/rill_node.node +0 -0
- package/native/linux-x64-gnu/librill.so +0 -0
- package/native/linux-x64-gnu/rill-media +0 -0
- package/native/linux-x64-gnu/rill_node.node +0 -0
- package/native-src/include/rill.h +90 -0
- package/native-src/include/rill_media.h +22 -0
- package/native-src/shard.yml +9 -0
- package/native-src/src/c_api.cr +194 -0
- package/native-src/src/cli.cr +637 -0
- package/native-src/src/rill/c_api/job.cr +336 -0
- package/native-src/src/rill/c_api/memory.cr +32 -0
- package/native-src/src/rill/c_api/status.cr +25 -0
- package/native-src/src/rill/c_api/sync.cr +125 -0
- package/native-src/src/rill/c_api/worker_pool.cr +403 -0
- package/native-src/src/rill/cancellation.cr +29 -0
- package/native-src/src/rill/client.cr +52 -0
- package/native-src/src/rill/cookie_jar.cr +130 -0
- package/native-src/src/rill/dash/manifest.cr +279 -0
- package/native-src/src/rill/dash/parser.cr +227 -0
- package/native-src/src/rill/download_options.cr +96 -0
- package/native-src/src/rill/download_plan.cr +27 -0
- package/native-src/src/rill/download_progress.cr +16 -0
- package/native-src/src/rill/downloader.cr +662 -0
- package/native-src/src/rill/errors.cr +155 -0
- package/native-src/src/rill/extractor.cr +18 -0
- package/native-src/src/rill/extractor_registry.cr +98 -0
- package/native-src/src/rill/extractors/bandcamp.cr +265 -0
- package/native-src/src/rill/extractors/dash.cr +77 -0
- package/native-src/src/rill/extractors/direct_media.cr +73 -0
- package/native-src/src/rill/extractors/generic.cr +441 -0
- package/native-src/src/rill/extractors/hls.cr +202 -0
- package/native-src/src/rill/extractors/internet_archive.cr +180 -0
- package/native-src/src/rill/extractors/m3u.cr +81 -0
- package/native-src/src/rill/extractors/media_ccc_de.cr +219 -0
- package/native-src/src/rill/extractors/mixcloud.cr +495 -0
- package/native-src/src/rill/extractors/peer_tube.cr +226 -0
- package/native-src/src/rill/extractors/rumble.cr +325 -0
- package/native-src/src/rill/extractors/soundcloud.cr +553 -0
- package/native-src/src/rill/extractors/spotify.cr +184 -0
- package/native-src/src/rill/extractors/twitch_clip.cr +273 -0
- package/native-src/src/rill/extractors/youtube.cr +520 -0
- package/native-src/src/rill/format.cr +82 -0
- package/native-src/src/rill/format_selector.cr +143 -0
- package/native-src/src/rill/hls/parser.cr +257 -0
- package/native-src/src/rill/hls/playlist.cr +100 -0
- package/native-src/src/rill/http_client.cr +503 -0
- package/native-src/src/rill/http_url.cr +28 -0
- package/native-src/src/rill/json_value.cr +66 -0
- package/native-src/src/rill/media.cr +151 -0
- package/native-src/src/rill/media_muxer.cr +333 -0
- package/native-src/src/rill/mime_type.cr +58 -0
- package/native-src/src/rill/output_file_name.cr +91 -0
- package/native-src/src/rill/playlist.cr +109 -0
- package/native-src/src/rill/request_options.cr +179 -0
- package/native-src/src/rill/segment_assembly.cr +70 -0
- package/native-src/src/rill/timestamp.cr +34 -0
- package/native-src/src/rill/version.cr +3 -0
- package/native-src/src/rill.cr +47 -0
- package/package.json +48 -4
- package/scripts/build-native.js +46 -0
- package/scripts/install-gyp.js +10 -0
- package/scripts/install.js +19 -0
- package/scripts/lib.js +1 -0
- package/scripts/libdir.js +23 -0
- package/scripts/package-native.js +35 -0
- package/scripts/platform.js +41 -0
- package/scripts/prepack.js +47 -0
- package/src/addon.c +498 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
require "c/stdlib"
|
|
2
|
+
|
|
3
|
+
require "./rill"
|
|
4
|
+
require "./rill/c_api/job"
|
|
5
|
+
require "./rill/c_api/memory"
|
|
6
|
+
require "./rill/c_api/status"
|
|
7
|
+
require "./rill/c_api/worker_pool"
|
|
8
|
+
|
|
9
|
+
module Rill::CAPI
|
|
10
|
+
STATE_NEW = 0
|
|
11
|
+
STATE_INITIALIZING = 1
|
|
12
|
+
STATE_READY = 2
|
|
13
|
+
STATE_FAILED = 3
|
|
14
|
+
STATE_SHUTDOWN = 4
|
|
15
|
+
STATE_SHUTTING_DOWN = 5
|
|
16
|
+
|
|
17
|
+
@@state = Atomic(Int32).new(STATE_NEW)
|
|
18
|
+
|
|
19
|
+
def self.initialize(worker_count : LibC::SizeT) : Int32
|
|
20
|
+
count = worker_count.zero? ? 1 : worker_count
|
|
21
|
+
return Status::INVALID_ARGUMENT if count > WorkerPool::MAX_WORKERS
|
|
22
|
+
|
|
23
|
+
if @@state.compare_and_set(STATE_NEW, STATE_INITIALIZING).last
|
|
24
|
+
begin
|
|
25
|
+
initialize_runtime
|
|
26
|
+
WorkerPool.start(count.to_i32)
|
|
27
|
+
@@state.set(STATE_READY)
|
|
28
|
+
Status::OK
|
|
29
|
+
rescue
|
|
30
|
+
@@state.set(STATE_FAILED)
|
|
31
|
+
Status::INTERNAL_ERROR
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
wait_for_ready
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.shutdown : Int32
|
|
39
|
+
loop do
|
|
40
|
+
case @@state.get
|
|
41
|
+
when STATE_NEW
|
|
42
|
+
@@state.set(STATE_SHUTDOWN)
|
|
43
|
+
return Status::OK
|
|
44
|
+
when STATE_SHUTDOWN
|
|
45
|
+
return Status::OK
|
|
46
|
+
when STATE_SHUTTING_DOWN
|
|
47
|
+
Crystal::System::Thread.yield_current
|
|
48
|
+
when STATE_READY
|
|
49
|
+
if @@state.compare_and_set(STATE_READY, STATE_SHUTTING_DOWN).last
|
|
50
|
+
WorkerPool.shutdown
|
|
51
|
+
@@state.set(STATE_SHUTDOWN)
|
|
52
|
+
return Status::OK
|
|
53
|
+
end
|
|
54
|
+
else
|
|
55
|
+
return Status::INTERNAL_ERROR
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.extract_json(
|
|
61
|
+
url : UInt8*,
|
|
62
|
+
options_json : UInt8*,
|
|
63
|
+
json_out : UInt8**,
|
|
64
|
+
error_out : UInt8**,
|
|
65
|
+
error_code_out : UInt8**,
|
|
66
|
+
) : Int32
|
|
67
|
+
if json_out.null? || error_out.null? || error_code_out.null?
|
|
68
|
+
return Status::INVALID_ARGUMENT
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
json_out.value = Pointer(UInt8).null
|
|
72
|
+
error_out.value = Pointer(UInt8).null
|
|
73
|
+
error_code_out.value = Pointer(UInt8).null
|
|
74
|
+
|
|
75
|
+
job = WorkerPool.create_job(url, options_json)
|
|
76
|
+
if job.null?
|
|
77
|
+
error_out.value = Memory.copy_string("failed to create job")
|
|
78
|
+
error_code_out.value = Memory.copy_string("internal")
|
|
79
|
+
return Status::INTERNAL_ERROR
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
status = Job.wait(job, json_out, error_out, error_code_out)
|
|
83
|
+
Job.free(job)
|
|
84
|
+
status
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private def self.wait_for_ready : Int32
|
|
88
|
+
loop do
|
|
89
|
+
case @@state.get
|
|
90
|
+
when STATE_READY
|
|
91
|
+
return Status::OK
|
|
92
|
+
when STATE_FAILED, STATE_SHUTDOWN
|
|
93
|
+
return Status::INTERNAL_ERROR
|
|
94
|
+
when STATE_INITIALIZING
|
|
95
|
+
Crystal::System::Thread.yield_current
|
|
96
|
+
else
|
|
97
|
+
return Status::INTERNAL_ERROR
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
private def self.initialize_runtime : Nil
|
|
103
|
+
GC.init
|
|
104
|
+
Crystal.init_runtime
|
|
105
|
+
|
|
106
|
+
argv = Pointer(UInt8*).malloc(1)
|
|
107
|
+
argv[0] = "rill".to_unsafe
|
|
108
|
+
LibCrystalMain.__crystal_main(1, argv)
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
fun rill_abi_version : Int32
|
|
113
|
+
Rill::CAPI::ABI_VERSION
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
fun rill_init(worker_count : LibC::SizeT) : Int32
|
|
117
|
+
Rill::CAPI.initialize(worker_count)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
fun rill_shutdown : Int32
|
|
121
|
+
Rill::CAPI.shutdown
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
fun rill_job_new(url : UInt8*, options_json : UInt8*) : Rill::CAPI::JobPtr
|
|
125
|
+
Rill::CAPI::WorkerPool.create_job(url, options_json)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
fun rill_job_wait(
|
|
129
|
+
job : Rill::CAPI::JobPtr,
|
|
130
|
+
json_out : UInt8**,
|
|
131
|
+
error_out : UInt8**,
|
|
132
|
+
error_code_out : UInt8**,
|
|
133
|
+
) : Int32
|
|
134
|
+
Rill::CAPI::Job.wait(job, json_out, error_out, error_code_out)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
fun rill_job_free(job : Rill::CAPI::JobPtr) : Void
|
|
138
|
+
Rill::CAPI::Job.free(job)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
fun rill_extract_json(
|
|
142
|
+
url : UInt8*,
|
|
143
|
+
options_json : UInt8*,
|
|
144
|
+
json_out : UInt8**,
|
|
145
|
+
error_out : UInt8**,
|
|
146
|
+
error_code_out : UInt8**,
|
|
147
|
+
) : Int32
|
|
148
|
+
Rill::CAPI.extract_json(url, options_json, json_out, error_out, error_code_out)
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
fun rill_free_string(value : UInt8*) : Void
|
|
152
|
+
Rill::CAPI::Memory.free(value)
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
fun rill_download_start(
|
|
156
|
+
url : UInt8*,
|
|
157
|
+
output_path : UInt8*,
|
|
158
|
+
options_json : UInt8*,
|
|
159
|
+
error_out : UInt8**,
|
|
160
|
+
) : Rill::CAPI::JobPtr
|
|
161
|
+
error_out.value = Pointer(UInt8).null unless error_out.null?
|
|
162
|
+
|
|
163
|
+
job = Rill::CAPI::WorkerPool.create_download_job(url, output_path, options_json)
|
|
164
|
+
if job.null? && !error_out.null?
|
|
165
|
+
error_out.value = Rill::CAPI::Memory.copy_string("failed to create download job")
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
job
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
fun rill_download_poll(
|
|
172
|
+
job : Rill::CAPI::JobPtr,
|
|
173
|
+
state_out : Int32*,
|
|
174
|
+
downloaded_out : Int64*,
|
|
175
|
+
total_out : Int64*,
|
|
176
|
+
) : Int32
|
|
177
|
+
Rill::CAPI::Job.poll(job, state_out, downloaded_out, total_out)
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
fun rill_download_error(job : Rill::CAPI::JobPtr) : UInt8*
|
|
181
|
+
Rill::CAPI::Job.error_message(job)
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
fun rill_download_error_code(job : Rill::CAPI::JobPtr) : UInt8*
|
|
185
|
+
Rill::CAPI::Job.error_code(job)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
fun rill_download_cancel(job : Rill::CAPI::JobPtr) : Int32
|
|
189
|
+
Rill::CAPI::Job.cancel(job)
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
fun rill_download_free(job : Rill::CAPI::JobPtr) : Void
|
|
193
|
+
Rill::CAPI::Job.free(job)
|
|
194
|
+
end
|