Загрузка mp3 с файловой системой expo приводит к повреждению всех файлов, кроме первого

#typescript #download #expo #mp3

Вопрос:

У меня есть проект, в react native котором загружается аудио и видео с YouTube с помощью expo-file-system модуля.

В частности, есть экран, на котором отображается массив URL-адресов для загрузки, массив информации о файле и предпочтительный формат для загрузки (mp3/mp4). Когда компонент смонтирован, запускается цикл for и запускается функция загрузки, передающая URL-адрес и соответствующую информацию.

Информация просто отображается пользователю и не участвует в загрузке, URL-адрес передается в createDownloadResumable() функцию файловой системы expo.

Проблема в том, что когда я выбираю формат mp3, первый файл загружается нормально, остальные каким-то образом повреждены. Сведения о файле, похоже, не отличаются.

Установка компонентов:

 componentDidMount(): void {  this.prepareDownload(this.state.playlist, this.state.videoInfo);  }  

Подготовленная загрузка:

 async prepareDownload(play, info){  for (let i = 0; i lt; this.state.playlist.length; i = i   1) {  console.log('play: '   play[i]);  console.log('info: '   info[i]);  await this.startDownload(play[i], info[i]);  this.setState({i: i   1});  }  this.setState({done: true});  }  

Начальная загрузка:

 async startDownload(video, info){  this.setState({current: info});  let url = 'https://youtu.be/'   video.contentDetails.videoId;  console.log('URL: ',url);  console.log('Video: ', video.contentDetails);  console.log('Info: ', info);  let asburgo = await ytdl(url, {  filter: (format) =gt; {  if (this.state.format === 'mp4')  return format.container === 'mp4' amp;amp; format.hasAudio;  else  return !format.hasVideo;  }  }); // this gets the actual video url to download  console.log('Asburgo: ', asburgo);   const callback = (downloadProgress: { totalBytesWritten: number; totalBytesExpectedToWrite: number; }) =gt; {  const progress = downloadProgress.totalBytesWritten / downloadProgress.totalBytesExpectedToWrite;  this.setState({  progress: progress,  });  };  let fileUri = FileSystem.documentDirectory   info.title   '.'   this.state.format; // Creating file name and appending format  console.log('URI: '   fileUri); // The printed uri is correct  var downloadResumable = FileSystem.createDownloadResumable(  asburgo[0].url,  fileUri,  {},  callback  );   console.log('Download: ', downloadResumable);   // and this should start it  this.setState({loading: false});  try {  var uri = await downloadResumable.downloadAsync();  console.log('2nd URI: ', uri.uri); // this appears to be correct too  MediaLibrary.saveToLibraryAsync(uri.uri);   uri = null;  fileUri = null;  downloadResumable = null;  asburgo = null; // I thought that maybe the objects I used to download were dirty in the next loop so i tried to remove whatever was inside before starting a new loop  this.setState({progress: 2});  } catch (e) {  console.error(e);  }   }  

У кого-нибудь есть хоть какое-то представление о том, что происходит? Почему, если первая загрузка прошла успешно, остальные должны быть повреждены? И почему только с mp3?