Since protocols can't be observed in SwiftUI, use a roundabout way
to check if a user is logged in. Maybe this should be changed in the future,
but it works for now.
Signed-off-by: kingbri <bdashore3@proton.me>
To avoid inflating the IA value cache, restore the TTL logic and only
append IAs that are part of the sent magnets.
In addition, if an IA result isn't found for a model download, re-fetch
the IA cache.
Signed-off-by: kingbri <bdashore3@proton.me>
This is a manual button so users can download an item to their preferred
debrid service. If the item is cached in the debrid, it will download instantly
and display the result to the user. Otherwise, the caching alert is shown.
Signed-off-by: kingbri <bdashore3@proton.me>
Cloud magnets are now under a rate limit and links are no longer
present per entry. Remove rich display for that section only and
present a batch sheet on click.
Also add more spots for cleaning up variables.
Signed-off-by: kingbri <bdashore3@proton.me>
Different services can send different statuses for if a file is
cached or not. Therefore, make this scoped to the debrid service
rather than expecting everything to state "downloaded".
Also it feels pretty blank if the disclosure groups are gone when
a cloud array is empty, so remove those checks.
Signed-off-by: kingbri <bdashore3@proton.me>
If a debrid is authorized, a Published variable needs to be notified
since SwiftUI can't read computed properties on the fly (they are
getters). Therefore, it's better to maintain a single source of truth
of which services are logged in.
Signed-off-by: kingbri <bdashore3@proton.me>
TorBox can now show if there's a batch before loading a file.
Cloud downloads should check the server in case there's a different
method to fetch a download link.
Signed-off-by: kingbri <bdashore3@proton.me>
- AllDebrid: Don't throw an empty error if cloud downloads/torrents
is empty
- Fix history not saving with the proper URLs
- Fix the HTMLParser looking at the incorrect term for seedLeech
Signed-off-by: kingbri <bdashore3@proton.me>
OffCloud is a debrid provider that allows for caching and playing
media. Does not have rich debrid support.
Also add a handler if functionality isn't implemented in the service.
Signed-off-by: kingbri <bdashore3@proton.me>
The task can be set to nil after completion, and the unrestrict
flag should also be set to nil when the batch sheet is dismissed.
Signed-off-by: kingbri <bdashore3@proton.me>
Some debrid services aren't "rich", which means that they don't
broadcast whether an instantly available torrent is a batch or a
single file. This results in all torrents either having the green
badge or red badge based on what hash is given.
However, batches need to intercept the download itself which requires
the download function to be split into download and unrestrict. In
between, there's room for the batch sheet to act.
Signed-off-by: kingbri <bdashore3@proton.me>
Public should not be used in an app since it declares public to
additional modules. However, an app is one module. Some structs/
classes need to be left public to conform to CoreData's generation.
Signed-off-by: kingbri <bdashore3@proton.me>
Unify authentication to the new protocol. Also remove logout on
invalid requests. This became annoying and didn't update the UI
properly.
Signed-off-by: kingbri <bdashore3@proton.me>
Change the returned error to one that's unique to caching. Also
make deleteTorrents optional to delete the first torrent if necessary
since that's always being cached.
Signed-off-by: kingbri <bdashore3@proton.me>
Protocols can't be used in ObservedObjects. Observable in iOS 17
and up solves this, but Ferrite targets iOS 16 and up, so add a
type-erased StateObject which supports protocols.
Signed-off-by: kingbri <bdashore3@proton.me>
This fixes cloud magnet fetching and also doesn't duplicate magnets
inside the cloud service. Unrestricted links don't get duplicated,
so no need to check against those.
Signed-off-by: kingbri <bdashore3@proton.me>
Cloud downloads and torrents are now unified under their own
protocol and models. Downloads and torrents are separated.
Signed-off-by: kingbri <bdashore3@proton.me>
Unify IA into a passable client side structure and add a common
download method to the DebridSource protocol.
Signed-off-by: kingbri <bdashore3@proton.me>
Debrid services can change their APIs at any time which negatively
impacts user experiences on Ferrite.
Add the following:
- Ability for a user to add a manually generated API key only showing the
last 4 characters for security purposes.
- Make ephemeral auth sessions toggle-able. ASWebAuthenticationView does
not automatically clear on toggle change.
- Add the savedLinks endpoint for AllDebrid so users can access their
downloads and magnets.
- Add a links section to AD's cloud view.
Signed-off-by: kingbri <bdashore3@proton.me>
Some websites and networks may be slow. Add the option to override
the request timeout of 15 seconds for search requests.
Signed-off-by: kingbri <bdashore3@proton.me>
The default SwiftUI picker is too limited for Ferrite's purposes.
Switch to a custom implementation for UI consistency.
Signed-off-by: kingbri <bdashore3@proton.me>
The search bar sometimes had the scope bar added twice if a toolbar
was present (probably caused a refresh of the navigationTitle).
Rather than figuring out a hacky swiftUI solution to solve this,
add a check to enforce only one HostingViewController in the
scope bar.
Also migrate the inlinedList modifier to use safeAreaInsets from
native SwiftUI. Keep the introspected modifier for negative values.
Signed-off-by: kingbri <bdashore3@proton.me>
Filters are more comprehensive and responsive to how many filters
are stored and if a user should clear all of them or not.
Signed-off-by: kingbri <bdashore3@proton.me>
Items can now be filtered based if they're present in the debrid cache,
are a batch file, or not present at all.
Signed-off-by: kingbri <bdashore3@proton.me>
Make searchText a local variable passed to ScrapingModel to prevent
extreme keyboard lag and CPU usage when tracking this EnvironmentObject.
Signed-off-by: kingbri <bdashore3@proton.me>
Make it so that when a user chooses a source to filter, only filter
that specific source when a search occurs.
Also fix the "no results found" overlay text by checking if the
search bar textfield is being edited or not by modifiying ESSearchable.
Signed-off-by: kingbri <bdashore3@proton.me>
ExpandedSearchable opens up the capabilities of the SwiftUI searchable
modifier and allows for additions of more properties such as custom
scope bars.
Since this is a reimplementation of UISearchController, changes
to SwiftUI should not affect search bars that rely on the scope bar
to always be present.
Signed-off-by: kingbri <bdashore3@proton.me>
Place refreshable in the individual lists instead of in the parent
ZStack as that applies to sheets as well.
Signed-off-by: kingbri <bdashore3@proton.me>