ExternalItem.fromJSON constructor
ExternalItem.fromJSON(
- dynamic map
Implementation
factory ExternalItem.fromJSON(dynamic map) {
try {
AppConfig.logger.t("ExternalItem fromJSON: ${map['name'] ?? ''} with id ${map['id'] ?? ''}");
int dur = 0;
if(map['duration'] is String && map['duration'].toString().contains(":")) {
final List<String> parts = map['duration'].toString().split(':');
for (int i = 0; i < parts.length; i++) {
// NC-46 fix: el operador `^` es XOR bit a bit, no exponente.
// Usamos `pow(60, n)` para calcular HH:MM:SS correctamente.
dur += (int.tryParse(parts[i]) ?? 0) * pow(60, parts.length - i - 1).toInt();
}
} else if(map['duration'] is int) {
dur = map['duration'];
}
final externalItem = ExternalItem(
id: map['id'] ?? '',
type: EnumToString.fromString(MediaItemType.values, map['type'].toString()) ?? MediaItemType.song,
album: map['album'] ?? '',
publishedYear: map['publishedYear'] ?? 0,
duration: dur,
language: map['language'] ?? '',
is320Kbps: map['is320Kbps'] ?? false,
lyrics: map['lyrics'] ?? '',
albumId: map['albumId'] ?? '',
description: map['description'] ?? '',
name: map['name'] ?? '',
ownerName: map['ownerName'] ?? '',
externalArtists: (map['externalArtists'] as List<dynamic>?)?.map((e) => e.toString()).toList(),
imgUrl: map['imgUrl'] ?? '',
galleryUrls: (map['galleryUrls'] as List<dynamic>?)?.map((e) => e.toString()).toList(),
url: map['url']?.toString() ?? '',
permaUrl: map['permaUrl'] ?? '',
allUrls: (map['allUrls'] as List<dynamic>?)?.map((e) => e.toString()).toList(),
quality: int.tryParse(map['quality'].toString()),
releaseDate: map['releaseDate'] ?? 0,
trackNumber: map['trackNumber'],
discNumber: map['discNumber'],
source: EnumToString.fromString(ExternalSource.values, map["source"] ?? ExternalSource.unknown.name) ?? ExternalSource.unknown,
likes: map['likes'] ?? 0,
path: map['path'] ?? '',
state: map['state'] ?? 0,
);
return externalItem;
} catch (e, st) {
NeomErrorLogger.recordError(e, st, module: 'neom_core', operation: 'ExternalItem.fromJSON');
throw Exception('Error parsing song item: $e');
}
}