PIbd-31_IevlewaMD_PMD/lib/data/mapper/album_mapper.dart
2024-11-08 13:07:43 +04:00

108 lines
3.7 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';
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
);
}
}