serenity-rs/songbird

M3U8 support (soundcloud)

murl-digital opened this issue · 4 comments

Songbird version: 0.4.1

Rust version (rustc -V): rustc 1.81.0-nightly (aa1d4f682 2024-07-03)

Serenity/Twilight version: serenity 0.12

Output of ffmpeg -version, yt-dlp --version (if relevant): 2024.07.02
...

Description:
when trying to play a source from soundcloud.com, symphonia throws a no format supported error, even when enabling everything. my best guess is that soundcloud uses opus or something.
...

Steps to reproduce:
...
use voice example
pass in soundcloud link (e.g https://soundcloud.com/upscale-recordings/tomsbattery?)
observe error thrown in logs

We have full support for Opus, because we configure symphonia with a custom codec for that purpose.

The issue here is that the stream you have linked is m3u8, which we don't support:

yt-dlp -j https://soundcloud.com/upscale-recordings/tomsbattery? -f ba[abr>0][vcodec=none]/best --no-playlist | jq '{protocol, url}'
{
  "protocol": "m3u8_native",
  "url": "https://cf-hls-opus-media.sndcdn.com/playlist/594b68d6-a265-4a75-8125-da0c9d40eb14.64.opus/playlist.m3u8?Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiKjovL2NmLWhscy1vcHVzLW1lZGlhLnNuZGNkbi5jb20vcGxheWxpc3QvNTk0YjY4ZDYtYTI2NS00YTc1LTgxMjUtZGEwYzlkNDBlYjE0LjY0Lm9wdXMvcGxheWxpc3QubTN1OCoiLCJDb25kaXRpb24iOnsiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE3MjAxOTgxMDd9fX1dfQ__&Signature=HIOzUklJSPdTda6ZZ~8BZuBd4YsuX0xm4Jh88es7DcClCouT18sox4~6V8pvpRx3J12yRr6HTPzW3hvt-fIInSDYTj5eRTLbkX0bdW1-1GvBgdHcjxhO11k7m8ElERXu~bRWe3Jhb2Nv9wzE3LL7kyto3KzHkdTOnrQfFc5KPVOnj8yCljoYLFdlrg3F4wkKJ6CpFGSPVb2Q88cPb~JfFulsfVqGbwWJml4-OwOcYUIzL4SinCUrMwtIGQesNQinYoVhlra-g5ydPBMPz07pzmIfuh6qg417PFlscRlYRw8ExfdaHYJlXKT9RSzbGWrSy5ODgqrVylcAMfBo6MQQNg__&Key-Pair-Id=APKAI6TU7MMXM5DG6EPQ"
}

Practically speaking, the object that gets downloaded is a playlist which links to a set of smaller opus chunks. Handling playlists like this is probably a significant lift in terms of engineering work.

is there anything i can do to help?

Erk- commented

@murl-digital Using #242 should work, so you can try that out.

just tried it, seems to work