Skip to content

Commit

Permalink
Merge pull request #31 from andannn/media_external_link
Browse files Browse the repository at this point in the history
add media external links
  • Loading branch information
andannn authored Oct 14, 2023
2 parents d6a7b80 + 4f92fdd commit 110bffb
Show file tree
Hide file tree
Showing 42 changed files with 1,660 additions and 576 deletions.
16 changes: 16 additions & 0 deletions lib/core/common/util/color_util.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import 'dart:ui';

mixin ColorUtil {
/// parse color with format #001100.
static Color? parseColor(String source) {
final colorRegex = RegExp('#\\w{6}');
if (!colorRegex.hasMatch(source)) {
return null;
}

final r = int.parse(source.substring(1, 3), radix: 16);
final g = int.parse(source.substring(3, 5), radix: 16);
final b = int.parse(source.substring(5, 7), radix: 16);
return Color.fromARGB(255, r, g, b);
}
}
2 changes: 1 addition & 1 deletion lib/core/data/ani_list_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class AnimeTrackListRepositoryImpl extends AniListRepository {
final animeEntities = networkAnimeList
.map<AnimeEntity?>(
(e) => e.media != null
? AnimeEntity.fromDetailNetworkModel(e.media!)
? AnimeEntity.fromNetworkModel(e.media!)
: null,
)
.whereType<AnimeEntity>()
Expand Down
26 changes: 20 additions & 6 deletions lib/core/data/media_information_repository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import 'package:anime_tracker/core/data/model/airing_schedule_model.dart';
import 'package:anime_tracker/core/database/anime_database.dart';
import 'package:anime_tracker/core/database/model/airing_schedules_entity.dart';
import 'package:anime_tracker/core/database/model/character_entity.dart';
import 'package:anime_tracker/core/database/model/media_external_link_entity.dart';
import 'package:anime_tracker/core/database/model/staff_entity.dart';
import 'package:anime_tracker/core/network/api/airing_schedules_query_graphql.dart.dart';
import 'package:anime_tracker/core/network/model/character_edge.dart';
import 'package:anime_tracker/core/network/model/detail_anime_dto.dart';
import 'package:anime_tracker/core/network/model/anime_dto.dart';
import 'package:anime_tracker/core/network/model/media_external_links_dto.dart';
import 'package:anime_tracker/core/network/model/staff_edge.dart';
import 'package:anime_tracker/core/common/util/time_util.dart';
import 'package:dio/dio.dart';
Expand Down Expand Up @@ -105,7 +107,7 @@ class MediaInformationRepositoryImpl extends MediaInformationRepository {

/// insert the anime to db.
final dbAnimeList = networkRes
.map((e) => AnimeEntity.fromShortNetworkModel(e))
.map((e) => AnimeEntity.fromNetworkModel(e))
.toList();

/// clear and re-insert data when refresh.
Expand All @@ -128,7 +130,7 @@ class MediaInformationRepositoryImpl extends MediaInformationRepository {

/// insert the network data to db.
final dbAnimeList = networkRes
.map((e) => AnimeEntity.fromShortNetworkModel(e))
.map((e) => AnimeEntity.fromNetworkModel(e))
.toList();
await animeDao.insertOrIgnoreAnimeByAnimeCategory(category,
animeList: dbAnimeList);
Expand Down Expand Up @@ -164,13 +166,13 @@ class MediaInformationRepositoryImpl extends MediaInformationRepository {
Future<LoadResult<void>> startFetchDetailAnimeInfo(String id) async {
try {
/// fetch anime info from network.
DetailAnimeDto networkResult = await aniListDataSource.getNetworkAnime(
AnimeDto networkResult = await aniListDataSource.getNetworkAnime(
id: int.parse(id),
);

/// insert anime info to db.
await animeDao.upsertAnimeInformation(
[AnimeEntity.fromDetailNetworkModel(networkResult)],
[AnimeEntity.fromNetworkModel(networkResult)],
conflictAlgorithm: ConflictAlgorithm.replace);

final List<CharacterEdge> characters =
Expand Down Expand Up @@ -230,6 +232,18 @@ class MediaInformationRepositoryImpl extends MediaInformationRepository {
);
}

final List<MediaExternalLinkDto> externalLinks =
networkResult.externalLinks;
/// insert external links to database.
if (externalLinks.isNotEmpty) {
final linkEntities = externalLinks
.map(
(e) => MediaExternalLinkEntity.fromDto(e, id),
)
.toList();
await animeDao.upsertMediaExternalLinks(externalLinks: linkEntities);
}

/// notify data base has been changed an trigger the streams.
animeDao.notifyAnimeDetailInfoChanged();
return LoadSuccess(data: []);
Expand Down Expand Up @@ -275,7 +289,7 @@ class MediaInformationRepositoryImpl extends MediaInformationRepository {

/// insert anime data to db if not exist.
final animeEntities = networkResults
.map((e) => AnimeEntity.fromShortNetworkModel(e.media!))
.map((e) => AnimeEntity.fromNetworkModel(e.media!))
.toList();
await animeDao.upsertAnimeInformation(animeEntities,
conflictAlgorithm: ConflictAlgorithm.ignore);
Expand Down
5 changes: 5 additions & 0 deletions lib/core/data/model/anime_model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'package:anime_tracker/core/common/model/anime_source.dart';
import 'package:anime_tracker/core/common/model/anime_status.dart';
import 'package:anime_tracker/core/data/model/staff_and_role_model.dart';
import 'package:anime_tracker/core/data/model/trailter_model.dart';
import 'package:anime_tracker/core/data/model/media_external_link_model.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

import 'package:anime_tracker/core/data/model/anime_title_modle.dart';
Expand Down Expand Up @@ -40,6 +41,7 @@ class AnimeModel with _$AnimeModel {
@Default(false) bool isFollowing,
@Default([]) List<CharacterAndVoiceActorModel> characterAndVoiceActors,
@Default([]) List<StaffAndRoleModel> staffs,
@Default([]) List<MediaExternalLinkModel> externalLinks,
}) = _DetailAnimeModel;

static AnimeModel fromDatabaseModel(AnimeEntity model) {
Expand Down Expand Up @@ -95,6 +97,9 @@ class AnimeModel with _$AnimeModel {
staffs: model.staffs
.map((e) => StaffAndRoleModel.fromDatabaseEntity(e))
.toList(),
externalLinks: model.externalLinks
.map((e) => MediaExternalLinkModel.fromEntity(e))
.toList(),
);
}
}
47 changes: 39 additions & 8 deletions lib/core/data/model/anime_model.freezed.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ mixin _$AnimeModel {
List<CharacterAndVoiceActorModel> get characterAndVoiceActors =>
throw _privateConstructorUsedError;
List<StaffAndRoleModel> get staffs => throw _privateConstructorUsedError;
List<MediaExternalLinkModel> get externalLinks =>
throw _privateConstructorUsedError;

@JsonKey(ignore: true)
$AnimeModelCopyWith<AnimeModel> get copyWith =>
Expand Down Expand Up @@ -75,7 +77,8 @@ abstract class $AnimeModelCopyWith<$Res> {
int? nextAiringEpisode,
bool isFollowing,
List<CharacterAndVoiceActorModel> characterAndVoiceActors,
List<StaffAndRoleModel> staffs});
List<StaffAndRoleModel> staffs,
List<MediaExternalLinkModel> externalLinks});

$AnimeTitleCopyWith<$Res>? get title;
$TrailerModelCopyWith<$Res>? get trailerModel;
Expand Down Expand Up @@ -117,6 +120,7 @@ class _$AnimeModelCopyWithImpl<$Res, $Val extends AnimeModel>
Object? isFollowing = null,
Object? characterAndVoiceActors = null,
Object? staffs = null,
Object? externalLinks = null,
}) {
return _then(_value.copyWith(
id: null == id
Expand Down Expand Up @@ -211,6 +215,10 @@ class _$AnimeModelCopyWithImpl<$Res, $Val extends AnimeModel>
? _value.staffs
: staffs // ignore: cast_nullable_to_non_nullable
as List<StaffAndRoleModel>,
externalLinks: null == externalLinks
? _value.externalLinks
: externalLinks // ignore: cast_nullable_to_non_nullable
as List<MediaExternalLinkModel>,
) as $Val);
}

Expand Down Expand Up @@ -270,7 +278,8 @@ abstract class _$$_DetailAnimeModelCopyWith<$Res>
int? nextAiringEpisode,
bool isFollowing,
List<CharacterAndVoiceActorModel> characterAndVoiceActors,
List<StaffAndRoleModel> staffs});
List<StaffAndRoleModel> staffs,
List<MediaExternalLinkModel> externalLinks});

