import 'dart:convert'; import 'package:dio/dio.dart'; import 'package:pmd_labs/data/dto/album_dto.dart'; import 'package:pmd_labs/card_data.dart'; extension AlbumDataDtoMapper on AlbumDataDto { List fetchAlbums(List albumsData) { List albums = []; 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: () => images.first // запасной вариант ) ) ); albumImage = largestImage['#text'] as String?; if (album['name'] != "(null)" && album['artist'] != "(null)") { albums.add(AlbumDataDto( id: null, // Вы можете установить значение 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( 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 ); } }