Skip to content

Non-available tracks in a Bandcamp album playlist lead to a fatal crash (even the system hangs after it) #12902

@hollownights

Description

@hollownights

Checklist

  • I am able to reproduce the bug with the latest version given here: CLICK THIS LINK.
  • I made sure that there are no existing issues - open or closed - which I could contribute my information to.
  • I have read the FAQ and my problem isn't listed.
  • I have taken the time to fill in all the required details. I understand that the bug report will be dismissed otherwise.
  • This issue contains only one bug.
  • I have read and understood the contribution guidelines.

Affected version

0.28.0

Steps to reproduce the bug

  1. Open this album in NewPipe (it has some tracks listed, but not available): https://feiertagsk.bandcamp.com/album/alchemist

  2. Put it on play in the background. Wait for it to play the first song (available) and watch it as it goes for the second track (not available).

  3. The app should crash with a “network error” (though it is not a network error).

  4. In a Samsung device (Galaxy S23, Android 16, all updates installed), even the system takes the toll, with an unresponsive UI.

Expected behavior

To gracefully skip to the next available track instead of crashing.

Actual behavior

Crashing with a generic error identifier (“network”) and also making the system crash.

Screenshots/Screen recordings

No response

Logs

Exception

  • User Action: play stream
  • Request: Player error[type=ERROR_CODE_IO_UNSPECIFIED] occurred while playing
  • Content Country: GB
  • Content Language: en-GB
  • App Language: en_US
  • Service: Bandcamp
  • Timestamp: 2025-12-13T22:31:28.026-03:00
  • Package: org.schabi.newpipe
  • Service: Bandcamp
  • Version: 0.28.0
  • OS: [This data point is just too unique in Samsung's devices to be shared around]
Crash log

com.google.android.exoplayer2.ExoPlaybackException: Source error
	at com.google.android.exoplayer2.ExoPlayerImplInternal.handleIoException(ExoPlayerImplInternal.java:644)
	at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:620)
	at android.os.Handler.dispatchMessage(Handler.java:106)
	at android.os.Looper.loopOnce(Looper.java:273)
	at android.os.Looper.loop(Looper.java:363)
	at android.os.HandlerThread.run(HandlerThread.java:85)
Caused by: java.io.IOException: java.lang.Exception: java.lang.IllegalArgumentException: The url is null or empty
	at org.schabi.newpipe.player.mediasource.FailedMediaSource.maybeThrowSourceInfoRefreshError(FailedMediaSource.java:129)
	at com.google.android.exoplayer2.source.MaskingMediaPeriod.maybeThrowPrepareError(MaskingMediaPeriod.java:156)
	at com.google.android.exoplayer2.source.MaskingMediaPeriod.maybeThrowPrepareError(MaskingMediaPeriod.java:154)
	at com.google.android.exoplayer2.ExoPlayerImplInternal.doSomeWork(ExoPlayerImplInternal.java:1024)
	at com.google.android.exoplayer2.ExoPlayerImplInternal.handleMessage(ExoPlayerImplInternal.java:502)
	... 4 more
Caused by: java.lang.Exception: java.lang.IllegalArgumentException: The url is null or empty
	at org.schabi.newpipe.player.playback.MediaSourceManager.lambda$getLoadedMediaSource$7(MediaSourceManager.java:454)
	at org.schabi.newpipe.player.playback.MediaSourceManager.$r8$lambda$o9pPAAzp1URPxayOlD1n6iDJBCc(MediaSourceManager.java:0)
	at org.schabi.newpipe.player.playback.MediaSourceManager$$ExternalSyntheticLambda6.apply(R8$$SyntheticClass:0)
	at io.reactivex.rxjava3.internal.operators.single.SingleOnErrorReturn$OnErrorReturn.onError(SingleOnErrorReturn.java:55)
	at io.reactivex.rxjava3.internal.operators.single.SingleMap$MapSingleObserver.onError(SingleMap.java:70)
	at io.reactivex.rxjava3.internal.operators.single.SingleDoOnError$DoOnError.onError(SingleDoOnError.java:63)
	at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.onError(SingleSubscribeOn.java:73)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeToSingle$ToSingleMaybeSubscriber.onError(MaybeToSingle.java:89)
	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onError(FlowableElementAtMaybe.java:94)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.onError(MaybeConcatArray.java:100)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromSingle$FromSingleObserver.onError(MaybeFromSingle.java:82)
	at io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess$DoOnSuccess.onError(SingleDoOnSuccess.java:65)
	at io.reactivex.rxjava3.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:47)
	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
	at io.reactivex.rxjava3.internal.operators.single.SingleDoOnSuccess.subscribeActual(SingleDoOnSuccess.java:35)
	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeFromSingle.subscribeActual(MaybeFromSingle.java:41)
	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.drain(MaybeConcatArray.java:153)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray$ConcatMaybeObserver.request(MaybeConcatArray.java:78)
	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe$ElementAtSubscriber.onSubscribe(FlowableElementAtMaybe.java:66)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeConcatArray.subscribeActual(MaybeConcatArray.java:42)
	at io.reactivex.rxjava3.core.Flowable.subscribe(Flowable.java:16144)
	at io.reactivex.rxjava3.internal.operators.flowable.FlowableElementAtMaybe.subscribeActual(FlowableElementAtMaybe.java:36)
	at io.reactivex.rxjava3.core.Maybe.subscribe(Maybe.java:5377)
	at io.reactivex.rxjava3.internal.operators.maybe.MaybeToSingle.subscribeActual(MaybeToSingle.java:46)
	at io.reactivex.rxjava3.core.Single.subscribe(Single.java:4855)
	at io.reactivex.rxjava3.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
	at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:644)
	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
	at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
	at java.util.concurrent.FutureTask.run(FutureTask.java:317)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:348)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651)
	at java.lang.Thread.run(Thread.java:1119)
Caused by: java.lang.IllegalArgumentException: The url is null or empty
	at org.schabi.newpipe.extractor.linkhandler.LinkHandlerFactory.fromUrl(LinkHandlerFactory.java:59)
	at org.schabi.newpipe.extractor.StreamingService.getStreamExtractor(StreamingService.java:302)
	at org.schabi.newpipe.extractor.stream.StreamInfo.getInfo(StreamInfo.java:72)
	at org.schabi.newpipe.util.ExtractorHelper.lambda$getStreamInfo$3(ExtractorHelper.java:118)
	at org.schabi.newpipe.util.ExtractorHelper.$r8$lambda$bVfA-5gb6gDc8jcAgcGWG5oH0FE(ExtractorHelper.java:0)
	at org.schabi.newpipe.util.ExtractorHelper$$ExternalSyntheticLambda3.call(R8$$SyntheticClass:0)
	at io.reactivex.rxjava3.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:43)
	... 23 more


Affected Android/Custom ROM version

Android 16 / One UI 8.0

Affected device model

Samsung Galaxy S23

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    BandcampService, https://bandcamp.com/bugIssue is related to a bugplayerIssues related to any player (main, popup and background)

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions