load trending images from tmdb at startup

- need TMDB_API_KEY as environment variable
- mount /cache for data persistence

Signed-off-by: Peter Siegmund <developer@mars3142.org>
This commit is contained in:
2025-11-17 23:21:01 +01:00
parent 4587901672
commit 4ce471599b
17 changed files with 305 additions and 10 deletions

View File

@@ -0,0 +1,39 @@
import 'dart:io';
import 'package:cinema/feature/version/version.dart';
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
const dioAPI = 'api';
const dioIMAGES = 'images';
@module
abstract class DioModule {
@Named(dioAPI)
@lazySingleton
Dio get apiDio =>
Dio( // Der Getter selbst wird annotiert und gibt die Instanz zurück
BaseOptions(
baseUrl: 'https://api.themoviedb.org/3',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
headers: {
'Authorization': 'Bearer ${Platform.environment['TMDB_API_KEY']}',
'Content-Type': 'application/json',
'Accept': 'application/json',
'User-Agent': 'Cinema Service (v${Version().appVersion})'
},
),
);
@Named(dioIMAGES)
@lazySingleton
Dio get imagesDio =>
Dio( // Der Getter selbst wird annotiert und gibt die Instanz zurück
BaseOptions(
baseUrl: 'https://image.tmdb.org/t/p/original',
connectTimeout: const Duration(seconds: 10),
receiveTimeout: const Duration(seconds: 10),
),
);
}

View File

@@ -0,0 +1,32 @@
import 'package:built_value/serializer.dart';
/// A custom serializer for [DateTime] objects that are represented as
/// a simple date string "yyyy-MM-dd" in JSON.
class CustomDateTimeSerializer implements PrimitiveSerializer<DateTime> {
@override
final Iterable<Type> types = const [DateTime];
@override
final String wireName = 'DateTime';
@override
Object serialize(Serializers serializers, DateTime dateTime,
{FullType specifiedType = FullType.unspecified}) {
// On serialization, convert DateTime to a "yyyy-MM-dd" string.
return dateTime.toIso8601String().substring(0, 10);
}
@override
DateTime deserialize(Serializers serializers, Object serialized,
{FullType specifiedType = FullType.unspecified}) {
// On deserialization, parse the string to a DateTime object.
// This handles formats like "2025-09-23".
final parts = (serialized as String).split('-');
final dateUtc = DateTime.utc(
int.parse(parts[0]),
int.parse(parts[1]),
int.parse(parts[2]),
);
return dateUtc;
}
}

View File

@@ -0,0 +1,20 @@
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
import 'package:built_value/standard_json_plugin.dart';
import 'package:cinema/feature/poster/domain/movie.dart';
import 'package:cinema/feature/poster/domain/tmdb_trending_response.dart';
import 'custom_date_time_serializer.dart';
part 'serializers.g.dart';
@SerializersFor([TmdbTrendingResponse, TmdbMovieResult])
final Serializers serializers =
(_$serializers.toBuilder()
..add(CustomDateTimeSerializer())
..addPlugin(StandardJsonPlugin())
..addBuilderFactory(
const FullType(BuiltList, [FullType(TmdbMovieResult), FullType(Movie)]),
() => ListBuilder<TmdbMovieResult>(),
))
.build();