#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?