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