Commit Graph

2306 Commits

Author SHA1 Message Date
Ashik K ed91d39ad9 Implement dual provider architecture (Jellyfin + Xtream)
Add support for running both Jellyfin and Xtream providers simultaneously:
- User can have 1 active JF account + 1 active XC account at same time
- Tabs dynamically show/hide based on active providers
- Account switcher allows switching between multiple saved accounts

New Components:
- XtreamSession: Session management for Xtream providers
- SessionManager: Tracks both JF and XC sessions
- XtreamView/ViewModel: New Xtream tab with Live TV categories
- TabCoordinator: Dynamic tab building based on active providers

Modified Components:
- MainTabView: Injects SessionManager, rebuilds tabs on provider changes
- TabItem: Added Xtream tab definition
- MediaViewModel: Excludes Xtream channels (now in Xtream tab only)

Scripts:
- Added .claude/scripts/create-issue.sh for Gitea issue creation

Closes: jellyflood-2 (partial)
Related: jellyflood-1, jellyflood-5

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 11:47:41 +02:00
Ashik K 1f5b1a52ff Update README and branding for jellyflood
- Rebrand from Swiftfin to jellyflood
- Remove iOS/TestFlight/App Store references (tvOS only)
- Update logo with pink gradient (#FF1493 to #FF69B4)
- Add Xtream plugin and EPG feature highlights
- Remove translation/community links
- Simplify to personal fork documentation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 09:27:55 +02:00
Ashik K 09a3ce15a0 Rename project from jellypig to jellyflood
Complete rebranding from jellypig to jellyflood including:
- Renamed all jellypig references to jellyflood
- Updated store implementations (jellypigstore -> jellyfloodstore)
- Moved jellypig tvOS to Swiftfin tvOS structure
- Updated service configurations and defaults
- Preserved all Xtream plugin support and EPG functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 09:14:33 +02:00
Ashik K fdd1cdc15b Implement Electronic Program Guide (EPG) for Live TV
Features:
- Full EPG grid with channels and time slots
- 12-hour program window with auto-refresh every 5 minutes
- Duration-based cell widths (3px/min)
- Live program highlighting with progress bars
- Current time indicator (red line)
- Direct channel playback from guide
- Auto-scroll to currently airing programs

Changes:
- Add EPGViewModel for data fetching and state management
- Add EPGProgramCell, EPGChannelRow, EPGTimelineHeader, EPGCurrentTimeIndicator components
- Update ProgramGuideView with complete EPG implementation
- Make Channels default Live TV tab (was Program Guide)
- Fix channel images in EPG to match Channels view display
- Fix Live TV playback crash (audioStreams array bounds check)
- Apply dark pink background throughout app

Slash Commands:
- Add /init-dev - Initialize dev session with project context
- Add /sim - Build and launch in Apple TV simulator

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 19:23:53 +02:00
Ashik K de349e213e Fix Release build - add SwiftGen xcassets generation
- Add SwiftGen configuration for xcassets to swiftgen.yml
- Generate Images+Generated.swift for type-safe image resources
- Fixes 'Type ImageResource has no member' errors in Release builds
- Generated file includes device icons, blob icons, and tomato ratings

This was needed because the asset catalog references were missing
the generated Swift code for type-safe access.
2025-10-17 16:20:04 +02:00
Ashik K 75d5ae890c Add alpha1 release summary 2025-10-17 14:57:35 +02:00
Ashik K f19c10c528 Revert video player to fullScreen - fixes playback controls
Reverted video player back to .fullScreen presentation:
- Changed @Route(.push) back to @Route(.fullScreen)
- Added NavigationViewCoordinator wrapper back
- Changed router.popLast() back to router.dismissCoordinator()

Video player MUST use fullScreen to:
 Properly stop playback on dismiss
 Show overlay controls on first ESC
 Exit and stop video on second ESC
 Prevent video playing in background after navigation

Files reverted:
- ItemCoordinator.swift: Video player route and factory
- Overlay.swift: dismissCoordinator on confirm close
- VideoPlayer.swift: dismissCoordinator on video end
- LoadingView.swift: dismissCoordinator on cancel

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 13:00:40 +02:00
Ashik K a6a03ea988 URGENT FIX: Video player back button now works
Changed all router.dismissCoordinator() calls to router.popLast() in video player:
- Overlay.swift: Back button when confirming close
- VideoPlayer.swift: Auto-exit when video ends
- LoadingView.swift: Cancel button during loading

dismissCoordinator() only works with .fullScreen/.modal presentations.
Since we changed video player to .push navigation, we need popLast() instead.

This fixes ESC/menu button not working during video playback.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:53:35 +02:00
Ashik K 0dcde5dd74 Fix video player back button - use push navigation
Changed video player from .fullScreen to .push navigation:
- Removed NavigationViewCoordinator wrapper
- Video player now returns VideoPlayerCoordinator directly

This should allow ESC/back button to work during video playback.

MediaCoordinator kept at .fullScreen to prevent Home screen navigation bug.

Trade-offs:
 Video player ESC should now work
 Pressing back from empty channel goes to Media tab (not Home)
 Error dismissal still returns to Media tab (dismisses entire .fullScreen presentation)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:49:26 +02:00
Ashik K 7c28c04048 Fix tvOS navigation - use push everywhere except Media tab channels
Changes:
- MediaCoordinator: Use .fullScreen for tvOS (full-screen display with navigation)
- HomeCoordinator, LibraryCoordinator, SearchCoordinator: Use .push without NavigationViewCoordinator wrappers
- Unified tvOS and iOS coordinator return types for push navigation

This fixes:
 Channels display full-screen (not modal popup)
 Login and settings use full-screen navigation
 Items from Home/Search display correctly

Known issues with .fullScreen presentation:
- Pressing ESC on error dismisses entire channel instead of going back one level
- Video player doesn't respond to ESC during playback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:42:42 +02:00
Ashik K d0a921d05c Fix login and settings screens on tvOS - use push navigation everywhere
Changed all modal routes to push in login and settings coordinators:
- SelectUserCoordinator: login flow, server connection, advanced settings
- UserSignInCoordinator: quick connect, security settings
- SettingsCoordinator: all settings pages (both iOS and tvOS)
- AppSettingsCoordinator: log viewer

All screens now use full-screen push navigation instead of modal popups.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:27:52 +02:00
Ashik K 8ad851ead1 Fix item detail views on tvOS - use push navigation instead of modal
Changed item routing from .modal to .push in HomeCoordinator, LibraryCoordinator, and SearchCoordinator. Individual media items (movies, episodes, etc.) now open full-screen instead of in modal dialogs.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:18:21 +02:00
Ashik K 54154b032f Fix channel display on tvOS - use full screen instead of modal popup
Changed MediaCoordinator routing from .modal to .push for tvOS to match native library behavior. All channels (Xtream VOD, Xtream Series, Live TV, etc.) now display in full-screen grid layout instead of a small centered modal window.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 12:02:14 +02:00
Ashik K 76453fe0ab Update bundle identifier to org.ashik.jellypig and fix SwiftGen script
Changes:
- Update bundle identifier from org.jellyfin.swiftfin to org.ashik.jellypig
  - Updated in project.pbxproj (4 occurrences)
  - Updated in LogManager.swift (logger label)
  - Updated in DataCache.swift (cache paths)
- Fix SwiftGen build script to skip gracefully without error
  - Changed "error:" to "note:" to prevent Xcode build errors
  - Script now exits cleanly when SwiftGen not installed (English-only fork)

This allows the app to be signed with a personal Apple Developer account
and built successfully without SwiftGen dependency.
2025-10-17 11:38:51 +02:00
Ashik K 9a78115a93 Add channel support and debug logging for Xtream content display
- Add .channel to BaseItemKind.supportedCases for proper filtering
- Implement channel API routing in ItemLibraryViewModel
- Add comprehensive debug logging to track API calls and filtering
- Support channels in MediaViewModel library views
- Fix channel items not appearing in media libraries

This enables Xtream plugin channels (VOD/Series) to display correctly
in jellypig tvOS. Channels now use proper /Channels API endpoints
instead of falling back to regular /Items API.

Related to ongoing fix for Xtream content media display.
2025-10-17 10:49:20 +02:00
Ashik K ab3773e4cc Remove helper script - not needed in repository 2025-10-17 09:54:00 +02:00
Ashik K e3bcd8638a Implement channel navigation for Jellyfin plugin channels
- Modified ItemLibraryViewModel to detect channel/channelFolderItem types
- Added getChannelItems() method to use Paths.getChannelItems API for channels
- Channel folders now use channelID and folderID parameters correctly
- Modified PagingLibraryView to route .channelFolderItem to library grid view

This enables proper navigation for Jellyfin.Xtream plugin channels:
Channel → Grid of Categories → Grid of Content → Item Detail

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 09:53:23 +02:00
Ashik K f1615f9078 Change Jellyfin blob logo from blue to pink
Changed the jellyfin-blob.svg gradient from blue (#1F4EA7 to #00DDFF)
to bright pink (#C8197C to #FF1493) to match the jellypig branding.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 09:43:59 +02:00
Ashik K 9fbb2c6731 Add device icon assets and install SwiftGen
- Added DeviceIcons from upstream to tvOS assets catalog
- Built and installed SwiftGen 6.6.3 from source to /opt/homebrew/bin
- Build now succeeds with all ImageResource references resolved

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 09:42:13 +02:00
Ashik K c30a4e9c23 Rename all Swiftfin files to lowercase jellypig
- Renamed SwiftfinApp.swift to jellypigapp.swift
- Renamed SwiftfinStore/ to jellypigstore/
- Renamed all SwiftfinStore files to jellypigstore
- Renamed SwiftfinDefaults.swift to jellypigdefaults.swift
- Renamed VideoPlayerType+Swiftfin.swift to VideoPlayerType+jellypig.swift
- Updated all project.pbxproj file references to match new names

All file names now use lowercase jellypig for consistency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 09:28:57 +02:00
Ashik K 86b6814f0a Fix file references and SwiftGen script
- Revert SwiftfinApp/SwiftfinStore file name changes (files weren't renamed, only refs)
- Change SwiftGen error to warning and exit 0 instead of return 1
- Allows build to continue without SwiftGen installed (English-only fork)
2025-10-17 09:23:00 +02:00
Ashik K 10895d1b8c Change app icons from blue to bright pink
- Converted all 14 tvOS icon PNG files from blue to hot pink
- Applied to app icons, top shelf images, and App Store icons
- Distinguishes jellypig from upstream Swiftfin visually
- Used Python script with Pillow for color transformation
2025-10-17 09:05:13 +02:00
Ashik K fe8e0487a9 Remove iOS code and target - tvOS only fork
- Removed entire jellypig iOS directory
- Removed jellypig iOS.xcscheme
- jellypig is now tvOS-only for Apple TV usage
- Focusing on Jellyfin.Xtream plugin compatibility
2025-10-17 08:51:26 +02:00
Ashik K 65d5a4b176 Rename Swiftfin to jellypig - personal fork for custom use cases
- Renamed Swiftfin.xcodeproj → jellypig.xcodeproj
- Renamed directories: Swiftfin tvOS → jellypig tvOS, Swiftfin → jellypig iOS
- Renamed schemes: Swiftfin tvOS → jellypig tvOS, Swiftfin → jellypig iOS
- Updated all references in project.pbxproj and scheme files
- tvOS-focused personal fork for Jellyfin.Xtream plugin usage

License: MPL-2.0 (allows forking and modifications)
2025-10-17 08:50:39 +02:00
Ethan Pippin d4412badc4 Update Fastlane runner (#1624) 2025-07-06 20:11:20 -06:00
Sam d9227deafe Fetch correct server when updating info (#1623) 2025-07-06 20:11:20 -06:00
Alexandre Perera 8fbc7fec3e Translated using Weblate (Catalan)
Currently translated at 59.0% (492 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ca/
2025-06-09 07:01:35 +00:00
Pere 4798faa8a0 Translated using Weblate (Catalan)
Currently translated at 59.0% (492 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ca/
2025-06-09 07:01:34 +00:00
aniara001 1f5bcfec6a Translated using Weblate (Swedish)
Currently translated at 54.6% (455 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/sv/
2025-06-09 07:01:34 +00:00
tobylibo 0feb7d0738 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 36.3% (303 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/zh_Hans/
2025-06-09 07:01:33 +00:00
Ethan Pippin 5d4eb640ee
Update release.yml (#1561) 2025-06-08 13:16:46 -06:00
Pere 7bf40ab7f3 Translated using Weblate (Catalan)
Currently translated at 41.6% (347 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ca/
2025-06-08 02:01:34 +00:00
cicirubi 56de4f5414 Translated using Weblate (Turkish)
Currently translated at 31.5% (263 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/tr/
2025-06-08 02:01:33 +00:00
Alexander a0275a2431 Translated using Weblate (Russian)
Currently translated at 43.0% (359 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ru/
2025-06-08 02:01:33 +00:00
tct123 97fc8b1360 Translated using Weblate (German)
Currently translated at 100.0% (833 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/
2025-06-06 17:04:08 +00:00
Kebbino c8dde0c156 Translated using Weblate (Italian)
Currently translated at 45.3% (378 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/it/
2025-06-06 10:48:42 +00:00
Fity Yang 027efe2185 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 36.0% (300 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/zh_Hans/
2025-06-06 04:02:41 +00:00
Fity Yang 4cef6f3e19 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 34.4% (287 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/zh_Hans/
2025-06-06 01:41:16 +00:00
Joe Kribs e43efdce04
Default to Recursive mirroring prior to #1495. Resolves: https://github.com/jellyfin/Swiftfin/issues/1557 (#1558) 2025-06-05 13:04:51 -06:00
Fity Yang d491417cfc Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 34.3% (286 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/zh_Hans/
2025-06-05 14:39:47 +00:00
Sander Scheijvens 96e1602750 Translated using Weblate (Dutch)
Currently translated at 100.0% (833 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/nl/
2025-06-05 02:03:06 +00:00
Joe Kribs 99011b5c92
Cinematic Episode Image (#1556) 2025-06-03 18:27:01 -06:00
Finn Drünert 4976c1fd70 Translated using Weblate (German)
Currently translated at 97.4% (812 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/
2025-06-03 22:29:49 +00:00
Quang c1563e52d3
Played/Unplayed status for "Collection" and "TV Shows" (#1495)
* off recursive

* pr feedback

* Cleanup

Instantiate the collectionType in the `if let` since failure to cast `as? BaseItemDto` should count as false as well. Only set `parameters.isRecursive` once in if/else opposed to if -> override.

* wip

* fix recursive and item kinds

* rename, fix folders

---------

Co-authored-by: Quang <quang.ha@a2:3c:68:56:26:8d.home>
Co-authored-by: Joe <jpkribs@outlook.com>
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
Co-authored-by: Quang <quang.ha@QrM3P.local>
2025-06-03 15:42:11 -06:00
Nicolas DA SILVA a1cbc2a132
Reverting to VLCKit 3.5.0 | solving OPUS issue (#1552) 2025-06-03 15:41:58 -06:00
Tostoto 955cda86d7 Translated using Weblate (Russian)
Currently translated at 42.9% (358 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ru/
2025-06-03 15:38:50 +00:00
scapade d733a94071 Translated using Weblate (Finnish)
Currently translated at 46.9% (391 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/fi/
2025-06-03 10:33:24 +00:00
scapade 11824cf828 Translated using Weblate (Finnish)
Currently translated at 45.6% (380 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/fi/
2025-06-02 14:41:31 +00:00
Kityn 75a6649e08 Translated using Weblate (Polish)
Currently translated at 100.0% (833 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/pl/
2025-06-02 14:41:30 +00:00
Henri De Plaen 75bd6a9cae Translated using Weblate (French)
Currently translated at 99.2% (827 of 833 strings)

Translation: Swiftfin/Swiftfin
Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/fr/
2025-06-01 14:01:33 +00:00