Skip to content

Upstream watch: GAMDL next-tag (3.7.4?) — m3u8 master URL default-variant rewrite (zero-surface admission) #910

@Salem874

Description

@Salem874

Summary

Upstream GAMDL (main branch) is one commit ahead of the most recent tag 3.7.3 as of 2026-06-07. The single in-flight commit is a pure HTTP-layer fix that rewrites Apple Music's m3u8 master URLs from codec-specific variants to the _default variant.

This issue is the pre-emptive watch: get the audit done, confirm zero MeedyaDL surface change, pre-stage the support-window bump, and pre-write the per-workflow release-notes line so the moment upstream tags (probably 3.7.4) we can ship a follow-up MeedyaDL pre-release on the alpha channel with one-line PR.

In-flight commit

  • a9e75384 — "Add method to switch m3u8 master URL to default and update playback handling" — touches gamdl/interface/song.py only (1 file, +27/-10).

What the change does

Adds _switch_m3u8_master_url_to_default():

def _switch_m3u8_master_url_to_default(self, m3u8_master_url: str) -> str:
    return re.sub(
        r"(P\d+)_[^/]+(\.m3u8)",
        r"\1_default\2",
        m3u8_master_url,
    )

The regex matches Apple's CDN m3u8 master URL pattern and rewrites the codec-specific middle segment to default. Examples:

  • Input: https://…/P12345_aac_HE_4_44100.m3u8
  • Output: https://…/P12345_default.m3u8

Applied at both extraction sites in song.py:

  1. _get_m3u8_from_playback() — when the URL comes from playback.songList[0].hls-playlist-url
  2. _get_m3u8_master_url_from_metadata() — when the URL comes from song_metadata.attributes.extendedAssetUrls.enhancedHls

Pattern is identical to the user-facing fix in v3.5.2 (play-edge.itunes.apple.complay.itunes.apple.com host migration) and v3.5.1 (m3u8 403 error fix) — Apple silently shifts what URL shapes work, and GAMDL adapts.

Why MeedyaDL surface is unaffected

Audit-grep run 2026-06-07:

Surface Hit count Verdict
MeedyaDL parses m3u8 URL shape (`rg 'm3u8 hls-playlist enhancedHls'`)
MeedyaDL regex matching P\d+_* pattern 0 No collision
MeedyaDL emits CLI flags affected by this change 0 This is pure HTTP-layer internal
MeedyaDL stdout/stderr parsing affected (process::classify_error, TRACK_INFO_V2_REGEX, ERROR_PREFIX_REGEX) 0 The new log.debug calls are gated behind --log-level DEBUG which MeedyaDL never sets

Confirmed: this matches the same zero-code-change admission shape as v3.3 (playlist fix) / v3.5 (iTunes lookup fix) / v3.5.1 (MV 403 fix) / v3.5.2 (host migration) / v3.5.x and v3.7.1 trailing audits.

Plan

Tracked as a 4-step pre-release prep (all read-only / non-blocking on upstream):

  • Step 1 — Diagnostic audit. Fetch + analyze the in-flight commit (this issue body).
  • Step 2 — Audit doc draft. Pre-write .github/audits/gamdl-vNEXT-audit.md with the analysis. Once upstream tags, rename file + fill in the tag.
  • Step 3 — Pre-stage tool-versions.toml bump. Comment block + audit note ready for the version-ceiling flip.
  • Step 4 — Release notes line. Pre-write the one-liner for the next .github/release-notes/v1.10.0-alpha.NN.md (or whichever pre-release lands first after the upstream tag) so it's drop-in ready.

Anticipated next-tag work (when upstream tags)

Exactly two file edits (target: single-commit PR):

  1. src-tauri/tool-versions.toml — bump maximum_tested_version + recommended_version from 3.7.3 to whatever upstream lands (almost certainly 3.7.4). Append audit-notes block.
  2. .claude/CLAUDE.md — extend the GAMDL cadence paragraph with one entry summarising the m3u8 rewrite + zero-surface admission, in the same prose style as the existing 3.5.2 / 3.7.2+3.7.3 entries.

No GamdlFeature gate needed. No regex changes. No classifier changes. No new CLI flags or INI keys.

Trigger

Close this issue when upstream tags the release and MeedyaDL ships the admission PR.

Related

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions