@@ -31,8 +31,6 @@ const (
3131
3232const MaxStateVolume = 65535
3333
34- const DisableCheckMediaRestricted = true
35-
3634const CdnUrlQuarantineDuration = 15 * time .Minute
3735
3836func 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+
542572func (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