* Cleanup / Genre & Tag Management
* Move searching to a backgroundState. Fix the font Color when bulk editing tags / genres should be secondary when editing & not selected
* Cleanup
* Now that cancelling is handled better this should prevent the issue where the suggestions fails to update on a letter entry
* Change from using an event for searchResults to using a published searchResults var
* Moved all logic to a local list where all genres/tags are populated on refresh then filterd locally instead of calling the server for changes.
* Inheritance
* Split metadata from components then alphabetize. Also, fix but where you can't add a people
* People & Permissions
* Functional but dirty. TODO: Cleanup + Trie? Trei?
* nil coalescing operator is only evaluated if the lhs is nil, coalescing operator with nil as rhs is redundant
* TODO: Search improvements & Delay search on name change
* Cleanup & reordering
* Debouncing
* Trie implementation
* Permissions Cleanup Squeezing in: https://github.com/jellyfin/jellyfin-web/issues/6361
* enhance Trie
* cleanup
* cleanup
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* ServerUserAdminViewModel cleanup & testing. ServerUserAccessView.
* Change the enableAllLibraries to use the binding extensions
* Use coalesce for enableAllFolders & enableContentDeletion
* use contains binding
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Playback Quality - Learn More
* TODO: Fix leading not working on second line.
* Remove layoutDirection.
* Implement for tvOS. Slightly different spacing.
* VStack
* WIP - tvOS Implementaiton. SUBJECT TO CHANGE / ELIMINATION.
* Background Icon & formatting
* wip
* Review Changes. Remove unused Strings, clean up comments.
* Remove duplicate items used for testing
* Remove tvOS scrollIfLargerThanContainer for now.
* Edit Text-based Metadata
* ViewModel Cleanup
* use binding extensions
* Huge overhaul:
- Fix the notification when metadata was updated to work with 100% consistency
- Flip the locking to be true -> lock like server
- Redo the whole itemEditorViewModel to be more in-line with other viewModels | also fixes iPad weirdness
- Use itemViewModel for the edit view so I can just reuse those existing notifications instead of recreating the wheel
- More human dates for people - Date of death instead of "End date" (yikes)
* String fixes & overview size
* Fix build issues & String cleanup
* fix overview sizing, cleanup
* itemMetadataWasEdited -> temMetadataDidChange
* Creation of the NavigationBarMenuButtonModifier for an "ellipsis.circle" menu object in the toolbar. Makes it easier to ensure that this format looks the same throughout.
* Custom vs Official Rating + Menu Button Label change
* Menu button spacing and groundwork for other menu items (canDownload) since we already have the bool available. Currently disabled.
* Linting
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* WIP
* WIP
* Localization and better planning. Remove the Username as this will end up in another section. Updated planning here: https://github.com/jellyfin/Swiftfin/discussions/1283 | 5 more views required!
* Initializing an optional variable with nil is redundant line
* Remove Live TV since that will go in another section
* Cleanup Coordinator / Merge with Main
* Remove all 'Allows' from strings
* Fix Merge Issues
* Use CaseIterablePicker, Binding.map
* BackgroundState == updating, change all of the buttons to visible when custom by process of elimination opposed to the default custom value. Make all of the input fields use temp values to make it less jarring.
* Update SessionsSection.swift
* Learn more!
* Validate > 0, don't allow inputs to be less than 1 and reset tempValues when the enum is updated.
* use new binding extensions
* String fixes
* Don't test against adminDefault for users or userDefault for admins.
* Linting indentation
* Default vs UserDefault + no more reason to have temporary variables.
* cleanup
* format
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* [iOS] Creation of the enableItemEditor & enableItemDeletion settings. Creation of the ItemEditorView. Creation of Refresh/Deletion Logic and Buttons. Wrap buttons in permissions.
* You can make delete permissions without edit (admin) permissions. So, flip this so you can get to the edit page but editing is disabled if you're not an admin. The Delete option requires that the delete toggle is enabled and the user has permissions.
* Move deletion from the editView to the ItemView
* Delete from PagingLibraryView on Deletion
* Only enable delete if the user can delete something. Check deletion permission on Item level. Only allow editing for admins.
* Review Changes: ec33a6b63c
* wip
* Update RefreshMetadataButton.swift
* Update Shared/ViewModels/ItemEditorViewModel/RefreshMetadataViewModel.swift
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Update Shared/Coordinators/ItemEditorCoordinator.swift
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Reviews minus a learn more button
* LearnMoreAttempt v1
* Learn more v2 - Much better
* Learn More v3
* Learn More comments cleanup
* Learn More: https://github.com/jellyfin/Swiftfin/pull/1310#discussion_r1843149572
* clean up
* Remove Replace since it's already covered. Localize.
* clean up
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* resetUserPassword Adjustments
* Nest the Password in Advanced because I dunno it looks nicer.
* Dismiss Coordinator instead of pop.
* Build issues
* Rename my local xcode to xcode_16???
* Build plz
* Comments
* clean up
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Migrate all files from UserDashboard to AdminDashboard. Rename accordingly since this is an admin only function. Move all AdminDashboard items from SettingsCoordinator to their own AdminDashboardCoordinator. Move all ViewModels to ONLY live inside of the iOS build since tvOS is
* cleanup
* fix for sub navigation
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Partially resolve color todo
* Update localizations for quick connect steps. use bulleted list
* Same change for tvos
* Remove padding2 modifier
* Localisation
* API Keys
* Switch Deletion Alert for a Confirmation Dialog
* Migrate from a list to a Collection VGrid.
* Convert back to List. Also, now using my events! So, there is a confirmation and a failure message for both delete & create API.
* want vs wish
* Merge Issue Fixes
* Review Changes
* Reset newAPIName after creating a new API
* cleanup
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* All Working. TODO: Figure out why TimeInterval crashes Swiftfin if I select 'Cancel'
* Cleanup. Kind of a typeAlias but not really? Fixed the minute crash, I was make a recursive calc. All good now. Make sure temp values default to existing value at startup
* Manual Run action from Edit View
* Issues resolved.
* Labels / soft merge with Main
* Utilize events to print a success/failure message for when there is an attempted change with a TaskTrigger.
* Fix label wrong value & remove TODO for completed item.
* Fix all the merge issues.
* wip
* wip
* localize
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Split out Devices Logic - Ready to go!
* Review Items + Reworking the deleteDevices logic to all use the same deleteDevice core + deleteDevices. Delete All Devices now just uses the more generic deleteDevices
* Allow Filtering on UserID for later usage on UserDetailView.
* Fully remove DeleteAll action in favor of Delete Devices. Change view to pass in the viewModel.devices as a 'Delete All' function
* DeviceDetailsView
* Section Split out, Localization, and cleanup.
* I guess I missed there on first upload.
* Initial Select All / Delete Devices logic. Checkbox options on the list. Hopefully this is good.
* Initial Review Item!
* Custom Device Name is now a field. Change DevicesViewModel to Eventful to capture updates
* Revised Device Interaction Buttons
* Remove unused Label.
* Make DeviceRow mirror UserRow. UpdateDevicesView to have DeleteButton when in EditMode. Also, it's EDITMODE not SELECTMODE... Finally, make sure the SelectedDevice and SelectedDevices are both empty if the user tries to delete themselves and fails. Change how the single device delete works to confirm deleting from an array still works as needed.
* wip
* Review Changes: 61b3716239
* Merge issues + testing again to make sure. Checks out.
* wip
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Add Device images & Reference using the Enum as a filler if the NowPlayingItem is Nil
* Localize DeviceTypes.DisplayTitles
* Review changes. Last potential TODO: Image: ImageResource might not be the correct format
* DeviceType is needed to build tvOS
* Mirror Jellyfin-Blue-Blob for SVG configuration. Use ImageResource for the Device/Client Images
* Merge missing }
* Don't recreate the ImageResource since it's already generated.
* New webOS logo! Fix tvOS not having the new logos
* use if let, implicit self
* use secondary system fill for other
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Creation of an Alert Input Button based on the Chevron Button.
* Only one button required for both iOS and tvOS
* wip
---------
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Rebasing https://github.com/jellyfin/Swiftfin/pull/1212 on Main. Also, less baggage and random crap.
* Change 0 to Disabled. Better mirror iOS and tvOS Alerts for MaxNextUpDays.
* Review Changes:
Don't use the property wrappers in non-view contexts. While they technically can still work, use the subscript instead at the usage sites.
Use the dayInterval(0 ... 1000) format instead, then we don't need maxNextUpDays.
* Remove unused strings, and unused variables
* Add a tvOS TODO to double check the Done/Number button on the alert.
* Rename ExperimentalSettingsView.swift to PlaybackQualitySettingsView.swift
Fix Merge
* Rename MaximumBitrateSettingsView.swift to PlaybackQualitySettingsView.swift
fix merge
* Re-implement on Main. Should now have all the Main changed. Added a new change to use the Device Profile as a Transcoding Profile.
* Part 1 -> Making VideoPlayerType into a struct (I Hope) correctly
* Part 1.1 -> Making VideoPlayerType into a struct (I Hope) correctly
* Remove unneeded Files
* Missing file + CustomDeviceProfileSelection -> CustomDeviceProfileAction Rename
* Change + to Appending
* Attempt to add StorageValues+User. Not sure if this is correct?
* Move the Array unwrapping to funcitons. Not required but this should help prevent accidently doing this wrong. Add subtitles back into the custom profiles since that somehow got dropped. Added a PlaybackCompatibility enum. This might need to work for more than just video
* Complete rewrite to allow multiple profiles, compatibility mode, and directplay.
* Hardward -> Hardware
* Update CustomDeviceProfileSettingsView.swift
Double Licensing
* It was actually really easy to implement iOS... Trash cans still look weird and small.
* Swipe to Delete instead of the edit button
* wip
* wip
* Linting
* tvOS Implementation
* wip
* wip
* cleanup
* Create Package.resolved
---------
Co-authored-by: Joseph Kribs <joseph@kribs.net>
Co-authored-by: Ethan Pippin <ethanpippin2343@gmail.com>
* Creation of bitrate selections that mirror Jellyfin-Web. The goal is to eventually allow for these same selections to be available for usage in the Player itself to set the max bitrate per playback session. This App-Wide setting is for things like preserving data (Mobile) or for areas that have perpetually have low bandwidth (AppleTV). These settings currently default to 'Auto' which is the current limit of 360,000,000 bps / 360 mpbs. I have added a spot in BaseItemDTO+VideoPlayerViewModel to get the smaller amount between 360 Mpbs and the App Maximum Setting. This exists so I can go back and update this to get the Minumum between the Player Session max bitrate and the App Setting max bitrate.
Test on iPhone 10S, AppleTV 3rd Gen, and the iPhone 15 Pro via enumulator.
* Fix Bitrate naming (360p vs 480p) and remove the setting nested in a second section.
* Creation of a Maximum setting with 360mbps and an auto that gets the bitrate at playback.
* Remove comments for code where I want to eventually put it for better clarify
* Linting fixes
* Change the Playback Bitrate to an Int from a String since the Bitrate is valuable but the string isn't. Run the SwiftFormat on the maxBitrate function.
* Migrate the settings to their own menu with both the bitrate and the optional test size when auto is used.
* Creation of an enum filterValues function for Bitrate. This way, the selection on the Player Overlay (eventually) can be filtered to only include bitrates that are less than or equal to the App Setting for Maximum Bitrate. This should help prevent confusion / remove bandwidth conflicts.
The eventual Player Overlay setting should never conflict with the App-Wide Setting and should only offer options that are less than the App-Wide Setting.
* Change the videoPlayerViewModel to take parameters instead of defaults. Move the defaults up one level to be called there. Split the bitrate test from the getMaxBitrate to better guard against dividing against 0 and also split out the logic to be easier to read.
Change the PlaybackBitrate filter to always include Auto and, when auto, include ALL bitrates. This filter is not currently used.
* Remove the PlaybackBitrate FilterValues since this is not needed and will be created ad-hoc.
* Update the bitrateTestDuration verbage to better reflect that you're changing the size of the bitrate test and not just increasing the duration. Re-use the existing largest to smallest labels since there isn't a ton of benefit using "Longest to Shortest" so this should re-use existing localization. Comment the Labels.
No functional changes. Only an update to labels.
* Delete the Bitrate.json file but retain the Resources folder.
* Remove Resource Folder.
---------
Co-authored-by: Joe Kribs <joseph@kribs.net>