PIbd-31_IevlewaMD_PMD/lib/data/mapper/album_mapper.dart
2024-12-10 20:49:23 +04:00

127 lines
4.5 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:pmd_labs/data/dto/album_dto.dart';
import 'package:pmd_labs/card_data.dart';
import 'package:uuid/uuid.dart';
import '../../home_page/home_page.dart';
String generateAlbumId(String name, String artist, String url) {
// Простой способ создания уникального идентификатора
return '$name|$artist|$url';
}
extension AlbumDataDtoMapper on AlbumDataDto {
List<AlbumDataDto> fetchAlbums(List<dynamic> albumsData) {
const String defaultImageUrl = "https://i.ibb.co/VwCkRD4/image.jpg";
List<AlbumDataDto> albums = [];
for (var album in albumsData) {
// Ищем изображение с самым большим размером
String? albumImage;
// Ищем наиболее подходящее изображение
List<dynamic> images = album['image'] as List<dynamic>;
var largestImage = images.firstWhere(
(image) => image['size'] == 'mega',
orElse: () => images.firstWhere(
(image) => image['size'] == 'extralarge',
orElse: () => images.firstWhere(
(image) => image['size'] == 'large',
orElse: () => null, // запасной вариант
),
),
);
if (largestImage['#text'] != "")
albumImage = largestImage['#text'] as String?;
else
albumImage = defaultImageUrl;
if (album['name'] != "(null)" && album['artist'] != "(null)") {
final id = generateAlbumId(album['name'], album['artist'], album['url']);
albums.add(AlbumDataDto(
id: id,
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;
}
Future<AlbumDataDto> fetchAlbumDetails(Map<String, dynamic> data, AlbumDataDto album) async {
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 = data['album']?['wiki']?['summary'] ?? "missing"; // или аналогичное поле
}
return album; // возвращаем заполненное DTO
}
CardData toDomain() {
return CardData(
id: id,
title: title ?? 'UNKNOWN',
artist: artist ?? 'UNKNOWN',
year: year ?? 'UNKNOWN',
url: url ?? 'UNKNOWN',
summary: summary ?? 'UNKNOWN',
genres: genres ?? ['UNKNOWN'],
tracks: tracks ?? ['UNKNOWN'],
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,
);
}
}