//Download songs. Taken from BeatSaberMultiplayer //availableSongs: List of IBeatmapLevel which may hold levels already approved for display //downloadQueue: List of beatsaver ids representing songs left to download //completedDownloads: List of beatsaver ids representing songs that have successfully downloaded //songId: The song this instance of the Coroutine is supposed to download //slvc: The song list view controller to display the downloaded songs to private static IEnumerator DownloadSongs(string songHash, SongListViewController slvc) { UnityWebRequest www = UnityWebRequest.Get($"{beatSaverDownloadUrl}{songHash}"); #if BETA Logger.Info($"DOWNLOADING: {beatSaverDownloadUrl}{songHash}"); #endif bool timeout = false; float time = 0f; www.SetRequestHeader("user-agent", @"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36"); UnityWebRequestAsyncOperation asyncRequest = www.SendWebRequest(); while (!asyncRequest.isDone || asyncRequest.progress < 1f) { yield return(null); time += Time.deltaTime; if (time >= 15f && asyncRequest.progress == 0f) { www.Abort(); timeout = true; } } if (www.isNetworkError || www.isHttpError || timeout) { Logger.Error($"Error downloading song {songHash}: {www.error}"); slvc.ErrorHappened($"Error downloading song {songHash}: {www.error}"); } else { //Logger.Info("Received response from BeatSaver.com..."); string zipPath = ""; string customSongsPath = CustomLevelPathHelper.customLevelsDirectoryPath; string customSongPath = ""; byte[] data = www.downloadHandler.data; try { customSongPath = customSongsPath + "/" + songHash + "/"; zipPath = customSongPath + songHash + ".zip"; if (!Directory.Exists(customSongPath)) { Directory.CreateDirectory(customSongPath); } File.WriteAllBytes(zipPath, data); //Logger.Info("Downloaded zip file!"); } catch (Exception e) { Logger.Error($"Error writing zip: {e}"); slvc.ErrorHappened($"Error writing zip: {e}"); yield break; } //Logger.Info("Extracting..."); try { ZipFile.ExtractToDirectory(zipPath, customSongPath); } catch (Exception e) { Logger.Error($"Unable to extract ZIP! Exception: {e}"); slvc.ErrorHappened($"Unable to extract ZIP! Exception: {e}"); yield break; } try { File.Delete(zipPath); } catch (IOException e) { Logger.Warning($"Unable to delete zip! Exception: {e}"); slvc.ErrorHappened($"Unable to delete zip! Exception: {e}"); yield break; } Logger.Success($"Downloaded!"); } }