Skip to content

Commit 59ddf58

Browse files
committed
release v0.3.8
1 parent 19e815d commit 59ddf58

7 files changed

Lines changed: 43 additions & 9 deletions

File tree

.github/workflows/build.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,3 +115,4 @@ jobs:
115115
receiver_*.deb
116116
Receiver-*.AppImage
117117
--generate-notes
118+
--prerelease

data/io.github.meehow.Receiver.metainfo.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,15 @@
7777
</screenshots>
7878

7979
<releases>
80+
<release version="0.3.8" date="2026-03-04">
81+
<description>
82+
<ul>
83+
<li>Fix YouTube stream downloads</li>
84+
<li>Make station name clickable to open its homepage</li>
85+
<li>Improve metadata cleaning for DJ suffixes and title prefixes</li>
86+
</ul>
87+
</description>
88+
</release>
8089
<release version="0.3.7" date="2026-02-28">
8190
<description>
8291
<ul>

debian/changelog

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
receiver (0.3.8-1) unstable; urgency=medium
2+
3+
* Fix YouTube stream downloads
4+
* Make station name clickable to open its homepage
5+
* Improve metadata cleaning for DJ suffixes and title prefixes
6+
7+
-- Michał Adamski <michal.adamski@808bits.com> Tue, 04 Mar 2026 22:18:00 +0100
8+
19
receiver (0.3.7-1) unstable; urgency=medium
210

311
* Add Last.fm scrobbling support

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
project('receiver', 'vala', 'c',
2-
version: '0.3.7',
2+
version: '0.3.8',
33
meson_version: '>= 0.59.0',
44
default_options: ['warning_level=2']
55
)

snap/snapcraft.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: receiver
22
base: core24
3-
version: '0.3.7'
3+
version: '0.3.8'
44
title: Receiver
55
summary: Discover 30,000+ verified radio stations from around the world
66
description: |

subprojects/ytdl/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
builddir/
22
ejs/
3+
yt-dlp/

subprojects/ytdl/src/ytdl.vala

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,10 @@ namespace Ytdl {
130130

131131
private const string UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
132132

133+
// Forced player version — must match what the EJS solver can handle.
134+
// Update this when yt-dlp updates _DEFAULT_PLAYER_JS_VERSION.
135+
private const string FORCED_PLAYER_ID = "9f4cc5e4";
136+
133137
/**
134138
* Extract a playable download URL for a YouTube video.
135139
* Returns a VideoInfo with title and direct download URL.
@@ -138,20 +142,31 @@ namespace Ytdl {
138142
public VideoInfo extract (Soup.Session session, string video_id_or_url) throws Error {
139143
string video_id = parse_video_id (video_id_or_url);
140144

141-
// 1. Fetch watch page → player JS URL
145+
// 1. Fetch watch page
142146
string? page = http_get (session, "https://www.youtube.com/watch?v=" + video_id);
143147
if (page == null) throw new IOError.FAILED ("Could not fetch watch page");
144148

145-
string? player_url = null;
146-
var re = new Regex ("/s/player/[a-f0-9]+/[^\"]+base\\.js");
149+
// 2. Extract player JS URL from watch page as fallback
150+
string? page_player_url = null;
151+
var re = new Regex ("/s/player/[a-f0-9]+/[^\"]+(?:base|tv-player-ias)\\.js");
147152
MatchInfo mi;
148153
if (re.match (page, 0, out mi)) {
149-
player_url = "https://www.youtube.com" + mi.fetch (0);
154+
page_player_url = "https://www.youtube.com" + mi.fetch (0);
150155
}
151-
if (player_url == null) throw new IOError.FAILED ("Could not find player JS URL");
152156

153-
// 2. Download player JS → extract STS
154-
string? base_js = http_get (session, player_url);
157+
// Force known-good player version (tv variant) — yt-dlp does the same
158+
string forced_player_url = "https://www.youtube.com/s/player/" + FORCED_PLAYER_ID
159+
+ "/tv-player-ias.vflset/tv-player-ias.js";
160+
string? player_url = null;
161+
162+
// Try forced player first, then fallback to page player
163+
string? base_js = http_get (session, forced_player_url);
164+
if (base_js != null) {
165+
player_url = forced_player_url;
166+
} else if (page_player_url != null) {
167+
base_js = http_get (session, page_player_url);
168+
player_url = page_player_url;
169+
}
155170
if (base_js == null) throw new IOError.FAILED ("Could not download player JS");
156171

157172
string sts = "0";

0 commit comments

Comments
 (0)