Skip to content

Commit 80ff06a

Browse files
committed
feat: look at alternative tracks for streaming
1 parent 37b1898 commit 80ff06a

2 files changed

Lines changed: 45 additions & 10 deletions

File tree

player.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ func NewMediaFromEpisode(episode *metadatapb.Episode) *Media {
3232
return &Media{track: nil, episode: episode}
3333
}
3434

35+
func (te Media) Id() SpotifyId {
36+
if te.track != nil {
37+
return SpotifyIdFromGid(SpotifyIdTypeTrack, te.track.GetGid())
38+
} else {
39+
return SpotifyIdFromGid(SpotifyIdTypeEpisode, te.episode.GetGid())
40+
}
41+
}
42+
3543
func (te Media) IsTrack() bool {
3644
return te.track != nil
3745
}

player/player.go

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ const (
3131

3232
const MaxStateVolume = 65535
3333

34-
const DisableCheckMediaRestricted = true
35-
3634
const CdnUrlQuarantineDuration = 15 * time.Minute
3735

3836
func ptr[T any](v T) *T {
@@ -539,6 +537,38 @@ func calculateNormalisationFactor(params *audiofilespb.NormalizationParams, preg
539537
return normalisationFactor
540538
}
541539

540+
func (p *Player) getUnrestrictedTrack(ctx context.Context, spotId librespot.SpotifyId) (*metadatapb.Track, error) {
541+
var trackMeta metadatapb.Track
542+
err := p.sp.ExtendedMetadataSimple(ctx, spotId, extmetadatapb.ExtensionKind_TRACK_V4, &trackMeta)
543+
if err != nil {
544+
return nil, fmt.Errorf("failed getting track metadata: %w", err)
545+
}
546+
547+
media := librespot.NewMediaFromTrack(&trackMeta)
548+
if !isMediaRestricted(media, *p.countryCode) {
549+
return &trackMeta, nil
550+
}
551+
552+
for _, alt := range trackMeta.Alternative {
553+
media = librespot.NewMediaFromTrack(alt)
554+
if !isMediaRestricted(media, *p.countryCode) {
555+
// Clear alternatives to avoid confusion
556+
trackMeta.Alternative = nil
557+
558+
// The alternative track does not have all fields set, copy them over
559+
// to the original track metadata.
560+
trackMeta.Gid = alt.Gid
561+
trackMeta.File = alt.File
562+
trackMeta.Preview = alt.Preview
563+
trackMeta.OriginalAudio = alt.OriginalAudio
564+
return &trackMeta, nil
565+
}
566+
}
567+
568+
// We tried all alternatives, still restricted
569+
return nil, librespot.ErrMediaRestricted
570+
}
571+
542572
func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId librespot.SpotifyId, bitrate int, mediaPosition int64) (*Stream, error) {
543573
log := p.log.WithField("uri", spotId.Uri())
544574

@@ -551,16 +581,13 @@ func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId libr
551581
var media *librespot.Media
552582
var file *metadatapb.AudioFile
553583
if spotId.Type() == librespot.SpotifyIdTypeTrack {
554-
var trackMeta metadatapb.Track
555-
err := p.sp.ExtendedMetadataSimple(ctx, spotId, extmetadatapb.ExtensionKind_TRACK_V4, &trackMeta)
584+
trackMeta, err := p.getUnrestrictedTrack(ctx, spotId)
556585
if err != nil {
557-
return nil, fmt.Errorf("failed getting track metadata: %w", err)
586+
return nil, err
558587
}
559588

560-
media = librespot.NewMediaFromTrack(&trackMeta)
561-
if !DisableCheckMediaRestricted && isMediaRestricted(media, *p.countryCode) {
562-
return nil, librespot.ErrMediaRestricted
563-
}
589+
media = librespot.NewMediaFromTrack(trackMeta)
590+
spotId = media.Id()
564591

565592
var audioFilesResp audiofilespb.AudioFilesExtensionResponse
566593
err = p.sp.ExtendedMetadataSimple(ctx, spotId, extmetadatapb.ExtensionKind_AUDIO_FILES, &audioFilesResp)
@@ -601,7 +628,7 @@ func (p *Player) NewStream(ctx context.Context, client *http.Client, spotId libr
601628
}
602629

603630
media = librespot.NewMediaFromEpisode(&episodeMeta)
604-
if !DisableCheckMediaRestricted && isMediaRestricted(media, *p.countryCode) {
631+
if isMediaRestricted(media, *p.countryCode) {
605632
return nil, librespot.ErrMediaRestricted
606633
}
607634

0 commit comments

Comments
 (0)