@@ -20,6 +20,8 @@ public class TrustedSessionHelper
2020 private static readonly Logger _logger = NzbDroneLogger . GetLogger ( typeof ( TrustedSessionHelper ) ) ;
2121
2222 private static SessionTokens ? _cachedTokens ;
23+ private static bool ? _nodeJsAvailable ;
24+ private static object _nodeJsCheckLock = new ( ) ;
2325 private static readonly SemaphoreSlim _semaphore = new ( 1 , 1 ) ;
2426
2527 // Constants for retry logic
@@ -41,14 +43,14 @@ public static async Task<SessionTokens> GetTrustedSessionTokensAsync(string? ser
4143 return _cachedTokens ;
4244 }
4345
44- SessionTokens newTokens ;
46+ SessionTokens newTokens = new ( "" , "" , DateTime . UtcNow . AddHours ( 12 ) ) ;
4547
4648 if ( ! string . IsNullOrEmpty ( serviceUrl ) )
4749 {
4850 _logger . Trace ( $ "Using web service approach with URL: { serviceUrl } ") ;
4951 newTokens = await GetTokensFromWebServiceAsync ( serviceUrl , forceRefresh , token ) ;
5052 }
51- else
53+ else if ( IsNodeJsAvailable ( ) )
5254 {
5355 _logger . Trace ( "Using local YouTubeSessionGenerator" ) ;
5456 newTokens = await GetTokensFromLocalGeneratorAsync ( token ) ;
@@ -301,25 +303,8 @@ private static SessionTokens ParseTokenResponse(string responseJson, string sour
301303 /// </summary>
302304 public static async Task ValidateAuthenticationSettingsAsync ( string ? trustedSessionGeneratorUrl = null , string ? cookiePath = null )
303305 {
304- if ( string . IsNullOrEmpty ( trustedSessionGeneratorUrl ) && string . IsNullOrEmpty ( cookiePath ) )
305- {
306- NodeEnvironment ? testEnv = null ;
307- try
308- {
309- testEnv = new NodeEnvironment ( ) ;
310- _logger . Trace ( "Node.js environment test successful" ) ;
311- }
312- catch ( Exception ex )
313- {
314- throw new ArgumentException ( $ "Node.js environment is not available for local token generation: { ex . Message } ") ;
315- }
316- finally
317- {
318- testEnv ? . Dispose ( ) ;
319- }
320-
321- return ;
322- }
306+ if ( string . IsNullOrEmpty ( trustedSessionGeneratorUrl ) && ! IsNodeJsAvailable ( ) )
307+ _logger . Warn ( "Node.js environment is not available for local token generation." ) ;
323308
324309 if ( ! string . IsNullOrEmpty ( trustedSessionGeneratorUrl ) )
325310 {
@@ -359,6 +344,37 @@ public static async Task ValidateAuthenticationSettingsAsync(string? trustedSess
359344 }
360345 }
361346
347+ /// <summary>
348+ /// Checks if Node.js is available for local token generation
349+ /// </summary>
350+ private static bool IsNodeJsAvailable ( )
351+ {
352+ lock ( _nodeJsCheckLock )
353+ {
354+ if ( _nodeJsAvailable . HasValue )
355+ return _nodeJsAvailable . Value ;
356+ NodeEnvironment ? testEnv = null ;
357+ try
358+ {
359+ _logger . Trace ( "Checking Node.js availability..." ) ;
360+ testEnv = new ( ) ;
361+ _nodeJsAvailable = true ;
362+ _logger . Debug ( "Node.js environment is available for local token generation" ) ;
363+ return true ;
364+ }
365+ catch ( Exception ex )
366+ {
367+ _nodeJsAvailable = false ;
368+ _logger . Warn ( ex , "Node.js environment is not available for local token generation: {Message}" , ex . Message ) ;
369+ return false ;
370+ }
371+ finally
372+ {
373+ testEnv ? . Dispose ( ) ;
374+ }
375+ }
376+ }
377+
362378 public static void ClearCache ( )
363379 {
364380 _cachedTokens = null ;
0 commit comments