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'; extension AlbumDataDtoMapper on AlbumDataDto { List fetchAlbums(List albumsData) { const String defaultImageUrl = "https://i.ibb.co/VwCkRD4/image.jpg"; List albums = []; final Uuid uuid = Uuid(); for (var album in albumsData) { // Ищем изображение с самым большим размером String? albumImage; // Ищем наиболее подходящее изображение List images = album['image'] as List; 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 = uuid.v4(); 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 fetchAlbumDetails(Map data, AlbumDataDto album) async { if (data['album'] != null) { // Получаем жанры и год String year = ""; List genres = []; // Находим год в тегах year = (data['album']?['tags']?['tag'] as List) .firstWhere( (tag) => tag['name'].contains(RegExp(r'^\d{4}$')), orElse: () => null, )?['name'] ?? "_"; // Получаем список жанров genres = List.from( (data['album']?['tags']?['tag'] as List? ?? []) .map((tag) => tag['name'] as String) ); // Заполняем список треков List tracks = List.from( (data['album']?['tracks']?['track'] as List? ?? []) .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 fetchAlbumsWithPagination(List albumsData) { // Используем существующий метод для извлечения данных альбомов List 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, ); } }