rill-node 0.0.0-stage → 2026.11.14

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.
Files changed (82) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +64 -2
  4. package/binding.gyp +31 -0
  5. package/index.d.ts +45 -0
  6. package/index.js +112 -0
  7. package/native/darwin-arm64/librill.dylib +0 -0
  8. package/native/darwin-arm64/rill-media +0 -0
  9. package/native/darwin-arm64/rill_node.node +0 -0
  10. package/native/darwin-x64/librill.dylib +0 -0
  11. package/native/darwin-x64/rill-media +0 -0
  12. package/native/darwin-x64/rill_node.node +0 -0
  13. package/native/linux-arm64-gnu/librill.so +0 -0
  14. package/native/linux-arm64-gnu/rill-media +0 -0
  15. package/native/linux-arm64-gnu/rill_node.node +0 -0
  16. package/native/linux-x64-gnu/librill.so +0 -0
  17. package/native/linux-x64-gnu/rill-media +0 -0
  18. package/native/linux-x64-gnu/rill_node.node +0 -0
  19. package/native-src/include/rill.h +90 -0
  20. package/native-src/include/rill_media.h +22 -0
  21. package/native-src/shard.yml +9 -0
  22. package/native-src/src/c_api.cr +194 -0
  23. package/native-src/src/cli.cr +637 -0
  24. package/native-src/src/rill/c_api/job.cr +336 -0
  25. package/native-src/src/rill/c_api/memory.cr +32 -0
  26. package/native-src/src/rill/c_api/status.cr +25 -0
  27. package/native-src/src/rill/c_api/sync.cr +125 -0
  28. package/native-src/src/rill/c_api/worker_pool.cr +403 -0
  29. package/native-src/src/rill/cancellation.cr +29 -0
  30. package/native-src/src/rill/client.cr +52 -0
  31. package/native-src/src/rill/cookie_jar.cr +130 -0
  32. package/native-src/src/rill/dash/manifest.cr +279 -0
  33. package/native-src/src/rill/dash/parser.cr +227 -0
  34. package/native-src/src/rill/download_options.cr +96 -0
  35. package/native-src/src/rill/download_plan.cr +27 -0
  36. package/native-src/src/rill/download_progress.cr +16 -0
  37. package/native-src/src/rill/downloader.cr +662 -0
  38. package/native-src/src/rill/errors.cr +155 -0
  39. package/native-src/src/rill/extractor.cr +18 -0
  40. package/native-src/src/rill/extractor_registry.cr +98 -0
  41. package/native-src/src/rill/extractors/bandcamp.cr +265 -0
  42. package/native-src/src/rill/extractors/dash.cr +77 -0
  43. package/native-src/src/rill/extractors/direct_media.cr +73 -0
  44. package/native-src/src/rill/extractors/generic.cr +441 -0
  45. package/native-src/src/rill/extractors/hls.cr +202 -0
  46. package/native-src/src/rill/extractors/internet_archive.cr +180 -0
  47. package/native-src/src/rill/extractors/m3u.cr +81 -0
  48. package/native-src/src/rill/extractors/media_ccc_de.cr +219 -0
  49. package/native-src/src/rill/extractors/mixcloud.cr +495 -0
  50. package/native-src/src/rill/extractors/peer_tube.cr +226 -0
  51. package/native-src/src/rill/extractors/rumble.cr +325 -0
  52. package/native-src/src/rill/extractors/soundcloud.cr +553 -0
  53. package/native-src/src/rill/extractors/spotify.cr +184 -0
  54. package/native-src/src/rill/extractors/twitch_clip.cr +273 -0
  55. package/native-src/src/rill/extractors/youtube.cr +520 -0
  56. package/native-src/src/rill/format.cr +82 -0
  57. package/native-src/src/rill/format_selector.cr +143 -0
  58. package/native-src/src/rill/hls/parser.cr +257 -0
  59. package/native-src/src/rill/hls/playlist.cr +100 -0
  60. package/native-src/src/rill/http_client.cr +503 -0
  61. package/native-src/src/rill/http_url.cr +28 -0
  62. package/native-src/src/rill/json_value.cr +66 -0
  63. package/native-src/src/rill/media.cr +151 -0
  64. package/native-src/src/rill/media_muxer.cr +333 -0
  65. package/native-src/src/rill/mime_type.cr +58 -0
  66. package/native-src/src/rill/output_file_name.cr +91 -0
  67. package/native-src/src/rill/playlist.cr +109 -0
  68. package/native-src/src/rill/request_options.cr +179 -0
  69. package/native-src/src/rill/segment_assembly.cr +70 -0
  70. package/native-src/src/rill/timestamp.cr +34 -0
  71. package/native-src/src/rill/version.cr +3 -0
  72. package/native-src/src/rill.cr +47 -0
  73. package/package.json +48 -4
  74. package/scripts/build-native.js +46 -0
  75. package/scripts/install-gyp.js +10 -0
  76. package/scripts/install.js +19 -0
  77. package/scripts/lib.js +1 -0
  78. package/scripts/libdir.js +23 -0
  79. package/scripts/package-native.js +35 -0
  80. package/scripts/platform.js +41 -0
  81. package/scripts/prepack.js +47 -0
  82. 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