@override
$AnimeTitleCopyWith<$Res>? get title;
Expand Down Expand Up @@ -312,6 +321,7 @@ class __$$_DetailAnimeModelCopyWithImpl<$Res>
Object? isFollowing = null,
Object? characterAndVoiceActors = null,
Object? staffs = null,
Object? externalLinks = null,
}) {
return _then(_$_DetailAnimeModel(
id: null == id
Expand Down Expand Up @@ -406,6 +416,10 @@ class __$$_DetailAnimeModelCopyWithImpl<$Res>
? _value._staffs
: staffs // ignore: cast_nullable_to_non_nullable
as List<StaffAndRoleModel>,
externalLinks: null == externalLinks
? _value._externalLinks
: externalLinks // ignore: cast_nullable_to_non_nullable
as List<MediaExternalLinkModel>,
));
}
}
Expand Down Expand Up @@ -437,11 +451,13 @@ class _$_DetailAnimeModel implements _DetailAnimeModel {
this.isFollowing = false,
final List<CharacterAndVoiceActorModel> characterAndVoiceActors =
const [],
final List<StaffAndRoleModel> staffs = const []})
final List<StaffAndRoleModel> staffs = const [],
final List<MediaExternalLinkModel> externalLinks = const []})
: _hashtags = hashtags,
_genres = genres,
_characterAndVoiceActors = characterAndVoiceActors,
_staffs = staffs;
_staffs = staffs,
_externalLinks = externalLinks;

@override
@JsonKey()
Expand Down Expand Up @@ -522,9 +538,18 @@ class _$_DetailAnimeModel implements _DetailAnimeModel {
return EqualUnmodifiableListView(_staffs);
}

final List<MediaExternalLinkModel> _externalLinks;
@override
@JsonKey()
List<MediaExternalLinkModel> get externalLinks {
if (_externalLinks is EqualUnmodifiableListView) return _externalLinks;
// ignore: implicit_dynamic_type
return EqualUnmodifiableListView(_externalLinks);
}

@override
String toString() {
return 'AnimeModel(id: $id, title: $title, coverImage: $coverImage, coverImageColor: $coverImageColor, description: $description, source: $source, bannerImage: $bannerImage, averageScore: $averageScore, favourites: $favourites, trailerModel: $trailerModel, seasonYear: $seasonYear, season: $season, status: $status, ratedRank: $ratedRank, popularRank: $popularRank, hashtags: $hashtags, genres: $genres, episodes: $episodes, timeUntilAiring: $timeUntilAiring, nextAiringEpisode: $nextAiringEpisode, isFollowing: $isFollowing, characterAndVoiceActors: $characterAndVoiceActors, staffs: $staffs)';
return 'AnimeModel(id: $id, title: $title, coverImage: $coverImage, coverImageColor: $coverImageColor, description: $description, source: $source, bannerImage: $bannerImage, averageScore: $averageScore, favourites: $favourites, trailerModel: $trailerModel, seasonYear: $seasonYear, season: $season, status: $status, ratedRank: $ratedRank, popularRank: $popularRank, hashtags: $hashtags, genres: $genres, episodes: $episodes, timeUntilAiring: $timeUntilAiring, nextAiringEpisode: $nextAiringEpisode, isFollowing: $isFollowing, characterAndVoiceActors: $characterAndVoiceActors, staffs: $staffs, externalLinks: $externalLinks)';
}

@override
Expand Down Expand Up @@ -569,7 +594,9 @@ class _$_DetailAnimeModel implements _DetailAnimeModel {
other.isFollowing == isFollowing) &&
const DeepCollectionEquality().equals(
other._characterAndVoiceActors, _characterAndVoiceActors) &&
const DeepCollectionEquality().equals(other._staffs, _staffs));
const DeepCollectionEquality().equals(other._staffs, _staffs) &&
const DeepCollectionEquality()
.equals(other._externalLinks, _externalLinks));
}

@override
Expand Down Expand Up @@ -597,7 +624,8 @@ class _$_DetailAnimeModel implements _DetailAnimeModel {
nextAiringEpisode,
isFollowing,
const DeepCollectionEquality().hash(_characterAndVoiceActors),
const DeepCollectionEquality().hash(_staffs)
const DeepCollectionEquality().hash(_staffs),
const DeepCollectionEquality().hash(_externalLinks)
]);

@JsonKey(ignore: true)
Expand Down Expand Up @@ -631,7 +659,8 @@ abstract class _DetailAnimeModel implements AnimeModel {
final int? nextAiringEpisode,
final bool isFollowing,
final List<CharacterAndVoiceActorModel> characterAndVoiceActors,
final List<StaffAndRoleModel> staffs}) = _$_DetailAnimeModel;
final List<StaffAndRoleModel> staffs,
final List<MediaExternalLinkModel> externalLinks}) = _$_DetailAnimeModel;

@override
String get id;
Expand Down Expand Up @@ -680,6 +709,8 @@ abstract class _DetailAnimeModel implements AnimeModel {
@override
List<StaffAndRoleModel> get staffs;
@override
List<MediaExternalLinkModel> get externalLinks;
@override
@JsonKey(ignore: true)
_$$_DetailAnimeModelCopyWith<_$_DetailAnimeModel> get copyWith =>
throw _privateConstructorUsedError;
Expand Down
34 changes: 34 additions & 0 deletions lib/core/data/model/media_external_link_model.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'package:anime_tracker/core/data/model/media_external_link_type.dart';
import 'package:anime_tracker/core/database/model/media_external_link_entity.dart';
import 'package:freezed_annotation/freezed_annotation.dart';

part 'media_external_link_model.freezed.dart';

part 'media_external_link_model.g.dart';

@freezed
class MediaExternalLinkModel with _$MediaExternalLinkModel {
factory MediaExternalLinkModel({
@Default('') String url,
@Default('') String site,
@Default(MediaExternalLinkType.info) MediaExternalLinkType type,
@Default(-1) int siteId,
@Default('') String icon,
@Default('') String color,
}) = _MediaExternalLinkModel;

factory MediaExternalLinkModel.fromJson(Map<String, dynamic> json) =>
_$$_MediaExternalLinkModelFromJson(json);

static MediaExternalLinkModel fromEntity(MediaExternalLinkEntity entity) {
return MediaExternalLinkModel(
url: entity.url ?? '',
site: entity.site ?? '',
type: $enumDecodeNullable(_$MediaExternalLinkTypeEnumMap, entity.type) ??
MediaExternalLinkType.info,
siteId: entity.siteId ?? -1,
icon: entity.icon ?? '',
color: entity.color ?? '',
);
}
}
Loading

0 comments on commit 110bffb

Please sign in to comment.