private async Task HandleFileRenamedOrMove(MusicFile musicFile, MusicFile existingMusicFile) { // TODO: If there are mulitple exact files in the library (i.e. same album in 2 different folders?) // this method section will keep running every time on startup as the hash will be the same and it thinks // the files have been moved... Need to consider a how to handle this. if (MainFormIsAborting()) { return; } Logger.LogInfo( "HandleFileRenamedOrMove", "File rename or moved detected. From: " + existingMusicFile.Path + " to: " + musicFile.Path); await SetUploadDetails("Already Present: " + DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, false, false); await SetUploadDetails("Already Present: " + DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, true, false); MainForm.SetStatusMessage("Comparing file system against database for existing uploads", "Comparing file system against the DB"); existingMusicFile.Path = musicFile.Path; existingMusicFile.LastUpload = DateTime.Now; existingMusicFile.Removed = false; TrackAndReleaseMbId trackAndReleaseMbId = null; if (string.IsNullOrEmpty(musicFile.MbId) || string.IsNullOrEmpty(musicFile.ReleaseMbId)) { trackAndReleaseMbId = MainForm.MusicDataFetcher.GetTrackAndReleaseMbId(musicFile.Path, false); } if (string.IsNullOrEmpty(existingMusicFile.MbId)) { existingMusicFile.MbId = string.IsNullOrEmpty(musicFile.MbId) ? string.IsNullOrEmpty(trackAndReleaseMbId.MbId) ? existingMusicFile.MbId : trackAndReleaseMbId.MbId : musicFile.MbId; } if (string.IsNullOrEmpty(existingMusicFile.ReleaseMbId)) { existingMusicFile.ReleaseMbId = string.IsNullOrEmpty(musicFile.ReleaseMbId) ? string.IsNullOrEmpty(trackAndReleaseMbId.ReleaseMbId) ? existingMusicFile.ReleaseMbId : trackAndReleaseMbId.ReleaseMbId : musicFile.MbId; } _uploadedCount++; MainForm.SetUploadedLabel(_uploadedCount.ToString()); musicFile.Delete(true).Wait(); await existingMusicFile.Save(); }
private async Task HandleFileAlreadyUploaded(MusicFile musicFile, string entityId, string videoId) { if (MainFormIsAborting()) { return; } await SetUploadDetails("Already Present: " + DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, false, false); await SetUploadDetails("Already Present: " + DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, true, false); MainForm.SetStatusMessage("Comparing and updating database with existing uploads", "Comparing files with YouTube Music"); TrackAndReleaseMbId trackAndReleaseMbId = null; if (string.IsNullOrEmpty(musicFile.MbId) || string.IsNullOrEmpty(musicFile.ReleaseMbId)) { trackAndReleaseMbId = MainForm.MusicDataFetcher.GetTrackAndReleaseMbId(musicFile.Path, false); } musicFile.LastUpload = DateTime.Now; musicFile.Error = false; musicFile.EntityId = entityId; musicFile.VideoId = videoId; try { musicFile.MbId = !string.IsNullOrEmpty(musicFile.MbId) ? musicFile.MbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.MbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .MbId); } catch { } try { musicFile.ReleaseMbId = !string.IsNullOrEmpty(musicFile.ReleaseMbId) ? musicFile.ReleaseMbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.ReleaseMbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .ReleaseMbId); } catch { } _uploadedCount++; MainForm.SetUploadedLabel(_uploadedCount.ToString()); }
private async Task HandleFileNeedsUploading(MusicFile musicFile) { await SetUploadDetails(DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, false, false); await SetUploadDetails(DirectoryHelper.EllipsisPath(musicFile.Path, 210), musicFile.Path, true, true); // Peform MusicBrainz lookup if required bool success = false; for (int i = 0; i < 100; i++) { Requests.UploadTrack( MainForm, MainForm.Settings.AuthenticationCookie, musicFile.Path, MainForm.Settings.ThrottleSpeed, out string error); if (!string.IsNullOrEmpty(error)) { if (i >= Global.YouTubeMusic500ErrorRetryAttempts) { musicFile.Error = true; musicFile.ErrorReason = error; _errorsCount++; MainForm.SetIssuesLabel(_errorsCount.ToString()); success = false; break; } else { MainForm.SetStatusMessage($"500 Error from YT Music. Waiting 10 seconds then trying again " + $"({i + 1}/{Global.YouTubeMusic500ErrorRetryAttempts})", $"500 Error from YT Music. Waiting 10 seconds then trying again " + $"({i + 1}/{Global.YouTubeMusic500ErrorRetryAttempts})"); Thread.Sleep(10000); // 10 seconds } } else { success = true; break; } } if (success) { TrackAndReleaseMbId trackAndReleaseMbId = null; if (string.IsNullOrEmpty(musicFile.MbId) || string.IsNullOrEmpty(musicFile.ReleaseMbId)) { trackAndReleaseMbId = MainForm.MusicDataFetcher.GetTrackAndReleaseMbId(musicFile.Path, true); } musicFile.LastUpload = DateTime.Now; musicFile.Error = false; musicFile.MbId = !string.IsNullOrEmpty(musicFile.MbId) ? musicFile.MbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.MbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .MbId); musicFile.ReleaseMbId = !string.IsNullOrEmpty(musicFile.ReleaseMbId) ? musicFile.ReleaseMbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.ReleaseMbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .ReleaseMbId); // We've uploaded it, so now see if we can get the YouTube Music entityId if (Requests.IsSongUploaded(musicFile.Path, MainForm.Settings.AuthenticationCookie, out string entityId, MainForm.MusicDataFetcher, false) != Requests.UploadCheckResult.NotPresent) { musicFile.EntityId = entityId; } _uploadedCount++; MainForm.SetUploadedLabel(_uploadedCount.ToString()); } GC.Collect(); GC.WaitForPendingFinalizers(); }
private async Task HandleFileNeedsUploading(MusicFile musicFile) { if (MainFormIsAborting()) { return; } Logger.LogInfo("HandleFileNeedsUploading", "Begin file upload: " + musicFile.Path); try { await SetUploadDetails(DirectoryHelper.EllipsisPath(musicFile.Path, 248), musicFile.Path, false, false); await SetUploadDetails(DirectoryHelper.EllipsisPath(musicFile.Path, 248), musicFile.Path, true, true); // Peform MusicBrainz lookup if required bool success = false; for (int i = 0; i < 10; i++) { if (MainFormIsAborting()) { return; } if (musicFile.Error != null && (bool)musicFile.Error && musicFile.UploadAttempts != null && musicFile.UploadAttempts >= Global.YTMusic500ErrorRetryAttempts + 1 && musicFile.LastUploadError > DateTime.Now.AddDays(-30)) { break; } if (new FileInfo(musicFile.Path).Length > 299999999) { musicFile.Error = true; musicFile.ErrorReason = "File size exeeds YTM limit of 300 MB per track."; musicFile.LastUploadError = DateTime.Now; musicFile.UploadAttempts = musicFile.UploadAttempts == null ? 0 : ((int)musicFile.UploadAttempts) + 1; break; } else { if (MainFormIsAborting()) { return; } Requests.UploadTrack( MainForm, MainForm.Settings.AuthenticationCookie, musicFile.Path, MainForm.Settings.ThrottleSpeed, out string error); if (MainFormIsAborting()) { return; } if (!string.IsNullOrEmpty(error)) { if (i >= Global.YTMusic500ErrorRetryAttempts) { musicFile.Error = true; musicFile.ErrorReason = error; musicFile.LastUploadError = DateTime.Now; musicFile.UploadAttempts = musicFile.UploadAttempts == null ? 0 : ((int)musicFile.UploadAttempts) + 1; _errorsCount++; MainForm.SetIssuesLabel(_errorsCount.ToString()); success = false; break; } else { musicFile.Error = true; musicFile.ErrorReason = error; musicFile.LastUploadError = DateTime.Now; musicFile.UploadAttempts = musicFile.UploadAttempts == null ? 0 : ((int)musicFile.UploadAttempts) + 1; MainForm.SetStatusMessage($"500 Error from YT Music. Waiting 10 seconds then trying again " + $"({i + 1}/{Global.YTMusic500ErrorRetryAttempts})", $"Retrying on 500 error " + $"({i + 1}/{(musicFile.UploadAttempts == null || musicFile.UploadAttempts == 0 ? Global.YTMusic500ErrorRetryAttempts : 1)})"); ThreadHelper.SafeSleep(10000); // 10 seconds } } else { success = true; break; } } } if (success) { if (MainFormIsAborting()) { return; } TrackAndReleaseMbId trackAndReleaseMbId = null; if (string.IsNullOrEmpty(musicFile.MbId) || string.IsNullOrEmpty(musicFile.ReleaseMbId)) { trackAndReleaseMbId = MainForm.MusicDataFetcher.GetTrackAndReleaseMbId(musicFile.Path, true); } musicFile.LastUpload = DateTime.Now; musicFile.Error = false; try { musicFile.MbId = !string.IsNullOrEmpty(musicFile.MbId) ? musicFile.MbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.MbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .MbId); } catch { } try { musicFile.ReleaseMbId = !string.IsNullOrEmpty(musicFile.ReleaseMbId) ? musicFile.ReleaseMbId : (!Requests.UploadCheckCache.CachedObjectHash.Contains(musicFile.Path) ? trackAndReleaseMbId.ReleaseMbId : Requests.UploadCheckCache.CachedObjects.Where(m => m.MusicFilePath == musicFile.Path) .FirstOrDefault() .ReleaseMbId); } catch { } if (MainFormIsAborting()) { return; } string entityId = musicFile.EntityId; // We've uploaded it, so now see if we can get the YouTube Music entityId if (Requests.IsSongUploaded(musicFile.Path, MainForm.Settings.AuthenticationCookie, ref entityId, out string videoId, MainForm.MusicDataFetcher, false) != Requests.UploadCheckResult.NotPresent) { musicFile.EntityId = entityId; musicFile.VideoId = videoId; } _uploadedCount++; MainForm.SetUploadedLabel(_uploadedCount.ToString()); Logger.LogInfo("HandleFileNeedsUploading", "File upload SUCCESS: " + musicFile.Path); } } catch (Exception e) { Logger.Log(e, "File upload FAIL: " + musicFile.Path); } }