Init repo

This commit is contained in:
PartyDonut 2024-09-15 14:12:28 +02:00
commit 764b6034e3
566 changed files with 212335 additions and 0 deletions

View file

@ -0,0 +1,16 @@
import 'package:background_downloader/background_downloader.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'background_download_provider.g.dart';
@Riverpod(keepAlive: true)
FileDownloader backgroundDownloader(BackgroundDownloaderRef ref) {
return FileDownloader()
..trackTasks()
..configureNotification(
running: TaskNotification('Downloading', 'file: {filename}'),
complete: TaskNotification('Download finished', 'file: {filename}'),
paused: TaskNotification('Download paused', 'file: {filename}'),
progressBar: true,
);
}

View file

@ -0,0 +1,26 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'background_download_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$backgroundDownloaderHash() =>
r'2bc7a06682cdcfa9a754dce9b7f7ea48f873682e';
/// See also [backgroundDownloader].
@ProviderFor(backgroundDownloader)
final backgroundDownloaderProvider = Provider<FileDownloader>.internal(
backgroundDownloader,
name: r'backgroundDownloaderProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$backgroundDownloaderHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef BackgroundDownloaderRef = ProviderRef<FileDownloader>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

View file

@ -0,0 +1,104 @@
import 'package:fladder/models/syncing/i_synced_item.dart';
import 'package:fladder/providers/sync_provider.dart';
import 'package:fladder/models/syncing/download_stream.dart';
import 'package:fladder/models/syncing/sync_item.dart';
import 'package:isar/isar.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'sync_provider_helpers.g.dart';
@riverpod
class SyncChildren extends _$SyncChildren {
@override
List<SyncedItem> build(SyncedItem arg) {
final syncedItemIsar = ref.watch(syncProvider.notifier).isar;
final allChildren = <SyncedItem>[];
List<SyncedItem> toProcess = [arg];
while (toProcess.isNotEmpty) {
final currentLevel = toProcess.map(
(parent) {
final children = syncedItemIsar?.iSyncedItems.where().parentIdEqualTo(parent.id).sortBySortKey().findAll();
return children?.map((e) => SyncedItem.fromIsar(e, ref.read(syncProvider.notifier).syncPath ?? "")) ??
<SyncedItem>[];
},
);
allChildren.addAll(currentLevel.expand((list) => list));
toProcess = currentLevel.expand((list) => list).toList();
}
return allChildren;
}
}
@riverpod
class SyncDownloadStatus extends _$SyncDownloadStatus {
@override
DownloadStream? build(SyncedItem arg) {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
DownloadStream mainStream = ref.read(downloadTasksProvider(arg.id));
int downloadCount = 0;
double fullProgress = mainStream.hasDownload ? mainStream.progress : 0.0;
for (var i = 0; i < nestedChildren.length; i++) {
final childItem = nestedChildren[i];
final downloadStream = ref.read(downloadTasksProvider(childItem.id));
if (downloadStream.hasDownload) {
downloadCount++;
fullProgress += downloadStream.progress;
mainStream = mainStream.copyWith(status: downloadStream.status);
}
}
return mainStream.copyWith(
progress: fullProgress / downloadCount.clamp(1, double.infinity).toInt(),
);
}
}
@riverpod
class SyncStatuses extends _$SyncStatuses {
@override
FutureOr<SyncStatus> build(SyncedItem arg) async {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
for (var i = 0; i < nestedChildren.length; i++) {
final item = nestedChildren[i];
if (item.hasVideoFile && !await item.videoFile.exists()) {
return SyncStatus.partially;
}
}
if (arg.hasVideoFile && !await arg.videoFile.exists()) {
return SyncStatus.partially;
}
return SyncStatus.complete;
}
}
@riverpod
class SyncSize extends _$SyncSize {
@override
int? build(SyncedItem arg) {
final nestedChildren = ref.watch(syncChildrenProvider(arg));
ref.watch(downloadTasksProvider(arg.id));
for (var element in nestedChildren) {
ref.watch(downloadTasksProvider(element.id));
}
int size = arg.fileSize ?? 0;
for (var element in nestedChildren) {
size += element.fileSize ?? 0;
}
return size;
}
}

View file

@ -0,0 +1,603 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'sync_provider_helpers.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$syncChildrenHash() => r'798a9998103adae18a238a69219559f3ccbf3def';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
abstract class _$SyncChildren
extends BuildlessAutoDisposeNotifier<List<SyncedItem>> {
late final SyncedItem arg;
List<SyncedItem> build(
SyncedItem arg,
);
}
/// See also [SyncChildren].
@ProviderFor(SyncChildren)
const syncChildrenProvider = SyncChildrenFamily();
/// See also [SyncChildren].
class SyncChildrenFamily extends Family<List<SyncedItem>> {
/// See also [SyncChildren].
const SyncChildrenFamily();
/// See also [SyncChildren].
SyncChildrenProvider call(
SyncedItem arg,
) {
return SyncChildrenProvider(
arg,
);
}
@override
SyncChildrenProvider getProviderOverride(
covariant SyncChildrenProvider provider,
) {
return call(
provider.arg,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'syncChildrenProvider';
}
/// See also [SyncChildren].
class SyncChildrenProvider
extends AutoDisposeNotifierProviderImpl<SyncChildren, List<SyncedItem>> {
/// See also [SyncChildren].
SyncChildrenProvider(
SyncedItem arg,
) : this._internal(
() => SyncChildren()..arg = arg,
from: syncChildrenProvider,
name: r'syncChildrenProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$syncChildrenHash,
dependencies: SyncChildrenFamily._dependencies,
allTransitiveDependencies:
SyncChildrenFamily._allTransitiveDependencies,
arg: arg,
);
SyncChildrenProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.arg,
}) : super.internal();
final SyncedItem arg;
@override
List<SyncedItem> runNotifierBuild(
covariant SyncChildren notifier,
) {
return notifier.build(
arg,
);
}
@override
Override overrideWith(SyncChildren Function() create) {
return ProviderOverride(
origin: this,
override: SyncChildrenProvider._internal(
() => create()..arg = arg,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
arg: arg,
),
);
}
@override
AutoDisposeNotifierProviderElement<SyncChildren, List<SyncedItem>>
createElement() {
return _SyncChildrenProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SyncChildrenProvider && other.arg == arg;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, arg.hashCode);
return _SystemHash.finish(hash);
}
}
mixin SyncChildrenRef on AutoDisposeNotifierProviderRef<List<SyncedItem>> {
/// The parameter `arg` of this provider.
SyncedItem get arg;
}
class _SyncChildrenProviderElement
extends AutoDisposeNotifierProviderElement<SyncChildren, List<SyncedItem>>
with SyncChildrenRef {
_SyncChildrenProviderElement(super.provider);
@override
SyncedItem get arg => (origin as SyncChildrenProvider).arg;
}
String _$syncDownloadStatusHash() =>
r'5a0f8537a977c52e6083bd84265631ea5d160637';
abstract class _$SyncDownloadStatus
extends BuildlessAutoDisposeNotifier<DownloadStream?> {
late final SyncedItem arg;
DownloadStream? build(
SyncedItem arg,
);
}
/// See also [SyncDownloadStatus].
@ProviderFor(SyncDownloadStatus)
const syncDownloadStatusProvider = SyncDownloadStatusFamily();
/// See also [SyncDownloadStatus].
class SyncDownloadStatusFamily extends Family<DownloadStream?> {
/// See also [SyncDownloadStatus].
const SyncDownloadStatusFamily();
/// See also [SyncDownloadStatus].
SyncDownloadStatusProvider call(
SyncedItem arg,
) {
return SyncDownloadStatusProvider(
arg,
);
}
@override
SyncDownloadStatusProvider getProviderOverride(
covariant SyncDownloadStatusProvider provider,
) {
return call(
provider.arg,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'syncDownloadStatusProvider';
}
/// See also [SyncDownloadStatus].
class SyncDownloadStatusProvider extends AutoDisposeNotifierProviderImpl<
SyncDownloadStatus, DownloadStream?> {
/// See also [SyncDownloadStatus].
SyncDownloadStatusProvider(
SyncedItem arg,
) : this._internal(
() => SyncDownloadStatus()..arg = arg,
from: syncDownloadStatusProvider,
name: r'syncDownloadStatusProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$syncDownloadStatusHash,
dependencies: SyncDownloadStatusFamily._dependencies,
allTransitiveDependencies:
SyncDownloadStatusFamily._allTransitiveDependencies,
arg: arg,
);
SyncDownloadStatusProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.arg,
}) : super.internal();
final SyncedItem arg;
@override
DownloadStream? runNotifierBuild(
covariant SyncDownloadStatus notifier,
) {
return notifier.build(
arg,
);
}
@override
Override overrideWith(SyncDownloadStatus Function() create) {
return ProviderOverride(
origin: this,
override: SyncDownloadStatusProvider._internal(
() => create()..arg = arg,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
arg: arg,
),
);
}
@override
AutoDisposeNotifierProviderElement<SyncDownloadStatus, DownloadStream?>
createElement() {
return _SyncDownloadStatusProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SyncDownloadStatusProvider && other.arg == arg;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, arg.hashCode);
return _SystemHash.finish(hash);
}
}
mixin SyncDownloadStatusRef on AutoDisposeNotifierProviderRef<DownloadStream?> {
/// The parameter `arg` of this provider.
SyncedItem get arg;
}
class _SyncDownloadStatusProviderElement
extends AutoDisposeNotifierProviderElement<SyncDownloadStatus,
DownloadStream?> with SyncDownloadStatusRef {
_SyncDownloadStatusProviderElement(super.provider);
@override
SyncedItem get arg => (origin as SyncDownloadStatusProvider).arg;
}
String _$syncStatusesHash() => r'f05ee53368d1de130714bba09132e08aba15bc44';
abstract class _$SyncStatuses
extends BuildlessAutoDisposeAsyncNotifier<SyncStatus> {
late final SyncedItem arg;
FutureOr<SyncStatus> build(
SyncedItem arg,
);
}
/// See also [SyncStatuses].
@ProviderFor(SyncStatuses)
const syncStatusesProvider = SyncStatusesFamily();
/// See also [SyncStatuses].
class SyncStatusesFamily extends Family<AsyncValue<SyncStatus>> {
/// See also [SyncStatuses].
const SyncStatusesFamily();
/// See also [SyncStatuses].
SyncStatusesProvider call(
SyncedItem arg,
) {
return SyncStatusesProvider(
arg,
);
}
@override
SyncStatusesProvider getProviderOverride(
covariant SyncStatusesProvider provider,
) {
return call(
provider.arg,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'syncStatusesProvider';
}
/// See also [SyncStatuses].
class SyncStatusesProvider
extends AutoDisposeAsyncNotifierProviderImpl<SyncStatuses, SyncStatus> {
/// See also [SyncStatuses].
SyncStatusesProvider(
SyncedItem arg,
) : this._internal(
() => SyncStatuses()..arg = arg,
from: syncStatusesProvider,
name: r'syncStatusesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$syncStatusesHash,
dependencies: SyncStatusesFamily._dependencies,
allTransitiveDependencies:
SyncStatusesFamily._allTransitiveDependencies,
arg: arg,
);
SyncStatusesProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.arg,
}) : super.internal();
final SyncedItem arg;
@override
FutureOr<SyncStatus> runNotifierBuild(
covariant SyncStatuses notifier,
) {
return notifier.build(
arg,
);
}
@override
Override overrideWith(SyncStatuses Function() create) {
return ProviderOverride(
origin: this,
override: SyncStatusesProvider._internal(
() => create()..arg = arg,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
arg: arg,
),
);
}
@override
AutoDisposeAsyncNotifierProviderElement<SyncStatuses, SyncStatus>
createElement() {
return _SyncStatusesProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SyncStatusesProvider && other.arg == arg;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, arg.hashCode);
return _SystemHash.finish(hash);
}
}
mixin SyncStatusesRef on AutoDisposeAsyncNotifierProviderRef<SyncStatus> {
/// The parameter `arg` of this provider.
SyncedItem get arg;
}
class _SyncStatusesProviderElement
extends AutoDisposeAsyncNotifierProviderElement<SyncStatuses, SyncStatus>
with SyncStatusesRef {
_SyncStatusesProviderElement(super.provider);
@override
SyncedItem get arg => (origin as SyncStatusesProvider).arg;
}
String _$syncSizeHash() => r'138702f2dd69ab28d142bab67ab4a497bb24f252';
abstract class _$SyncSize extends BuildlessAutoDisposeNotifier<int?> {
late final SyncedItem arg;
int? build(
SyncedItem arg,
);
}
/// See also [SyncSize].
@ProviderFor(SyncSize)
const syncSizeProvider = SyncSizeFamily();
/// See also [SyncSize].
class SyncSizeFamily extends Family<int?> {
/// See also [SyncSize].
const SyncSizeFamily();
/// See also [SyncSize].
SyncSizeProvider call(
SyncedItem arg,
) {
return SyncSizeProvider(
arg,
);
}
@override
SyncSizeProvider getProviderOverride(
covariant SyncSizeProvider provider,
) {
return call(
provider.arg,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'syncSizeProvider';
}
/// See also [SyncSize].
class SyncSizeProvider extends AutoDisposeNotifierProviderImpl<SyncSize, int?> {
/// See also [SyncSize].
SyncSizeProvider(
SyncedItem arg,
) : this._internal(
() => SyncSize()..arg = arg,
from: syncSizeProvider,
name: r'syncSizeProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$syncSizeHash,
dependencies: SyncSizeFamily._dependencies,
allTransitiveDependencies: SyncSizeFamily._allTransitiveDependencies,
arg: arg,
);
SyncSizeProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.arg,
}) : super.internal();
final SyncedItem arg;
@override
int? runNotifierBuild(
covariant SyncSize notifier,
) {
return notifier.build(
arg,
);
}
@override
Override overrideWith(SyncSize Function() create) {
return ProviderOverride(
origin: this,
override: SyncSizeProvider._internal(
() => create()..arg = arg,
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
arg: arg,
),
);
}
@override
AutoDisposeNotifierProviderElement<SyncSize, int?> createElement() {
return _SyncSizeProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SyncSizeProvider && other.arg == arg;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, arg.hashCode);
return _SystemHash.finish(hash);
}
}
mixin SyncSizeRef on AutoDisposeNotifierProviderRef<int?> {
/// The parameter `arg` of this provider.
SyncedItem get arg;
}
class _SyncSizeProviderElement
extends AutoDisposeNotifierProviderElement<SyncSize, int?>
with SyncSizeRef {
_SyncSizeProviderElement(super.provider);
@override
SyncedItem get arg => (origin as SyncSizeProvider).arg;
}
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member