108 lines
3.7 KiB
Dart
108 lines
3.7 KiB
Dart
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<AlbumDataDto> fetchAlbums(List<dynamic> albumsData) {
|
||
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: () => 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<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(
|
||
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
|
||
);
|
||
}
|
||
} |