Beispiel #1
0
        private static int CompareVersionTo(SVR_VideoLocal newFile, SVR_VideoLocal oldFile)
        {
            AniDB_File newAni = newFile?.GetAniDBFile();
            AniDB_File oldAni = oldFile?.GetAniDBFile();

            if (newAni == null || oldAni == null)
            {
                return(0);
            }
            if (!newAni.Anime_GroupName.Equals(oldAni.Anime_GroupName))
            {
                return(0);
            }
            if (!newAni.File_VideoResolution.Equals(oldAni.File_VideoResolution))
            {
                return(0);
            }
            if (!(newFile.Media?.VideoStream?.BitDepth).Equals(oldFile.Media?.VideoStream?.BitDepth))
            {
                return(0);
            }
            if (!string.Equals(newFile.Media?.VideoStream?.CodecID, oldFile.Media?.VideoStream?.CodecID))
            {
                return(0);
            }
            return(oldAni.FileVersion.CompareTo(newAni.FileVersion));
        }
Beispiel #2
0
 public static string GetResolution(SVR_VideoLocal videoLocal, SVR_AniDB_File aniFile = null)
 {
     if (aniFile == null)
     {
         aniFile = videoLocal?.GetAniDBFile();
     }
     return(MediaInfoUtils.GetStandardResolution(GetResolutionInternal(videoLocal, aniFile)));
 }
        private static int CompareVersionTo(SVR_VideoLocal newFile, SVR_VideoLocal oldFile)
        {
            AniDB_File newani = newFile.GetAniDBFile();
            AniDB_File oldani = oldFile.GetAniDBFile();

            if (!newani.Anime_GroupName.Equals(oldani.Anime_GroupName))
            {
                return(0);
            }
            if (!newani.File_VideoResolution.Equals(oldani.File_VideoResolution))
            {
                return(0);
            }
            if (!newFile.VideoBitDepth.Equals(oldFile.VideoBitDepth))
            {
                return(0);
            }
            return(oldani.FileVersion.CompareTo(newani.FileVersion));
        }
        public static bool CheckFileKeep(SVR_VideoLocal file)
        {
            bool result = true;

            SVR_AniDB_File aniFile = file.GetAniDBFile();

            // Don't delete files with missing info. If it's not getting updated, then do it manually
            if (aniFile != null)
            {
                if (aniFile.File_Source.Equals("unknown"))
                {
                    return(true);
                }
                if (aniFile.File_VideoResolution.Equals("0x0"))
                {
                    return(true);
                }
            }
            foreach (var type in Settings._requiredtypes)
            {
                if (!result)
                {
                    break;
                }
                switch (type)
                {
                case FileQualityFilterType.AUDIOCODEC:
                    result &= CheckAudioCodec(file);
                    break;

                case FileQualityFilterType.AUDIOSTREAMCOUNT:
                    result &= CheckAudioStreamCount(file);
                    break;

                case FileQualityFilterType.CHAPTER:
                    if (aniFile == null)
                    {
                        return(false);
                    }
                    result &= CheckChaptered(file);
                    break;

                case FileQualityFilterType.RESOLUTION:
                    result &= CheckResolution(file, aniFile);
                    break;

                case FileQualityFilterType.SOURCE:
                    if (aniFile == null)
                    {
                        return(false);
                    }
                    result &= CheckSource(aniFile);
                    break;

                case FileQualityFilterType.SUBGROUP:
                    if (aniFile == null)
                    {
                        return(false);
                    }
                    result &= CheckSubGroup(aniFile);
                    break;

                case FileQualityFilterType.SUBSTREAMCOUNT:
                    result &= CheckSubStreamCount(file);
                    break;

                case FileQualityFilterType.VERSION:
                    if (aniFile == null)
                    {
                        return(false);
                    }
                    result &= CheckDeprecated(aniFile);
                    break;

                case FileQualityFilterType.VIDEOCODEC:
                    if (aniFile == null)
                    {
                        return(false);
                    }
                    result &= CheckVideoCodec(file);
                    break;
                }
            }

            return(result);
        }
        // -1 if oldFile is to be deleted, 0 if they are comparatively equal, 1 if the oldFile is better
        public static int CompareTo(this SVR_VideoLocal newFile, SVR_VideoLocal oldFile)
        {
            var oldEp  = oldFile?.GetAniDBFile();
            var newEp  = newFile?.GetAniDBFile();
            int result = 0;

            foreach (FileQualityFilterType type in Settings._types)
            {
                switch (type)
                {
                case FileQualityFilterType.AUDIOCODEC:
                    result = CompareAudioCodecTo(newFile, oldFile);
                    break;

                case FileQualityFilterType.AUDIOSTREAMCOUNT:
                    result = CompareAudioStreamCountTo(newFile, oldFile);
                    break;

                case FileQualityFilterType.CHAPTER:
                    result = CompareChapterTo(newFile, newEp, oldFile, oldEp);
                    break;

                case FileQualityFilterType.RESOLUTION:
                    result = CompareResolutionTo(newFile, oldFile, newEp, oldEp);
                    break;

                case FileQualityFilterType.SOURCE:
                    if (newEp == null)
                    {
                        return(1);
                    }
                    if (oldEp == null)
                    {
                        return(-1);
                    }
                    result = CompareSourceTo(newEp, oldEp);
                    break;

                case FileQualityFilterType.SUBGROUP:
                    if (newEp == null)
                    {
                        return(1);
                    }
                    if (oldEp == null)
                    {
                        return(-1);
                    }
                    result = CompareSubGroupTo(newEp, oldEp);
                    break;

                case FileQualityFilterType.SUBSTREAMCOUNT:
                    result = CompareSubStreamCountTo(newFile, oldFile);
                    break;

                case FileQualityFilterType.VERSION:
                    if (newEp == null)
                    {
                        return(1);
                    }
                    if (oldEp == null)
                    {
                        return(-1);
                    }
                    result = CompareVersionTo(newFile, oldFile);
                    break;

                case FileQualityFilterType.VIDEOCODEC:
                    result = CompareVideoCodecTo(newFile, oldFile);
                    break;
                }
                if (result != 0)
                {
                    return(result);
                }
            }

            return(0);
        }
 private static bool CheckChaptered(SVR_VideoLocal aniFile)
 {
     return(aniFile.GetAniDBFile()?.IsChaptered == 1 || aniFile.Media.Chaptered);
 }
