Skip to content

feat: iOS support, torrent search & downloads, media player, podcast pipeline#5

Open
rodolfo-arg wants to merge 12 commits into
nichind:mainfrom
rodolfo-arg:feat/ios-support-torrent-search-podcast
Open

feat: iOS support, torrent search & downloads, media player, podcast pipeline#5
rodolfo-arg wants to merge 12 commits into
nichind:mainfrom
rodolfo-arg:feat/ios-support-torrent-search-podcast

Conversation

@rodolfo-arg

@rodolfo-arg rodolfo-arg commented Mar 11, 2026

Copy link
Copy Markdown

Summary

iOS Support

  • Add local network entitlements and permissions for localhost server access
  • Add NSLocalNetworkUsageDescription and NSBonjourServices to Info.plist

Torrent Search and Downloads

  • TorrentClaw search integration with filters (content type, quality, sort)
  • Torrent file picker for manual file selection from multi-file torrents
  • Individual file downloads - each selected file starts its own download
  • Persist torrent search state (query, filters, results, scroll) across navigation
  • Pass prefetched title/thumbnail to backend for correct episode metadata
  • Fix output path resolution - use aria2 FILE: detected path for single-file torrents
  • Fix MEMORY metadata lines being counted as download completions
  • Add --seed-time=0 to prevent aria2 hanging after torrent download
  • Increase --bt-prioritize-piece tail from 1M to 32M for MP4 moov atom playback
  • Torrent downloads always open in VLC (system player)

Media Player

  • FFmpeg media streaming for non-HTML5 formats (real-time remux)
  • MKV files delegate to VLC on desktop
  • Open files in VLC specifically on macOS instead of system default
  • Fix error/loading overlay overlap during FFmpeg transcoding
  • HEVC transcoding support

Podcast Pipeline

  • Edge-TTS dependency for text-to-speech
  • Podcast subtitle fallback
  • Live lyrics display with Spotify-style word highlighting
  • Fix VTT/SRT subtitle parsing (content-based format detection)

UI Fixes

  • Fix sort button height clipping (match 36px chip height)
  • Fix speed chart overlapping first download entry (relative positioning)
  • Fix torrent file picker background to match dynamic theme
  • Add padding between torrent file picker items
  • Fix lyrics spacing and centering
  • Add Enter key handler on home page search input for torrent search

Backend

  • librqbit torrent backend integration
  • Queue type fix for torrent downloads
  • Torrent search sizeBytes type and contentType field name fixes

Test plan

  • iOS: App launches with local network permissions
  • Torrent search: Search, filter, navigate to detail and back (state persists)
  • Torrent download: Select single file - correct title, format, file path
  • Torrent download: File opens in VLC (not QuickTime)
  • MKV playback: Opens in VLC on desktop
  • MP4 torrent: Playable in VLC while downloading (moov atom prioritized)
  • Downloads page: Sort button not clipped, speed chart does not overlap
  • Home page: Type non-URL text + Enter goes to torrent search

rodolfo-arg and others added 10 commits March 11, 2026 12:14
Major feature additions:

- iOS target: Tauri iOS init, Xcode project generation, cfg gate
  refactoring (android → mobile/desktop), iOS stubs for all
  platform-gated subsystems, Apple Developer team config (365KJHJCW7),
  Swift compatibility linker fix for Xcode 26

- TorrentClaw integration: search/autocomplete/file-listing commands,
  aria2 sequential downloading (bt-prioritize-piece), file selection
  UI with TorrentSearch, TorrentDetail, TorrentFilePicker components

- Podcast pipeline: YouTube transcript via yt-dlp (replaces whisper),
  VTT-to-plaintext parser, Claude CLI script generation, edge-tts
  narration, PodcastSettings UI component, auto-generate on download

- edge-tts dependency: pip-based install via podcast-venv, full dep
  spec with check/install/uninstall, progress events

- Platform detection: isIOS()/isMobile() frontend helpers, updated
  all mobile-vs-desktop guards across 15+ components/stores

- Mobile capabilities: shared Android+iOS capability file

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…gs padding

- sizeBytes: Option<String> → Option<u64> to match API integer response
- Removed explicit #[serde(rename = "type")] — let camelCase handle contentType
- Added response text logging on parse failure for debugging
- Mobile logs: 96px bottom padding (clears floating nav), 5px entry gap

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…eue type fix

- Rewrite media_stream.rs: temp file approach with multi-connection support,
  FFmpeg stderr logging, pre-buffer verification, CancellationToken shutdown
