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 fetchAlbums(List albumsData) { const String defaultImageUrl = "https://i.ibb.co/VwCkRD4/image.jpg"; 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: () => 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 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; } 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', ); } } 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, ); } }