PIbd-31_IevlewaMD_PMD/lib/data/mapper/album_mapper.dart

128 lines
4.3 KiB
Dart
Raw Normal View History

2024-11-08 13:07:43 +04:00
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:pmd_labs/data/dto/album_dto.dart';
import 'package:pmd_labs/card_data.dart';
2024-11-26 01:44:56 +04:00
import 'package:uuid/uuid.dart';
import '../../home_page/home_page.dart';
2024-11-08 13:07:43 +04:00
extension AlbumDataDtoMapper on AlbumDataDto {
List<AlbumDataDto> fetchAlbums(List<dynamic> albumsData) {
2024-11-26 01:44:56 +04:00
const String defaultImageUrl = "https://i.ibb.co/VwCkRD4/image.jpg";
2024-11-08 13:07:43 +04:00
List<AlbumDataDto> albums = [];
2024-11-26 01:44:56 +04:00
final Uuid uuid = Uuid();
2024-11-08 13:07:43 +04:00
for (var album in albumsData) {
// Ищем изображение с самым большим размером
String? albumImage;
// Ищем наиболее подходящее изображение
List<dynamic> images = album['image'] as List<dynamic>;
var largestImage = images.firstWhere(
2024-11-26 01:44:56 +04:00
(image) => image['size'] == 'mega',
orElse: () => images.firstWhere(
(image) => image['size'] == 'extralarge',
orElse: () => images.firstWhere(
(image) => image['size'] == 'large',
orElse: () => null, // запасной вариант
),
),
2024-11-08 13:07:43 +04:00
);
2024-11-26 01:44:56 +04:00
if(largestImage['#text'] != "")
albumImage = largestImage['#text'] as String?;
else
albumImage = defaultImageUrl;
2024-11-08 13:07:43 +04:00
if (album['name'] != "(null)" && album['artist'] != "(null)") {
2024-11-26 01:44:56 +04:00
final id = uuid.v4();
2024-11-08 13:07:43 +04:00
albums.add(AlbumDataDto(
2024-11-26 01:44:56 +04:00
id: id,
2024-11-08 13:07:43 +04:00
title: album['name'] as String?,
artist: album['artist'] as String?,
year: "",
genres: [],
tracks: [],
summary: "",
url: album['url'] as String?,
images: AlbumDataImagesDto(
jpg: AlbumDataImagesJPGDto(image_url: albumImage),
),
));
}
}
return albums;
}
2024-11-26 01:44:56 +04:00
Future<AlbumDataDto> fetchAlbumDetails(Map<String, dynamic> data, AlbumDataDto album) async {
2024-11-08 13:07:43 +04:00
if (data['album'] != null) {
// Получаем жанры и год
String year = "";
List<String> genres = [];
// Находим год в тегах
year = (data['album']?['tags']?['tag'] as List)
.firstWhere(
(tag) => tag['name'].contains(RegExp(r'^\d{4}$')),
orElse: () => null,
)?['name'] ?? "_";
// Получаем список жанров
genres = List<String>.from(
(data['album']?['tags']?['tag'] as List<dynamic>? ?? [])
.map((tag) => tag['name'] as String)
);
// Заполняем список треков
List<String> tracks = List<String>.from(
(data['album']?['tracks']?['track'] as List<dynamic>? ?? [])
.map((track) => track['name'] as String)
);
// Обновляем информацию в нашем DTO альбома
album.year = year;
album.genres = genres;
album.tracks = tracks;
// Обновляем дополнительную информацию, если необходимо
album.summary =
2024-11-26 01:44:56 +04:00
data['album']?['wiki']?['summary'] ?? "missing"; // или аналогичное поле
2024-11-08 13:07:43 +04:00
}
return album; // возвращаем заполненное DTO
}
CardData toDomain() {
return CardData(
2024-11-26 01:44:56 +04:00
id: id,
2024-11-08 13:07:43 +04:00
title: title ?? 'UNKNOWN',
artist: artist ?? 'UNKNOWN',
year: year ?? 'UNKNOWN',
url: url ?? 'UNKNOWN',
summary: summary ?? 'UNKNOWN',
genres: genres ?? ['UNKNOWN'],
tracks: tracks ?? ['UNKNOWN'],
2024-11-26 01:44:56 +04:00
imageUrl: images?.jpg?.image_url ?? 'UNKNOWN', // Привязываем imageUrl к DTO
);
}
}
extension AlbumDtoMapper on AlbumDto {
List<AlbumDataDto> fetchAlbumsWithPagination(List<dynamic> albumsData) {
// Используем существующий метод для извлечения данных альбомов
List<AlbumDataDto> albums = AlbumDataDto().fetchAlbums(albumsData);
// Другие манипуляции с пагинацией можно добавить здесь,
// если получены дополнительные данные пагинации и необходим их анализ
return albums;
}
HomeData toDomain() {
return HomeData(
data: data?.map((e) => e.toDomain()).toList(),
nextPage: (pagination?.hasNextPage ?? false)
? ((pagination?.currentPage ?? 0) + 1)
: null,
2024-11-08 13:07:43 +04:00
);
}
}