mirror of
https://github.com/immich-app/immich.git
synced 2025-05-30 19:54:52 -04:00
cleanup of classes
This commit is contained in:
parent
f5ed1360e6
commit
ef3d1f565d
@ -21,4 +21,6 @@ abstract interface class IAssetApiRepository {
|
|||||||
List<String> list,
|
List<String> list,
|
||||||
AssetVisibilityEnum visibility,
|
AssetVisibilityEnum visibility,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
Future<String?> getAssetMIMEType(String id);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import 'package:immich_mobile/entities/asset.entity.dart';
|
import 'package:immich_mobile/entities/asset.entity.dart';
|
||||||
import 'package:immich_mobile/models/cast_manager_state.dart';
|
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
|
||||||
|
|
||||||
abstract interface class ICastDestinationService {
|
abstract interface class ICastDestinationService {
|
||||||
Future<bool> initialize();
|
Future<bool> initialize();
|
||||||
|
9
mobile/lib/interfaces/sessions_api.interface.dart
Normal file
9
mobile/lib/interfaces/sessions_api.interface.dart
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import 'package:immich_mobile/models/sessions/session_create_response.model.dart';
|
||||||
|
|
||||||
|
abstract interface class ISessionAPIRepository {
|
||||||
|
Future<SessionCreateResponse> createSession(
|
||||||
|
String deviceName,
|
||||||
|
String deviceOS, {
|
||||||
|
int? duration,
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
class SessionCreateResponse {
|
||||||
|
final String createdAt;
|
||||||
|
final bool current;
|
||||||
|
final String deviceOS;
|
||||||
|
final String deviceType;
|
||||||
|
final String? expiresAt;
|
||||||
|
final String id;
|
||||||
|
final String token;
|
||||||
|
final String updatedAt;
|
||||||
|
|
||||||
|
SessionCreateResponse({
|
||||||
|
required this.createdAt,
|
||||||
|
required this.current,
|
||||||
|
required this.deviceOS,
|
||||||
|
required this.deviceType,
|
||||||
|
this.expiresAt,
|
||||||
|
required this.id,
|
||||||
|
required this.token,
|
||||||
|
required this.updatedAt,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'SessionCreateResponse[createdAt=$createdAt, current=$current, deviceOS=$deviceOS, deviceType=$deviceType, expiresAt=$expiresAt, id=$id, token=$token, updatedAt=$updatedAt]';
|
||||||
|
}
|
||||||
|
}
|
@ -122,6 +122,8 @@ class GalleryViewerPage extends HookConsumerWidget {
|
|||||||
useEffect(() {
|
useEffect(() {
|
||||||
final asset = loadAsset(currentIndex.value);
|
final asset = loadAsset(currentIndex.value);
|
||||||
ref.read(castProvider.notifier).loadMedia(asset, false);
|
ref.read(castProvider.notifier).loadMedia(asset, false);
|
||||||
|
|
||||||
|
return null;
|
||||||
}, [
|
}, [
|
||||||
ref.watch(castProvider).isCasting,
|
ref.watch(castProvider).isCasting,
|
||||||
]);
|
]);
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/entities/asset.entity.dart';
|
import 'package:immich_mobile/entities/asset.entity.dart';
|
||||||
import 'package:immich_mobile/models/cast_manager_state.dart';
|
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
|
||||||
import 'package:immich_mobile/services/gcast.service.dart';
|
import 'package:immich_mobile/services/gcast.service.dart';
|
||||||
import 'package:openapi/api.dart';
|
|
||||||
|
|
||||||
final castProvider = StateNotifierProvider<CastNotifier, CastManagerState>(
|
final castProvider = StateNotifierProvider<CastNotifier, CastManagerState>(
|
||||||
(ref) => CastNotifier(ref.watch(gCastServiceProvider)),
|
(ref) => CastNotifier(ref.watch(gCastServiceProvider)),
|
||||||
|
@ -72,4 +72,11 @@ class AssetApiRepository extends ApiRepository implements IAssetApiRepository {
|
|||||||
return AssetVisibility.archive;
|
return AssetVisibility.archive;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<String?> getAssetMIMEType(String assetId) async {
|
||||||
|
final response = await checkNull(_api.getAssetInfo(assetId));
|
||||||
|
|
||||||
|
// we need to get the MIME of the thumbnail once that gets added to the API
|
||||||
|
return response.originalMimeType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
45
mobile/lib/repositories/sessions_api.repository.dart
Normal file
45
mobile/lib/repositories/sessions_api.repository.dart
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
|
import 'package:immich_mobile/interfaces/sessions_api.interface.dart';
|
||||||
|
import 'package:immich_mobile/models/sessions/session_create_response.model.dart';
|
||||||
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
|
import 'package:immich_mobile/repositories/api.repository.dart';
|
||||||
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
|
final sessionsAPIRepositoryProvider = Provider(
|
||||||
|
(ref) => SessionsAPIRepository(
|
||||||
|
ref.watch(apiServiceProvider).sessionsApi,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
class SessionsAPIRepository extends ApiRepository
|
||||||
|
implements ISessionAPIRepository {
|
||||||
|
final SessionsApi _api;
|
||||||
|
|
||||||
|
SessionsAPIRepository(this._api);
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<SessionCreateResponse> createSession(
|
||||||
|
String deviceType, String deviceOS,
|
||||||
|
{int? duration}) async {
|
||||||
|
final dto = await checkNull(
|
||||||
|
_api.createSession(
|
||||||
|
SessionCreateDto(
|
||||||
|
deviceType: deviceType,
|
||||||
|
deviceOS: deviceOS,
|
||||||
|
duration: duration,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return SessionCreateResponse(
|
||||||
|
id: dto.id,
|
||||||
|
current: dto.current,
|
||||||
|
deviceType: deviceType,
|
||||||
|
deviceOS: deviceOS,
|
||||||
|
expiresAt: dto.expiresAt,
|
||||||
|
createdAt: dto.createdAt,
|
||||||
|
updatedAt: dto.updatedAt,
|
||||||
|
token: dto.token,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -1,30 +1,32 @@
|
|||||||
import 'package:cast/device.dart';
|
import 'package:cast/device.dart';
|
||||||
import 'package:cast/session.dart';
|
import 'package:cast/session.dart';
|
||||||
import 'package:flutter/material.dart';
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/models/store.model.dart';
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
||||||
import 'package:immich_mobile/entities/asset.entity.dart';
|
import 'package:immich_mobile/entities/asset.entity.dart';
|
||||||
import 'package:immich_mobile/entities/store.entity.dart';
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
import 'package:immich_mobile/interfaces/cast_destination_service.interface.dart';
|
import 'package:immich_mobile/interfaces/cast_destination_service.interface.dart';
|
||||||
import 'package:immich_mobile/models/cast_manager_state.dart';
|
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
|
||||||
import 'package:immich_mobile/providers/api.provider.dart';
|
import 'package:immich_mobile/models/sessions/session_create_response.model.dart';
|
||||||
|
import 'package:immich_mobile/repositories/asset_api.repository.dart';
|
||||||
import 'package:immich_mobile/repositories/gcast.repository.dart';
|
import 'package:immich_mobile/repositories/gcast.repository.dart';
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
import 'package:immich_mobile/repositories/sessions_api.repository.dart';
|
||||||
import 'package:immich_mobile/utils/image_url_builder.dart';
|
import 'package:immich_mobile/utils/image_url_builder.dart';
|
||||||
import 'package:immich_mobile/utils/url_helper.dart';
|
import 'package:immich_mobile/utils/url_helper.dart';
|
||||||
import 'package:openapi/api.dart' as api;
|
|
||||||
import 'package:uuid/uuid.dart';
|
|
||||||
|
|
||||||
final gCastServiceProvider = Provider(
|
final gCastServiceProvider = Provider(
|
||||||
(ref) => GCastService(
|
(ref) => GCastService(
|
||||||
ref.watch(gCastRepositoryProvider), ref.watch(apiServiceProvider)),
|
ref.watch(gCastRepositoryProvider),
|
||||||
|
ref.watch(sessionsAPIRepositoryProvider),
|
||||||
|
ref.watch(assetApiRepositoryProvider),
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
class GCastService implements ICastDestinationService {
|
class GCastService implements ICastDestinationService {
|
||||||
final GCastRepository _gCastRepository;
|
final GCastRepository _gCastRepository;
|
||||||
final ApiService _apiService;
|
final SessionsAPIRepository _sessionsApiService;
|
||||||
|
final AssetApiRepository _assetApiRepository;
|
||||||
|
|
||||||
api.SessionCreateResponseDto? sessionKey;
|
SessionCreateResponse? sessionKey;
|
||||||
String? currentAssetId;
|
String? currentAssetId;
|
||||||
bool isConnected = false;
|
bool isConnected = false;
|
||||||
|
|
||||||
@ -39,7 +41,11 @@ class GCastService implements ICastDestinationService {
|
|||||||
@override
|
@override
|
||||||
void Function(CastState)? onCastState;
|
void Function(CastState)? onCastState;
|
||||||
|
|
||||||
GCastService(this._gCastRepository, this._apiService) {
|
GCastService(
|
||||||
|
this._gCastRepository,
|
||||||
|
this._sessionsApiService,
|
||||||
|
this._assetApiRepository,
|
||||||
|
) {
|
||||||
_gCastRepository.onCastStatus = _onCastStatusCallback;
|
_gCastRepository.onCastStatus = _onCastStatusCallback;
|
||||||
_gCastRepository.onCastMessage = _onCastMessageCallback;
|
_gCastRepository.onCastMessage = _onCastMessageCallback;
|
||||||
}
|
}
|
||||||
@ -103,29 +109,24 @@ class GCastService implements ICastDestinationService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a session key
|
// create a session key
|
||||||
sessionKey ??= await _apiService.sessionsApi.createSession(
|
sessionKey ??= await _sessionsApiService.createSession(
|
||||||
api.SessionCreateDto(
|
"Cast",
|
||||||
deviceOS: "Google Cast",
|
"Google Cast",
|
||||||
deviceType: "Google Cast",
|
duration: const Duration(minutes: 15).inSeconds,
|
||||||
duration: const Duration(minutes: 15).inSeconds,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
final unauthenticatedUrl = asset.isVideo
|
final unauthenticatedUrl = asset.isVideo
|
||||||
? getPlaybackUrlForRemoteId(
|
? getPlaybackUrlForRemoteId(
|
||||||
asset.remoteId!,
|
asset.remoteId!,
|
||||||
)
|
)
|
||||||
: getThumbnailUrlForRemoteId(
|
: getThumbnailUrlForRemoteId(asset.remoteId!);
|
||||||
asset.remoteId!,
|
|
||||||
type: api.AssetMediaSize.thumbnail,
|
|
||||||
);
|
|
||||||
|
|
||||||
final authenticatedURL =
|
final authenticatedURL =
|
||||||
"$unauthenticatedUrl&sessionKey=${sessionKey?.token}";
|
"$unauthenticatedUrl&sessionKey=${sessionKey?.token}";
|
||||||
|
|
||||||
// get image mime type
|
// get image mime type
|
||||||
final info = await _apiService.assetsApi.getAssetInfo(asset.remoteId!);
|
final mimeType =
|
||||||
final mimeType = info?.originalMimeType;
|
await _assetApiRepository.getAssetMIMEType(asset.remoteId!);
|
||||||
|
|
||||||
if (mimeType == null) {
|
if (mimeType == null) {
|
||||||
return;
|
return;
|
||||||
|
@ -2,7 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
import 'package:immich_mobile/extensions/build_context_extensions.dart';
|
||||||
import 'package:immich_mobile/models/cast_manager_state.dart';
|
import 'package:immich_mobile/models/cast/cast_manager_state.dart';
|
||||||
import 'package:immich_mobile/providers/cast.provider.dart';
|
import 'package:immich_mobile/providers/cast.provider.dart';
|
||||||
|
|
||||||
class CastDialog extends ConsumerWidget {
|
class CastDialog extends ConsumerWidget {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user