github smokin-salmon/smoked-salmon 0.10.0

latest release: 0.10.1
2 months ago

This is a major modernization release focused on rewriting the codebase with modern async patterns and comprehensive type safety.

⚠️ Breaking Change: emp Image Uploader and WebDAV Seedbox Support Removed

Images hosted on jerking.empornium.ph can no longer be loaded from other sites, so the emp image uploader has been removed. Please switch to an alternative image host. WebDAV support was deprecated several versions ago and has now been officially removed — use rclone to connect to your WebDAV server instead.

🔄 Modern Async Architecture

The entire codebase has been rewritten to use fully asynchronous I/O patterns:

  • All import-time asyncio loop usage has been replaced with proper async/await patterns
  • CLI migrated to asyncclick for consistent async entry points
  • File I/O migrated to anyio.open_file and anyio.Path
  • All subprocess calls migrated to anyio with proper async handling
  • HTTP client unified to aiohttp (replacing httpx and synchronous requests)
  • Rate limiting migrated from ratelimit to aiolimiter

🎵 Audio Processing Improvements

  • ffmpeg is no longer required as an external dependency. All audio processing (log analysis, MQA detection, transcoding) has been migrated to PyAV, which is bundled as a Python package.
  • MQA detection rewritten with PyAV and NumPy, removing the custom FLAC decoder
  • Audio log analysis now uses PyAV instead of ffmpeg subprocess calls
  • Transcoding pipeline rewritten with anyio for proper async execution
  • Cover image validation migrated from filetype dependency to Pillow

✨ New Features & Improvements

  • Added smoked-salmon upload footer to release descriptions
  • Use bit-depth-specific icons in torrent descriptions — 16-bit lossless and 24-bit releases now use distinct markers
  • Add alpha Docker image build workflow — every commit is now automatically pushed as an alpha image
  • Network request exceptions during tracker uploads can now be retried
  • Requests list now filtered to Music requests only
  • Add Discogs collection hint in metadata search results — see if a release is in your collection before uploading
  • Extend yes_all to auto-confirm folder rename prompt and downconversion

🐛 Bug Fixes

All reported bugs since 0.9.7.4 have been addressed. Due to the large-scale rewrite, some features may still behave unexpectedly — please report any crashes or issues you encounter.

  • Fix upload failure when using cookie-only authentication — uploading to an existing group no longer prompts Please enter at least one main artist (200)
  • Fix image upload retry mechanism not working — image hosting uploads now retry on exception
  • Fix asyncio.run(asyncio.gather()) crash on Python 3.13+
  • Fix import-time asyncio loop usage for Python 3.14 compatibility
  • Fix dupe checker for trackers missing remastered field — now uses remasterRecordLabel/catalogueNumber
  • Fix crash when attempting to embed cover art into non-FLAC files
  • Fix skipping seedbox upload when exiting after uploading to another tracker
  • Fix FLAC integrity check always reporting success on newer versions of flac
  • Fix crash when incomplete files are detected during upload
  • Fix MQA detection result being silently ignored
  • Fix various typos, uninitialized variables, and incorrect calls caused by lack of type annotations in the old codebase

🔒 Type Safety Improvements

  • Full basedpyright type checking integrated into CI
  • Removed all # type: ignore comments — all type issues resolved
  • Version file migrated from version.py to TOML format

🖼️ Image Hosting

  • Removed emp image uploader (service no longer works)
  • Added imgbox and imgbb as new image hosting options

What's Changed

New Contributors

Full Changelog: 0.9.7.4...0.10.0

Don't miss a new smoked-salmon release

NewReleases is sending notifications on new releases.