53c0dcc256
Each search/download called asyncio.run, creating and closing a fresh event loop. streamrip's module-global download-concurrency Semaphore binds to the loop on first use, so the 2nd+ download reused a Semaphore bound to a closed loop -> "Semaphore is bound to a different event loop", tracks failed, album arrived short -> "incomplete download" / needs_attention. Run all streamrip coroutines on one persistent loop. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>