ExternalItem.fromJSON constructor

ExternalItem.fromJSON(
  1. 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');
  }
}