All checks were successful
ci/woodpecker/tag/release Pipeline was successful
Enable downloading entire series for offline reading. Includes database tables and migration for downloaded series/chapters, download orchestration with progress tracking, per-chapter EPUB and image stream downloading, a Downloaded section in the library, and offline-first reader support. Key changes: - DB migration v11 with downloaded_series and downloaded_chapters tables - Series download service with pagination, cancellation, and progress stream - Feed screen download button with status indicators and completion feedback - Library screen Downloaded section with series cards and detail screen - Reader pre-caching using local files (including two-page spread mode) - Next-in-series navigation resolves from downloaded chapters when offline - Skip image downloads and progress sync when device is offline - Settings screen shows download storage usage with clear option Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
55 lines
2.1 KiB
Dart
55 lines
2.1 KiB
Dart
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
|
|
part of 'downloaded_series.dart';
|
|
|
|
// **************************************************************************
|
|
// JsonSerializableGenerator
|
|
// **************************************************************************
|
|
|
|
_$DownloadedSeriesImpl _$$DownloadedSeriesImplFromJson(
|
|
Map<String, dynamic> json) =>
|
|
_$DownloadedSeriesImpl(
|
|
id: json['id'] as String,
|
|
serverId: json['serverId'] as String,
|
|
seriesFeedUrl: json['seriesFeedUrl'] as String,
|
|
title: json['title'] as String,
|
|
coverUrl: json['coverUrl'] as String?,
|
|
coverPath: json['coverPath'] as String?,
|
|
thumbnailUrl: json['thumbnailUrl'] as String?,
|
|
thumbnailPath: json['thumbnailPath'] as String?,
|
|
status: $enumDecodeNullable(_$DownloadStatusEnumMap, json['status']) ??
|
|
DownloadStatus.pending,
|
|
totalChapters: (json['totalChapters'] as num?)?.toInt() ?? 0,
|
|
downloadedChaptersCount:
|
|
(json['downloadedChaptersCount'] as num?)?.toInt() ?? 0,
|
|
downloadedAt: json['downloadedAt'] == null
|
|
? null
|
|
: DateTime.parse(json['downloadedAt'] as String),
|
|
updatedAt: DateTime.parse(json['updatedAt'] as String),
|
|
);
|
|
|
|
Map<String, dynamic> _$$DownloadedSeriesImplToJson(
|
|
_$DownloadedSeriesImpl instance) =>
|
|
<String, dynamic>{
|
|
'id': instance.id,
|
|
'serverId': instance.serverId,
|
|
'seriesFeedUrl': instance.seriesFeedUrl,
|
|
'title': instance.title,
|
|
'coverUrl': instance.coverUrl,
|
|
'coverPath': instance.coverPath,
|
|
'thumbnailUrl': instance.thumbnailUrl,
|
|
'thumbnailPath': instance.thumbnailPath,
|
|
'status': _$DownloadStatusEnumMap[instance.status]!,
|
|
'totalChapters': instance.totalChapters,
|
|
'downloadedChaptersCount': instance.downloadedChaptersCount,
|
|
'downloadedAt': instance.downloadedAt?.toIso8601String(),
|
|
'updatedAt': instance.updatedAt.toIso8601String(),
|
|
};
|
|
|
|
const _$DownloadStatusEnumMap = {
|
|
DownloadStatus.pending: 'pending',
|
|
DownloadStatus.downloading: 'downloading',
|
|
DownloadStatus.complete: 'complete',
|
|
DownloadStatus.partial: 'partial',
|
|
DownloadStatus.failed: 'failed',
|
|
};
|