- Add librqbit backend for native torrent/magnet support (lazy session init,
  Priority::Absolute on iOS where aria2 is unavailable)
- Fix queue type bug: Added event now patches item type from backend
  (fixes play button not appearing for torrent downloads)
- iOS: use dirs::document_dir() for default download path, play all formats
  via convertFileSrc (WebView handles MKV through system codecs)
- Player: mobile uses direct playback, desktop uses FFmpeg streaming for
  non-HTML5 formats (MKV, AVI, etc.)
- TorrentDetail, DownloadItem, MediaPlayer UI enhancements

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lyrics

- Transcode HEVC/x265 video to H.264 for WebKit compatibility (ffprobe codec detection)
- Add Whisper as managed dependency sharing podcast-venv with edge-tts
- Smart subtitle language fallback: configured lang → all languages → Whisper transcription
- Update podcast Claude prompt for English output, no meta-commentary
- Add Spotify-style live lyrics overlay for podcast playback (LyricsView component)
- Word timing interpolation from phrase-level VTT cues with O(log n) binary search
- Auto-detect SRT content in .vtt files (edge-tts format mismatch fix)
- Fix lyrics spacing and centering alignment

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Match Select row height to 36px (was 40px) so sort button fits toolbar
- Remove vertical padding from TableHeader to match chip button height
- Change speed sparkline from absolute to relative positioning so it
  pushes content down instead of covering the first download entry

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…rsistence, UI fixes

- Open video files in VLC instead of system default (macOS: open -a VLC)
- Fix torrent downloads stuck at 99% by adding --seed-time=0 to aria2
- Add iOS local network entitlements for localhost server access
- Persist torrent search state (query, filters, results, scroll) across navigation
- Individual torrent file downloads instead of bundled
- Torrent downloads always open in system player (VLC)
- MKV files delegate to VLC on desktop
- Fix MKV player error/loading overlay overlap
- Fix torrent file picker background to match dynamic theme
- Add padding between torrent file picker items

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Skip [MEMORY] metadata lines in extract_output_path to prevent
  counting torrent metadata as a real file completion
- When final path is a directory with exactly one file, resolve to
  the actual file instead of the directory

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add title/thumbnail fields to EnqueueOverrides so the backend knows
  the episode name when downloading individual torrent files
- Set prefetched title/thumbnail on Job in enqueue_url
- Pass prefetchedInfo through toOverrides to the backend
- Add Enter key handler on home page search input

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of scanning the torrent directory (which fails when multiple
files exist from previous downloads), use the actual file path from
aria2's FILE: output lines. This correctly resolves to the .mp4/.mkv
file, preserving extension and filename in history.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
MP4 files store metadata (moov atom) at the end, which can be 10-30MB
for large files. Increasing tail priority from 1M to 32M ensures VLC
can read codec info and play while still downloading.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@rodolfo-arg rodolfo-arg changed the title feat: iOS target, TorrentClaw search, podcast pipeline, mobile cfg refactor feat: iOS support, torrent search & downloads, media player, podcast pipeline Mar 12, 2026
rodolfo and others added 2 commits March 13, 2026 09:02
…iles app

- Fix iOS WKWebView bottom black bar via ObjC +load viewport fix
  (edgesForExtendedLayout, contentInsetAdjustmentBehavior)
- Add ComineLiveActivity widget extension for Dynamic Island/Lock Screen
  download progress display
- Add background audio keep-alive (silent audio + background task cycling)
  to prevent iOS from suspending downloads
- Enable Files app visibility (UIFileSharingEnabled, LSSupportsOpeningDocumentsInPlace)
- Fix torrent format badge showing full directory name (cap extension at 8 chars)
- Add Live Activity start/update/finish/stop via Rust-Swift FFI (dlsym)
- Add viewport-fit=cover for edge-to-edge display
- Add safe area padding for content areas
- Add XcodeGen widget extension target with proper embedding
- Add Claude Code tooling (agents, skills, CLAUDE.md files)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…tension fix

- Add mobile torrent file listing via librqbit list_only mode (SharedLibrqbitSession)
- Implement iOS "Open In…" sheet via UIDocumentInteractionController for file sharing
- Add EMA speed smoothing for librqbit to reduce iOS network buffering jitter
- Fix file extension parsing for bracketed filenames like [YTS.MX] (use known ext list)
- Hide codec/score columns on mobile torrent table to prevent overflow
- Show VLC overlay button during active torrent downloads on mobile
- Update CLAUDE.md with iOS build sequence (xcodegen + ios build --debug + ios-deploy)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant