Пример #1
0
        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();
        }
Пример #2
0
        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());
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
            }
        }