Release gamdl 3.8.3 with Python 3.14 support

This commit is contained in:
glomatico
2026-07-12 19:08:46 -03:00
parent dcb0d43ec2
commit 55c3abc03f
7 changed files with 34 additions and 12 deletions
+22
View File
@@ -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
View File
@@ -1 +1 @@
__version__ = "3.8.2"
__version__ = "3.8.3"
+1 -1
View File
@@ -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)?;
+2 -2
View File
@@ -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,
+6 -6
View File
@@ -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
View File
@@ -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"
Generated
+1 -1
View File
@@ -223,7 +223,7 @@ wheels = [
[[package]]
name = "gamdl"
version = "3.8.2"
version = "3.8.3"
source = { editable = "." }
dependencies = [
{ name = "async-lru" },