• v0.10.1 c882454579

    joezombie released this 2026-06-18 09:29:21 +00:00 | 22 commits to main since this release

    Changes

    • UI moved under /ui — the dashboard no longer shares a base path with the RSS feed. All dashboard pages, login (/ui/login), and logout (/ui/logout) live under /ui; bare / redirects to /ui. The RSS/media feed stays at /feed and is now cleanly separated.

    🤖 Generated with Claude Code

    Downloads
  • v0.10.0 cccd65b61d

    joezombie released this 2026-06-17 22:27:54 +00:00 | 24 commits to main since this release

    Features

    • Clear & Resync from Playlist — per-feed action that wipes Episode rows and DownloadedVideo tracking (non-destructive; MP3 files on disk are kept), then triggers an immediate playlist re-poll. Existing files are re-matched; only missing videos re-download.
    • Dashboard UI redesign — restyled the MudBlazor dashboard to the warm-dark Castr design (accent #ef6b41, Hanken Grotesk + JetBrains Mono, sidebar layout, stat cards, feed card grid, status pills, restyled login). All functionality, routes, SignalR, and timers preserved.

    🤖 Generated with Claude Code

    Downloads
  • v0.9.2 546b17265a

    v0.9.2 Stable

    joezombie released this 2026-02-22 21:11:29 +00:00 | 29 commits to main since this release

    Bug Fixes

    • Fixed settings page showing 1.0.0.0 instead of the real version — now reads AssemblyInformationalVersionAttribute which contains the version embedded at build time
    • Fixed docker build without APP_VERSION failing due to 0.0.0-dev being passed to -p:Version (which requires numeric-only format) — the pre-release suffix is now stripped for AssemblyVersion while preserved in InformationalVersion
    • Added empty-string guard in Dockerfile so a blank APP_VERSION build arg fails loudly at build time rather than silently embedding an empty version
    Downloads
  • v0.9.1 bdc9618a82

    v0.9.1 Stable

    joezombie released this 2026-02-20 22:40:54 +00:00 | 32 commits to main since this release

    Bug Fixes

    • Fixed Docker build failing with 'v0.9.0' is not a valid version string — MSBuild reads environment variables as properties, so the VERSION build arg was being picked up as the Version MSBuild property. Renamed to APP_VERSION to avoid the collision. The v prefix is now stripped via sed before embedding in InformationalVersion.
    Downloads
  • v0.9.0 89008bc687

    v0.9.0 Stable

    joezombie released this 2026-02-20 22:30:47 +00:00 | 33 commits to main since this release

    What's New

    Bug Fixes

    • Fixed feed thumbnail fallback selecting the oldest episode instead of the latest: selection now uses PublishDate descending rather than playlist position, so newest-first YouTube playlists show the correct cover art
    • Fallback log messages now include the episode filename and publish date for easier debugging

    Other

    • Binary now embeds the release version — visible in startup logs as Castr v0.9.0 started
    Downloads
  • v0.8.0 514f821793

    v0.8.0 Stable

    joezombie released this 2026-02-20 19:57:08 +00:00 | 35 commits to main since this release

    What's New

    Feed Thumbnail Fallback

    • When a feed has no configured image URL, the RSS channel image now automatically falls back to the latest episode's YouTube thumbnail
    • Secondary fallback to embedded album art if no thumbnail URL is available
    • Ensures podcast clients always show artwork even for unconfigured feeds

    Bug Fixes

    • Fixed potential null reference on thumbnail URL assignment after predicate guard
    • Fixed feed names with spaces or special characters producing malformed artwork URLs (missing Uri.EscapeDataString on feed name segment)
    • Improved observability: fallback image selection now logged at Information level instead of Debug
    • Added Warning log when a feed has no image source at all, making missing artwork easier to diagnose
    Downloads
  • v0.7.0 919e43897d

    v0.7.0 Stable

    joezombie released this 2026-02-15 23:40:03 +00:00 | 37 commits to main since this release

    What's New

    Extended Episode Metadata

    • Extract 8 additional ID3 tag fields from audio files via TagLib: artist, album, genre, year, track number, bitrate, subtitle, and embedded art detection
    • New metadata fields displayed in the episode details dialog
    • Backfill logic automatically populates new fields for existing episodes on next sync

    Embedded Album Art Endpoint

    • New GET /feed/{feedName}/artwork/{filePath} endpoint serves embedded album art directly from MP3 files
    • 24-hour response caching for optimal performance
    • Path traversal protection and input validation

    RSS Feed Enhancements

    • RSS feed falls back to the artwork endpoint for <itunes:image> when no YouTube thumbnail exists but the file has embedded art
    • Per-item <itunes:author> included when artist metadata is available
    • Per-item <itunes:subtitle> included when subtitle metadata is available

    Other

    • Added dotnet-tools.json manifest for dotnet-ef
    Downloads
  • v0.6.0 0a440766b8

    v0.6.0 Stable

    joezombie released this 2026-02-14 23:48:36 +00:00 | 40 commits to main since this release

    What's New

    Force Resync Button

    • Added a Force Resync button to the feed edit page for manually triggering directory sync
    • Shows count of new files discovered after sync
    • Validates directory exists before syncing — no more silent success on missing directories
    • Includes detailed error messages on failure
    • Re-entrancy guard prevents concurrent sync operations

    API Changes

    • SyncDirectoryAsync now returns int (count of new files synced) instead of void
    Downloads
  • v0.5.0 86093f3ac4

    v0.5.0 Stable

    joezombie released this 2026-02-14 23:07:44 +00:00 | 43 commits to main since this release

    What's Changed

    New Features

    • Recursive subfolder scanning for feed directories — Feeds now support a configurable DirectorySearchDepth setting (0-4) to discover media files in nested subdirectories (e.g., season folders). Files are stored with relative paths and served via updated media endpoints.
      • New DirectorySearchDepth field on Feed entity with EF Core migration
      • Media endpoint updated to catch-all route ({**filePath}) for subfolder paths
      • RSS enclosure URLs encode each path segment individually to preserve / separators
      • Dashboard UI field for configuring search depth (0 = root only, 1-4 = subfolder levels)
      • 8 new tests added (170 total passing)

    Security Hardening

    • Server-side validation for directory search depth — [Range(0, 4)] annotation and Math.Clamp prevent excessive recursive enumeration via direct DB/API manipulation
    • Symlink protection in file enumeration — Resolved paths are checked against the feed root directory, preventing symlinks from escaping the intended directory boundary

    Full Changelog: https://github.com/joezombie/castr/compare/v0.4.0...v0.5.0

    Downloads
  • v0.4.0 dbce039024

    v0.4.0 Stable

    joezombie released this 2026-02-14 22:00:44 +00:00 | 47 commits to main since this release

    What's Changed

    Improvements

    • Move file metadata reading from feed service to sync service — ID3 tag metadata (title, duration, file size) is now read once during directory sync and persisted in the database, instead of being re-read on every RSS feed generation. This simplifies PodcastFeedService to pure database reads and improves feed generation performance.
      • New Title, DurationSeconds, FileSize columns on Episode entity with EF Core migration
      • YouTube metadata takes priority over ID3 tag values
      • PodcastFeedService no longer depends on TagLib or performs directory scanning
      • 6 new tests added (163 total passing)

    Full Changelog: https://github.com/joezombie/castr/compare/v0.3.0...v0.4.0

    Downloads