Beispiel #7
0
        public override void ProcessCommand()
        {
            logger.Info("Processing CommandRequest_UpdateMyListFileStatus: {0}", Hash);


            try
            {
                // NOTE - we might return more than one VideoLocal record here, if there are duplicates by hash
                SVR_VideoLocal vid = Repo.Instance.VideoLocal.GetByHash(Hash);
                if (vid != null)
                {
                    if (vid.GetAniDBFile() != null)
                    {
                        if (WatchedDateAsSecs > 0)
                        {
                            DateTime?watchedDate = Commons.Utils.AniDB.GetAniDBDateAsDate(WatchedDateAsSecs);
                            ShokoService.AnidbProcessor.UpdateMyListFileStatus(vid, Watched, watchedDate);
                        }
                        else
                        {
                            ShokoService.AnidbProcessor.UpdateMyListFileStatus(vid, Watched);
                        }
                    }
                    else
                    {
                        // we have a manual link, so get the xrefs and add the episodes instead as generic files
                        var xrefs = vid.EpisodeCrossRefs;
                        foreach (var xref in xrefs)
                        {
                            var episode = xref.GetEpisode();
                            if (episode == null)
                            {
                                continue;
                            }
                            if (WatchedDateAsSecs > 0)
                            {
                                DateTime?watchedDate = Commons.Utils.AniDB.GetAniDBDateAsDate(WatchedDateAsSecs);
                                ShokoService.AnidbProcessor.UpdateMyListFileStatus(vid, episode.AnimeID,
                                                                                   episode.EpisodeNumber, Watched, watchedDate);
                            }
                            else
                            {
                                ShokoService.AnidbProcessor.UpdateMyListFileStatus(vid, episode.AnimeID,
                                                                                   episode.EpisodeNumber, Watched);
                            }
                        }
                    }

                    logger.Info("Updating file list status: {0} - {1}", vid, Watched);

                    if (UpdateSeriesStats)
                    {
                        // update watched stats
                        List <SVR_AnimeEpisode> eps = Repo.Instance.AnimeEpisode.GetByHash(vid.ED2KHash);
                        if (eps.Count > 0)
                        {
                            eps.DistinctBy(a => a.AnimeSeriesID).ForEach(a => a.GetAnimeSeries().QueueUpdateStats());
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                logger.Error("Error processing CommandRequest_UpdateMyListFileStatus: {0} - {1}", Hash, ex);
            }
        }
 private static bool CheckChaptered(SVR_VideoLocal aniFile)
 {
     return(aniFile?.GetAniDBFile()?.IsChaptered == 1 || (aniFile?.Media?.Chaptered ?? false));
 }
        public string GetFileName(SVR_VideoLocal video)
        {
            var file    = video.GetAniDBFile();
            var episode = video.GetAnimeEpisodes()[0].AniDB_Episode;
            var anime   = RepoFactory.AniDB_Anime.GetByAnimeID(episode.AnimeID);

            StringBuilder name = new StringBuilder();

            if (!string.IsNullOrWhiteSpace(file.Anime_GroupNameShort))
            {
                name.Append($"[{file.Anime_GroupNameShort}]");
            }

            name.Append($" {anime.PreferredTitle}");
            if (anime.AnimeType != (int)AnimeType.Movie)
            {
                string prefix = "";

                if (episode.GetEpisodeTypeEnum() == EpisodeType.Credits)
                {
                    prefix = "C";
                }
                if (episode.GetEpisodeTypeEnum() == EpisodeType.Other)
                {
                    prefix = "O";
                }
                if (episode.GetEpisodeTypeEnum() == EpisodeType.Parody)
                {
                    prefix = "P";
                }
                if (episode.GetEpisodeTypeEnum() == EpisodeType.Special)
                {
                    prefix = "S";
                }
                if (episode.GetEpisodeTypeEnum() == EpisodeType.Trailer)
                {
                    prefix = "T";
                }

                int epCount = 1;

                if (episode.GetEpisodeTypeEnum() == EpisodeType.Episode)
                {
                    epCount = anime.EpisodeCountNormal;
                }
                if (episode.GetEpisodeTypeEnum() == EpisodeType.Special)
                {
                    epCount = anime.EpisodeCountSpecial;
                }

                name.Append($" - {prefix}{PadNumberTo(episode.EpisodeNumber, epCount)}");
            }
            name.Append($" ({video.VideoResolution}");
            if (file.File_Source != null &&
                (file.File_Source.Equals("DVD", StringComparison.InvariantCultureIgnoreCase) ||
                 file.File_Source.Equals("Blu-ray", StringComparison.InvariantCultureIgnoreCase)))
            {
                name.Append($" {file.File_Source}");
            }

            name.Append($" {(file?.File_VideoCodec ?? video.VideoCodec).Replace("\\", "").Replace("/", "")}".TrimEnd());

            if (video.VideoBitDepth == "10")
            {
                name.Append($" {video.VideoBitDepth}bit");
            }
            name.Append(')');

            if (file.IsCensored != 0)
            {
                name.Append(" [CEN]");
            }

            name.Append($" [{video.CRC32.ToUpper()}]");
            name.Append($"{System.IO.Path.GetExtension(video.GetBestVideoLocalPlace().FilePath)}");

            return(Utils.ReplaceInvalidFolderNameCharacters(name.ToString()));
        }
Beispiel #10
0
        public string GetFileName(SVR_VideoLocal video)
        {
            if (video == null)
            {
                return("*Error: Unable to access file");
            }

            // base data
            string               scriptCode = _rawScript.Script;
            SVR_AniDB_File       file       = video.GetAniDBFile();
            List <AniDB_Episode> episodes   = new List <AniDB_Episode>();
            SVR_AniDB_Anime      anime;

            // error handling (not all is in this)
            if (file == null)
            {
                var epIntmdry = video.GetAnimeEpisodes();
                if (epIntmdry.Count == 0)
                {
                    return("*Error: Unable to get episode for file");
                }
                episodes.Add(epIntmdry[0].AniDB_Episode);
                anime = RepoFactory.AniDB_Anime.GetByAnimeID(episodes[0].AnimeID);
                if (anime == null)
                {
                    return("*Error: Unable to get anime for file");
                }
            }
            else
            {
                episodes = file.Episodes;
                if (episodes.Count == 0)
                {
                    return("*Error: Unable to get episode for file");
                }
                anime = RepoFactory.AniDB_Anime.GetByAnimeID(episodes[0].AnimeID);
                if (anime == null)
                {
                    return("*Error: Unable to get anime for file");
                }
            }

            if (string.IsNullOrEmpty(scriptCode))
            {
                return("*Error: No script available for renamer");
            }

            // TODO: start filling up tables (crudely, will implement better later (maybe (probably (hopefully))))
            // future me: actually this makes for a very strong renamer
            UserData.RegisterType <SVR_VideoLocal>();
            UserData.RegisterType <SVR_AniDB_File>();
            UserData.RegisterType <AniDB_Episode>();
            UserData.RegisterType <SVR_AniDB_Anime>();
            UserData.RegisterType <AniDB_Anime_Title>();
            UserData.RegisterExtensionType(typeof(Models)); // extends SVR_AniDB_Anime

            UserData.RegisterType <EpisodeType>();

            DynValue videoLuaObject   = UserData.Create(video);
            DynValue fileLuaObject    = UserData.Create(file);
            DynValue episodeLuaObject = UserData.Create(episodes[0]);
            DynValue animeLuaObject   = UserData.Create(anime);

            _script.Globals["EpisodeType"] = UserData.CreateStatic <EpisodeType>();
            _script.Globals.Set("video", videoLuaObject);
            _script.Globals.Set("file", fileLuaObject);
            _script.Globals.Set("episode", episodeLuaObject);
            _script.Globals["episodes"] = episodes;
            _script.Globals.Set("anime", animeLuaObject);
            // (I have)/(deodex has) no idea if this is dangerous. It's as if the interpreter is as strong as the C# method
            // (as long as the private-public keywords are actually used correctly, it should be fine)

            // make sure name is a string by initializing it as an empty one (in case its not used)
            _script.Globals["name"] = "";

            // run the script, get the variable "name" (str)
            _script.DoString(scriptCode);
            string scriptResult = _script.Globals.Get("name").ToString();

            // Substring used since the string is being wrapped with "" for some reason
            if (string.IsNullOrEmpty(scriptResult.Substring(1, scriptResult.Length - 2)))
            {
                return("*Error: the new filename is empty (script error)");
            }

            //copy-pasted
            string pathToVid = video.GetBestVideoLocalPlace().FilePath;

            if (string.IsNullOrEmpty(pathToVid))
            {
                return("*Error: Unable to get the file's old filename");
            }
            string ext = Path.GetExtension(pathToVid); //Prefer VideoLocal_Place as this is more accurate.

            if (string.IsNullOrEmpty(ext))
            {
                return("*Error: Unable to get the file's extension"); // fail if we get a blank extension, something went wrong
            }
            string renameTo = $"{scriptResult.Substring(1, scriptResult.Length - 2).Replace("`", "'")}{ext}";

            if (File.Exists(Path.Combine(Path.GetDirectoryName(pathToVid), renameTo))) // Has potential null error, im bad pls fix ty
            {
                return("*Error: A file with this filename already exists");
            }
            return(Utils.ReplaceInvalidFolderNameCharacters(renameTo));
        }
Beispiel #11
0
        public static bool CheckFileKeep(SVR_VideoLocal file)
        {
            bool result = true;
            List <FileQualityFilterType> requiredTypes = new List <FileQualityFilterType>();

            requiredTypes.Add(FileQualityFilterType.SOURCE);

            AniDB_File aniFile = file.GetAniDBFile();

            if (aniFile == null)
            {
                return(false);
            }
            foreach (var type in requiredTypes)
            {
                if (!result)
                {
                    break;
                }
                switch (type)
                {
                case FileQualityFilterType.AUDIOCODEC:
                    result &= CheckAudioCodec(aniFile);
                    break;

                case FileQualityFilterType.AUDIOSTREAMCOUNT:
                    result &= CheckAudioStreamCount(aniFile);
                    break;

                case FileQualityFilterType.CHAPTER:
                    result &= CheckChaptered(file);
                    break;

                case FileQualityFilterType.RESOLUTION:
                    result &= CheckResolution(aniFile);
                    break;

                case FileQualityFilterType.SOURCE:
                    result &= CheckSource(aniFile);
                    break;

                case FileQualityFilterType.SUBGROUP:
                    result &= CheckSubGroup(aniFile);
                    break;

                case FileQualityFilterType.SUBSTREAMCOUNT:
                    result &= CheckSubStreamCount(file);
                    break;

                case FileQualityFilterType.VERSION:
                    result &= CheckDeprecated(aniFile);
                    break;

                case FileQualityFilterType.VIDEOCODEC:
                    result &= CheckVideoCodec(aniFile);
                    break;
                }
            }

            return(result);
        }