youtube_explode_dart icon indicating copy to clipboard operation
youtube_explode_dart copied to clipboard

[BUG] Files are being corrupted on iOS

Open HelloItsMeAdm opened this issue 1 year ago • 0 comments

Describe the bug I started using my app on the iOS instead of android and i found that on android files play normally and work as they should. But on the iOS they seem to be somehow corrupted. They cant be played, even using app like VLC. It shows the duration of the files (sometimes) and the size seems to be ok. I tried both downloading mp3 and aac but non of these work.

To Reproduce Include the code which doesn't work in the code markdown..

Future<void> download(
      String id, BuildContext context, String title, bool useSnacker) async {
    String basePath = await getAppSpecificFilesDir();

    final String mp3Path = "$basePath/mp3/$id.mp3";
    final String thumbnailPath = "$basePath/thumbnails/$id.jpg";

    await createFolders(basePath);

    await downloadThumbnail(thumbnailPath, id);

    // Check if file already exists or if path is invalid
    if (basePath == "" || await File(mp3Path).exists()) {
      return;
    }

    final manifest = await yt.videos.streamsClient.getManifest(id);
    final streamInfo = manifest.audioOnly.withHighestBitrate();

    var stream = yt.videos.streamsClient.get(streamInfo);

    // Open a file for writing.
    var file = File(mp3Path);
    var fileStream = file.openWrite();

    if (useSnacker) {
      Snacker().show(
        context: context,
        contentType: ContentType.warning,
        title: "Downloading started...",
        message: title,
      );
    }

    // Write the stream to the file.
    await stream.pipe(fileStream);

    // Close the file.
    await fileStream.flush();
    await fileStream.close();

    //wait for the thumbnail to be downloaded and then show the snackbar
    while (!await File(thumbnailPath).exists()) {
      await Future.delayed(const Duration(milliseconds: 100));
    }

    if (useSnacker) {
      Snacker().show(
        context: context,
        contentType: ContentType.success,
        title: "Download complete!",
        message: title,
      );
    }
    print("Download for $id complete!");
  }

Enviroment: (please complete the following information):

  • Enviroment: [Flutter o Dart VM]
  • Version 3.7.12
  • YoutubeExplode Version 1.12.3

EDIT It seems that final streamInfo = manifest.audioOnly.withHighestBitrate(); was making problems, when i changed it to final streamInfo = manifest.muxed.withHighestBitrate(); it solved it.

HelloItsMeAdm avatar Apr 30 '23 16:04 HelloItsMeAdm