mirror of
https://github.com/ihabunek/twitch-dl
synced 2024-08-30 18:32:25 +00:00
Improve playlist parsing
Better support for "enhanced broadcast" streams issue #154
This commit is contained in:
parent
f9e553c61f
commit
97f48f7108
@ -15,8 +15,10 @@ from twitchdl.output import bold, dim
|
|||||||
@dataclass
|
@dataclass
|
||||||
class Playlist:
|
class Playlist:
|
||||||
name: str
|
name: str
|
||||||
|
group_id: str
|
||||||
resolution: Optional[str]
|
resolution: Optional[str]
|
||||||
url: str
|
url: str
|
||||||
|
is_source: bool
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -34,17 +36,17 @@ def parse_playlists(playlists_m3u8: str) -> List[Playlist]:
|
|||||||
document = load_m3u8(source)
|
document = load_m3u8(source)
|
||||||
|
|
||||||
for p in document.playlists:
|
for p in document.playlists:
|
||||||
if p.stream_info.resolution:
|
resolution = (
|
||||||
name = p.media[0].name
|
"x".join(str(r) for r in p.stream_info.resolution)
|
||||||
resolution = "x".join(str(r) for r in p.stream_info.resolution)
|
if p.stream_info.resolution
|
||||||
else:
|
else None
|
||||||
name = p.media[0].group_id
|
)
|
||||||
resolution = None
|
|
||||||
|
|
||||||
yield Playlist(name, resolution, p.uri)
|
media = p.media[0]
|
||||||
|
is_source = media.group_id == "chunked"
|
||||||
|
yield Playlist(media.name, media.group_id, resolution, p.uri, is_source)
|
||||||
|
|
||||||
# Move audio to bottom, it has no resolution
|
return list(_parse(playlists_m3u8))
|
||||||
return sorted(_parse(playlists_m3u8), key=lambda p: p.resolution is None)
|
|
||||||
|
|
||||||
|
|
||||||
def load_m3u8(playlist_m3u8: str) -> m3u8.M3U8:
|
def load_m3u8(playlist_m3u8: str) -> m3u8.M3U8:
|
||||||
@ -107,10 +109,13 @@ def select_playlist(playlists: List[Playlist], quality: Optional[str]) -> Playli
|
|||||||
|
|
||||||
def select_playlist_by_name(playlists: List[Playlist], quality: str) -> Playlist:
|
def select_playlist_by_name(playlists: List[Playlist], quality: str) -> Playlist:
|
||||||
if quality == "source":
|
if quality == "source":
|
||||||
return playlists[0]
|
for playlist in playlists:
|
||||||
|
if playlist.is_source:
|
||||||
|
return playlist
|
||||||
|
raise click.ClickException("Source quality not found, please report an issue on github.")
|
||||||
|
|
||||||
for playlist in playlists:
|
for playlist in playlists:
|
||||||
if playlist.name == quality:
|
if playlist.name == quality or playlist.group_id == quality:
|
||||||
return playlist
|
return playlist
|
||||||
|
|
||||||
available = ", ".join([p.name for p in playlists])
|
available = ", ".join([p.name for p in playlists])
|
||||||
|
Loading…
Reference in New Issue
Block a user