mirror of
https://github.com/glomatico/gamdl.git
synced 2026-08-03 13:27:13 +03:00
Release gamdl 3.8.3 with Python 3.14 support
This commit is contained in:
@@ -93,11 +93,33 @@ jobs:
|
||||
name: dist-${{ matrix.name }}
|
||||
path: dist/
|
||||
|
||||
test-python-314-wheel:
|
||||
name: Test wheel on Python 3.14
|
||||
runs-on: ubuntu-latest
|
||||
needs: build-wheels
|
||||
|
||||
steps:
|
||||
- uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.14"
|
||||
|
||||
- name: Retrieve Linux wheel
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: dist-linux-x86_64
|
||||
path: dist/
|
||||
|
||||
- name: Install and import native extension
|
||||
run: |
|
||||
python -m pip install dist/*.whl
|
||||
python -c "from gamdl import _ammuxer; assert _ammuxer.native_available()"
|
||||
|
||||
pypi-publish:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build-sdist
|
||||
- build-wheels
|
||||
- test-python-314-wheel
|
||||
permissions:
|
||||
# IMPORTANT: this permission is mandatory for trusted publishing
|
||||
id-token: write
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
__version__ = "3.8.2"
|
||||
__version__ = "3.8.3"
|
||||
|
||||
@@ -300,7 +300,7 @@ impl WrapperDecryptSession {
|
||||
.stream
|
||||
.as_mut()
|
||||
.ok_or_else(|| PyRuntimeError::new_err("wrapper-v2: decrypt session is closed"))?;
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
let payload = build_decrypt_batch_payload(&adam_id, &skd_uri, &items)?;
|
||||
write_frame(stream, DECRYPT_KIND_BATCH, request_id, &payload)?;
|
||||
let (kind, response_id, response_payload) = read_frame(stream)?;
|
||||
|
||||
@@ -1446,7 +1446,7 @@ pub fn decrypt_and_mux_hex_native(
|
||||
use_single_content_key: bool,
|
||||
m4v_brand: bool,
|
||||
) -> PyResult<()> {
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
let audio = decrypt_track_hex(
|
||||
&input_audio_path,
|
||||
&decryption_key_audio,
|
||||
@@ -1522,7 +1522,7 @@ pub fn decrypt_and_mux_wrapper_native(
|
||||
use_single_content_key: bool,
|
||||
m4v_brand: bool,
|
||||
) -> PyResult<()> {
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
let audio = decrypt_track_wrapper(
|
||||
&wrapper_decrypt_host,
|
||||
wrapper_decrypt_port,
|
||||
|
||||
@@ -47,7 +47,7 @@ fn handler_attr(obj: &Bound<'_, PyAny>) -> PyResult<[u8; 4]> {
|
||||
|
||||
fn extract_samples(track_info: &Bound<'_, PyAny>) -> PyResult<Vec<SampleInfo>> {
|
||||
let samples = track_info.getattr("samples")?;
|
||||
let list = samples.downcast::<PyList>()?;
|
||||
let list = samples.cast::<PyList>()?;
|
||||
let mut out = Vec::with_capacity(list.len());
|
||||
for item in list.iter() {
|
||||
let size = item.getattr("size")?.extract::<u64>().or_else(|_| {
|
||||
@@ -121,7 +121,7 @@ pub fn write_decrypted_m4a_native(
|
||||
let track = extract_track_info(&song_info)?;
|
||||
let payload =
|
||||
payload_source_from_parts(decrypted_data.as_bytes().to_vec(), decrypted_data_path, 0)?;
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
write_m4a_file(&output_path, &track, original_path.as_deref(), &payload)
|
||||
.map_err(py_io_error)
|
||||
})
|
||||
@@ -140,7 +140,7 @@ pub fn write_decrypted_mp4_track_native(
|
||||
let track = extract_track_info(&track_info)?;
|
||||
let payload =
|
||||
payload_source_from_parts(decrypted_data.as_bytes().to_vec(), decrypted_data_path, 0)?;
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
write_track_file(&output_path, &track, original_path.as_deref(), &payload)
|
||||
.map_err(py_io_error)
|
||||
})
|
||||
@@ -171,14 +171,14 @@ pub fn mux_decrypted_media_direct_native(
|
||||
let (video_moov, video_source) = build_track_moov_for_decrypted_track(&video_obj)?;
|
||||
let (audio_moov, audio_source) = build_track_moov_for_decrypted_track(&audio_obj)?;
|
||||
|
||||
let captions = captions_obj.downcast::<PyList>()?;
|
||||
let captions = captions_obj.cast::<PyList>()?;
|
||||
let mut extra_tracks = Vec::new();
|
||||
for caption in captions.iter() {
|
||||
let (moov, source) = build_track_moov_for_decrypted_track(&caption)?;
|
||||
extra_tracks.push((moov, source));
|
||||
}
|
||||
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
let mvhd = find_child_box(&video_moov, b"mvhd", 8).ok_or_else(|| {
|
||||
io::Error::new(
|
||||
io::ErrorKind::InvalidData,
|
||||
@@ -250,7 +250,7 @@ pub fn mux_decrypted_mp4_tracks_native(
|
||||
input_path_extra_tracks: Option<Vec<String>>,
|
||||
m4v_brand: bool,
|
||||
) -> PyResult<()> {
|
||||
py.allow_threads(move || {
|
||||
py.detach(move || {
|
||||
let video_data = std::fs::read(&input_path_video)?;
|
||||
let audio_data = std::fs::read(&input_path_audio)?;
|
||||
let video_moov = extract_top_level_box(&video_data, b"moov").ok_or_else(|| {
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
||||
|
||||
[project]
|
||||
name = "gamdl"
|
||||
version = "3.8.2"
|
||||
version = "3.8.3"
|
||||
description = "A command-line app for downloading Apple Music songs, music videos and post videos."
|
||||
readme = "README.md"
|
||||
license = "MIT"
|
||||
|
||||
Reference in New Issue
Block a user