getIosApps static method

Future<List<App>> getIosApps(
  1. String id
)

Implementation

static Future<List<App>> getIosApps(String id) async {
  id = id.split("/").last;
  if (!RegExp(r'^id\d+$').hasMatch(id)) {
    dPrint("Invalid Apple developer ID format: $id");
    return [];
  }
  try {
    final String? pageContent = await Util._fetchUrl(
      "https://apps.apple.com/us/developer/x/$id?see-all=i-phonei-pad-apps",
    );
    if (pageContent == null) {
      return [];
    }
    final Map<String, String> categoriesMap = Map<String, String>.fromEntries(
      (_parseScriptTagData(
        pageContent: pageContent,
        scriptId: "developer",
      )["hasOfferCatalog"]["itemListElement"] as List)
          .whereType<Map>()
          .map(
            (i) => MapEntry(
              i["name"],
              i["applicationCategory"],
            ),
          ),
    );
    final List<dynamic> shelves = (_parseScriptTagData(
      pageContent: pageContent,
      scriptId: "serialized-server-data",
    ) as List)
        .first["data"]["shelves"];
    final List<dynamic> appItems = shelves.firstWhere(
          (i) => i["impressionMetrics"]["fields"]["name"] == "iPad & iPhone",
          orElse: () => null,
        )?["items"] ??
        [];
    return appItems
        .map(
          (item) => App(
            id: item["bundleId"],
            name: item["title"],
            category: categoriesMap[item["title"]] ?? "Unknown",
            developerName: item["developerName"],
            rating: double.tryParse(item["rating"].toString()) ?? 0,
            imageUrl: (item["icon"]["template"] as String)
                .replaceAll("{w}x{h}{c}.{f}", "512x0w.png"),
            url: item["clickAction"]["pageUrl"],
            platform: AppPlatform.ios,
            isFree: item["offerDisplayProperties"]["isFree"],
          ),
        )
        .toList();
  } catch (e) {
    dPrint("Exception while parsing iOS apps $e");
  }
  return [];
}