@@ -89,6 +89,88 @@ describe('streamingHost', () => {
8989 ) ;
9090 } ) ;
9191
92+ it ( 'prefers searchForTrackV2 over searchForTrack when available' , async ( ) => {
93+ const mockCandidates = [
94+ {
95+ id : 'candidate-1' ,
96+ title : 'Test Track' ,
97+ source : { provider : 'test' , id : 'vid1' } ,
98+ failed : false ,
99+ } ,
100+ ] ;
101+
102+ const searchForTrack = vi . fn ( ) ;
103+ const searchForTrackV2 = vi . fn ( ) . mockResolvedValue ( mockCandidates ) ;
104+
105+ const provider : StreamingProvider = {
106+ id : 'test' ,
107+ kind : 'streaming' ,
108+ name : 'Test' ,
109+ searchForTrack,
110+ searchForTrackV2,
111+ getStreamUrl : vi . fn ( ) ,
112+ } ;
113+
114+ providersHost . register ( provider ) ;
115+
116+ const track : Track = {
117+ title : 'Test Track' ,
118+ artists : [ { name : 'Test Artist' , roles : [ ] } ] ,
119+ source : { provider : 'test' , id : 'track-1' } ,
120+ } ;
121+
122+ const result = await streamingHost . resolveCandidatesForTrack ( track ) ;
123+
124+ expect ( result . success ) . toBe ( true ) ;
125+ if ( result . success ) {
126+ expect ( result . candidates ) . toEqual ( mockCandidates ) ;
127+ }
128+ expect ( searchForTrackV2 ) . toHaveBeenCalledWith ( track ) ;
129+ expect ( searchForTrack ) . not . toHaveBeenCalled ( ) ;
130+ } ) ;
131+
132+ it ( 'falls back to searchForTrack when searchForTrackV2 is not defined' , async ( ) => {
133+ const mockCandidates = [
134+ {
135+ id : 'candidate-1' ,
136+ title : 'Test Track' ,
137+ source : { provider : 'test' , id : 'vid1' } ,
138+ failed : false ,
139+ } ,
140+ ] ;
141+
142+ const searchForTrack = vi . fn ( ) . mockResolvedValue ( mockCandidates ) ;
143+
144+ const provider : StreamingProvider = {
145+ id : 'test' ,
146+ kind : 'streaming' ,
147+ name : 'Test' ,
148+ searchForTrack,
149+ getStreamUrl : vi . fn ( ) ,
150+ } ;
151+
152+ providersHost . register ( provider ) ;
153+
154+ const track : Track = {
155+ title : 'Test Track' ,
156+ artists : [ { name : 'Test Artist' , roles : [ ] } ] ,
157+ album : {
158+ title : 'Test Album' ,
159+ source : { provider : 'test' , id : 'alb1' } ,
160+ } ,
161+ source : { provider : 'test' , id : 'track-1' } ,
162+ } ;
163+
164+ const result = await streamingHost . resolveCandidatesForTrack ( track ) ;
165+
166+ expect ( result . success ) . toBe ( true ) ;
167+ expect ( searchForTrack ) . toHaveBeenCalledWith (
168+ 'Test Artist' ,
169+ 'Test Track' ,
170+ 'Test Album' ,
171+ ) ;
172+ } ) ;
173+
92174 it ( 'handles search errors' , async ( ) => {
93175 const searchForTrack = vi
94176 . fn ( )
@@ -226,6 +308,41 @@ describe('streamingHost', () => {
226308 } ) ;
227309 } ) ;
228310
311+ it ( 'prefers getStreamUrlV2 over getStreamUrl when available' , async ( ) => {
312+ const mockStream = {
313+ url : 'https://example.com/stream.mp3' ,
314+ protocol : 'https' as const ,
315+ source : { provider : 'test' , id : 'vid1' } ,
316+ } ;
317+
318+ const getStreamUrl = vi . fn ( ) ;
319+ const getStreamUrlV2 = vi . fn ( ) . mockResolvedValue ( mockStream ) ;
320+
321+ const provider : StreamingProvider = {
322+ id : 'test' ,
323+ kind : 'streaming' ,
324+ name : 'Test' ,
325+ searchForTrack : vi . fn ( ) ,
326+ getStreamUrl,
327+ getStreamUrlV2,
328+ } ;
329+
330+ providersHost . register ( provider ) ;
331+
332+ const candidate : StreamCandidate = {
333+ id : 'candidate-1' ,
334+ title : 'Test Track' ,
335+ source : { provider : 'test' , id : 'vid1' } ,
336+ failed : false ,
337+ } ;
338+
339+ const result = await streamingHost . resolveStreamForCandidate ( candidate ) ;
340+
341+ expect ( getStreamUrlV2 ) . toHaveBeenCalledWith ( candidate ) ;
342+ expect ( getStreamUrl ) . not . toHaveBeenCalled ( ) ;
343+ expect ( result ! . stream ) . toEqual ( mockStream ) ;
344+ } ) ;
345+
229346 it ( 'retries on failure and returns failed candidate after max retries' , async ( ) => {
230347 const getStreamUrl = vi
231348 . fn ( )
0 commit comments