mirror of
https://git.sr.ht/~joren/streamrip-go
synced 2026-06-17 15:05:39 +02:00
improve lastfm playlist parity and fallback resolution
Queue resolved last.fm tracks as playlist media to preserve playlist semantics, and add a robust mirror-based parser fallback for last.fm temporary unavailable responses while keeping track order and duplicates.
This commit is contained in:
@@ -178,6 +178,47 @@ func (m *Main) AddByID(ctx context.Context, source, mediaType, id string) error
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Main) AddPlaylistByTrackIDs(ctx context.Context, source, playlistID, playlistName string, trackIDs []string) error {
|
||||
p, err := m.GetLoggedInProvider(ctx, source)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if strings.TrimSpace(playlistName) == "" {
|
||||
playlistName = playlistID
|
||||
}
|
||||
ids := make([]string, 0, len(trackIDs))
|
||||
for _, id := range trackIDs {
|
||||
id = strings.TrimSpace(id)
|
||||
if id != "" {
|
||||
ids = append(ids, id)
|
||||
}
|
||||
}
|
||||
if len(ids) == 0 {
|
||||
return fmt.Errorf("playlist %q has no track ids", playlistName)
|
||||
}
|
||||
|
||||
pending := media.PendingFunc{
|
||||
ResolveFn: func(context.Context) (media.Media, error) {
|
||||
metaItems := make([]any, 0, len(ids))
|
||||
for _, id := range ids {
|
||||
metaItems = append(metaItems, map[string]any{"id": id})
|
||||
}
|
||||
playlistMeta := map[string]any{
|
||||
"name": playlistName,
|
||||
"tracks": map[string]any{"items": metaItems},
|
||||
}
|
||||
return media.MediaFunc{RipFn: func(ctx context.Context) error {
|
||||
if m.Config.Session.CLI.TextOutput {
|
||||
m.logf("Downloading playlist: %s\n", playlistName)
|
||||
}
|
||||
return m.ripPlaylist(ctx, p, source, playlistID, playlistMeta)
|
||||
}}, nil
|
||||
},
|
||||
}
|
||||
m.Pending = append(m.Pending, pending)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *Main) ripCollection(ctx context.Context, p provider.Client, source, kind, id string, meta map[string]any) error {
|
||||
name := titleFromMetadata(meta, id)
|
||||
if n := stringFromAny(meta["name"]); n != "" {
|
||||
|
||||
Reference in New Issue
Block a user