//This function is leaved as async as it can be a copy function in future => This will take some time
        public async Task GenerateMovieFile(MovieMagnet magnet)
        {
            _logger?.LogInformation("GenerateMovieFile Start - {movieNumber}", magnet.MovieNumber);
            FileInfo movieFile = FindMovieFile(magnet.SavePath, magnet.MovieNumber);

            if (movieFile != null)
            {
                string movieNameWithoutExt = magnet.MovieNumber.ToUpper() + (magnet.HasSub ? "-C" : "");
                string destMovieName       = movieNameWithoutExt + Path.GetExtension(movieFile.FullName);

                string destMovieFolder = Path.Combine(_localFileSetting.DestSaveRootPath, movieNameWithoutExt);
                string destMoviePath   = Path.Combine(destMovieFolder, destMovieName);

                if (!Directory.Exists(destMovieFolder))
                {
                    _logger.LogInformation("Create destination movie folder: {destMovieFolder}", destMovieFolder);
                    Directory.CreateDirectory(destMovieFolder);
                }

                _logger.LogInformation("Moving movie {movieNumber} to {destMoviePath}", magnet.MovieNumber, destMoviePath);
                await Task.Run(() => movieFile.MoveTo(destMoviePath, true));

                _logger.LogInformation("Movie {movieNumber} has been moved to dest location. Now Archiving the temp download folder", magnet.MovieNumber);
                MoveDirectory(magnet.SavePath, _localFileSetting.ArchivedDownloadPath);

                magnet.SavePath = destMovieFolder;
                magnet.IdStatus = MagnetStatus.Finished;
                magnet.DtFinish = DateTime.Now;
            }
            else
            {
                _logger.LogWarning("Cannot find movie {movieNumber} in path: {savePath}", magnet.MovieNumber, magnet.SavePath);
            }
        }
示例#2
0
        public void TestSaveListMagnetFailed()
        {
            List <MovieMagnet> movieMagnets = new List <MovieMagnet>();
            MovieMagnet        magnet       = new MovieMagnet()
            {
                IdMovieMag  = 9,
                IdMovie     = 73,
                MovieNumber = "FSDSS-298",
                MagName     = "magnadsdsdesf",
                MagnetUrl   = "dsfdsfdsf",
                Hash        = "dvsffvdsv",
                Size        = 1234,
                IdMagSource = MagnetSource.Sukebei,
                DtMagnet    = new DateTime(2021, 1, 1)
            };
            MovieMagnet magnet2 = new MovieMagnet()
            {
                IdMovieMag  = 25,
                IdMovie     = 82,
                MovieNumber = "GVH-301",
                MagName     = "sdfezfdsf",
                MagnetUrl   = "dsfdsfdsfezfzef",
                Hash        = "dvsffvdsv",
                Size        = 3154,
                IdMagSource = MagnetSource.Javbus,
                DtMagnet    = new DateTime(2021, 1, 2)
            };

            movieMagnets.Add(magnet);
            movieMagnets.Add(magnet2);

            _movieMagService.SaveMovieMagnetList(movieMagnets);
        }
示例#3
0
        public async Task TreatDownloadedMovie(MovieMagnet magnet)
        {
            try
            {
                await _localFileService.GenerateMovieFile(magnet);

                List <MovieMagnet> movieMagnets = new List <MovieMagnet>();

                if (magnet.HasSub)
                {
                    _logger.LogInformation("Movie {movieNumber} has downloaded sub version. Checking non-sub folder and delete it.", magnet.MovieNumber);
                    movieMagnets = _movieMagnetService.FindMovieMagnetByStatus(MagnetStatus.Finished, magnet.IdMovie);
                    foreach (MovieMagnet movieMagnet in movieMagnets)
                    {
                        await _localFileService.DeleteFolder(movieMagnet.SavePath);

                        movieMagnet.IdStatus = MagnetStatus.Archived;
                    }
                }
                movieMagnets.Add(magnet);
                _movieMagnetService.SaveMovieMagnetList(movieMagnets);

                await _qbittorrentService.DeleteTorrentAsync(magnet.Hash, false);

                Movie movie = _movieService.FindMovieById(magnet.IdMovie);
                _movieService.UpdateStatus(movie, magnet.HasSub ? MovieStatus.Finished : MovieStatus.Downloaded);
                _movieService.SaveMovie(movie);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error occurred when generating the downloaded movie file - {movieNumber}", magnet.MovieNumber);
                magnet.IdStatus = MagnetStatus.InError;
                _movieMagnetService.SaveMovieMagnet(magnet);
            }
        }
示例#4
0
        public bool TorrentIsNotActive(MovieMagnet magnet, TorrentInfo torrent)
        {
            if ((DateTime.Now - magnet.DtStart.Value).Days >= 5)
            {
                return(true);
            }

            return((DateTime.Now - magnet.DtStart.Value).Days > 2 && torrent.Progress < 0.5 && torrent.EstimatedTime.Value.Days >= 100);
        }
示例#5
0
        public void TestInsertMagnet()
        {
            var magnet = new MovieMagnet()
            {
                MovieNumber = "CAWD-321", IdMovie = 1492, MagName = "magname", MagnetUrl = "123456&dl", Hash = "123456", IdMagSource = MagnetSource.Sukebei
            };
            var magnetInserted = _movieMagService.SaveMovieMagnet(magnet);

            Assert.True(magnetInserted.IdMagSource > 0);
        }
示例#6
0
        public async Task TestGenerateMovieFile()
        {
            MovieMagnet magnet = new MovieMagnet()
            {
                SavePath = @"E:\Media\Sister\Data\Finished\snis-842-C", HasSub = true, MovieNumber = "snis-842"
            };
            await _localFileService.GenerateMovieFile(magnet);

            Assert.Equal(MagnetStatus.Finished, magnet.IdStatus);
            _output.WriteLine(magnet.ToString());
        }
示例#7
0
        public List <MovieMagnet> SearchMagnetFromSukebei(Movie movie)
        {
            string             javbusUrl       = string.Format(_movieMagnetService.LoadMagSourceUrl(MagnetSource.Sukebei), movie.Number);
            HtmlDocument       htmlDocument    = _htmlService.GetHtmlDocumentAsync(javbusUrl, maxRetry: 1).Result;
            List <MovieMagnet> lstMovieMagnets = new List <MovieMagnet>();

            if (htmlDocument != null)
            {
                string             xpath = "//tr";
                HtmlNodeCollection nodes = htmlDocument.DocumentNode.SelectNodes(xpath);

                if (nodes != null && nodes.Count > 1)
                {
                    foreach (var node in nodes.Skip(1))
                    {
                        MovieMagnet movieMagnet = new MovieMagnet()
                        {
                            IdMovie = movie.IdMovie, MovieNumber = movie.Number, IdMagSource = MagnetSource.Sukebei
                        };

                        movieMagnet.MagName = node.ChildNodes[3].InnerText.Trim();

                        var magHref = node.ChildNodes[5].OuterHtml;
                        var size    = node.ChildNodes[7].InnerText.Trim();
                        movieMagnet.Size = size.GetByteSize();

                        DateTime dtMag = DateTime.MinValue;
                        if (!string.IsNullOrEmpty(node.ChildNodes[9].InnerText) && DateTime.TryParse(node.ChildNodes[9].InnerText.Trim(), out dtMag))
                        {
                            movieMagnet.DtMagnet = dtMag;
                        }

                        var url = magHref.Substring(magHref.IndexOf("<a href=\"magnet:?xt") + 9);
                        movieMagnet.MagnetUrl = url.Substring(0, url.IndexOf("\""));
                        movieMagnet.GenerateHash();

                        if (movieMagnet.MagName.Contains("高清") || movieMagnet.MagName.ToLower().Contains("hd") || movieMagnet.Size > 2048)
                        {
                            movieMagnet.IsHD = true;
                        }

                        if ((movieMagnet.MagName.Contains("字幕") || movieMagnet.MagName.Contains("中文")) && movieMagnet.IsHD)
                        {
                            movieMagnet.HasSub = true;
                        }

                        lstMovieMagnets.Add(movieMagnet);
                    }
                }
            }

            return(lstMovieMagnets);
        }
示例#8
0
        public void TestAddMovieMagnetHistory()
        {
            var dbContext        = new DapperContext(new ConfigBuilder().Build());
            var movieHistoryRepo = new MovieHistoryRepo(dbContext);
            var movieMagRepo     = new MovieMagnetRepo(dbContext, movieHistoryRepo);

            MovieMagnet magnet = new MovieMagnet()
            {
                IdMovieMag = 9, IdMovie = 73, MovieNumber = "FSDSS-298", MagName = "magnamesf", Size = 5400, DtMagnet = new DateTime(2020, 1, 1)
            };

            List <MovieHistory> movieHistories = movieMagRepo.AddHistory(magnet);

            movieHistories.ForEach(h => _output.WriteLine(h.DescHistory));
        }
示例#9
0
        public async Task AddTorrentAsync(MovieMagnet magnet)
        {
            _logger?.LogInformation("Add Torrent for movie {movieNumber}: {hash}", magnet.MovieNumber, magnet.Hash);
            await EnsureLoggedInAsync();

            AddTorrentUrlsRequest request = new AddTorrentUrlsRequest(new Uri(magnet.MagnetUrl));
            await _client.AddTorrentsAsync(request);

            string savePath = Path.Combine(_qbittorrentSetting.DownloadRootPath, magnet.MovieNumber.ToUpper() + "_" + magnet.IdMovieMag);
            await _client.SetLocationAsync(magnet.Hash, savePath);

            await _client.SetTorrentCategoryAsync(magnet.Hash, _qbittorrentSetting.Category);

            magnet.IdStatus = MagnetStatus.Downloading;
            magnet.SavePath = savePath;
            magnet.DtStart  = DateTime.Now;
            _logger?.LogInformation("Add Torrent for movie {movieNumber} ended", magnet.MovieNumber);
        }
示例#10
0
        public void TestAddTorrent()
        {
            List <Task> taskList = new List <Task>();
            MovieMagnet magnet   = new MovieMagnet()
            {
                IdMovieMag = 247,
                IdMovie    = 157, MagName = "mide-978-C", MovieNumber = "MIDE-978", Size = 5376, IsHD = true, HasSub = true, IdMagSource = MagnetSource.Javbus, IdStatus = MagnetStatus.IsReady,
                MagnetUrl  = "magnet:?xt=urn:btih:D731203D3B903F675F96CD1D4FDC547A6428EB80&dn=mide-978-C", Hash = "D731203D3B903F675F96CD1D4FDC547A6428EB80"
            };

            var _movieMagnetService = new MovieMagServiceBuilder().Build();

            _output.WriteLine("task created");
            taskList.Add(_qbittorrentService.AddTorrentAsync(magnet).ContinueWith(t => _movieMagnetService.SaveMovieMagnet(magnet)));

            _output.WriteLine("waiting task to over: {0}", taskList.Count());
            Task.WaitAll(taskList.ToArray());
        }
示例#11
0
        public MovieMagnet Save(MovieMagnet movieMagnet)
        {
            movieMagnet.DtUpdate = DateTime.Now;

            using (var trans = new TransactionScope())
            {
                List <MovieHistory> movieHistories = AddHistory(movieMagnet);
                if (movieMagnet.IdMovieMag == 0)
                {
                    movieMagnet.IdMovieMag = (int)db.InsertEntity(movieMagnet);
                }
                else if (!db.UpdateEntity(movieMagnet))
                {
                    throw new Exception($"MovieMagnet not found in DB: {movieMagnet.ToString()}");
                }

                _movieHistoryRepo.SaveList(movieMagnet.IdMovie, movieHistories);

                trans.Complete();
            }
            return(movieMagnet);
        }
示例#12
0
 public MovieMagnet SaveMovieMagnet(MovieMagnet movieMagnet)
 {
     return(_movieMagnetRepo.Save(movieMagnet));
 }
示例#13
0
        //TODO: Consider to group the history into one record
        public List <MovieHistory> AddHistory(MovieMagnet magnet)
        {
            List <MovieHistory> movieHistories = new List <MovieHistory>();

            if (magnet.IdMovieMag == 0)
            {
                movieHistories.Add(new MovieHistory()
                {
                    DescHistory = string.Format("Create new movie magnet {0}", magnet.Hash)
                });
            }
            else
            {
                MovieMagnet origin = FindById(magnet.IdMovieMag);
                string      result = string.Empty;

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "MagName"), origin.MagName, magnet.MagName, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "MagnetUrl"), origin.MagnetUrl, magnet.MagnetUrl, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "Hash"), origin.Hash, magnet.Hash, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldDemical(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "Size"), origin.Size, magnet.Size, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldDate(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "Magnet Date"), origin.DtMagnet, magnet.DtMagnet, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldBoolean(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "IsHD"), origin.IsHD, magnet.IsHD, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldBoolean(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "HasSub"), origin.HasSub, magnet.HasSub, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "Magnet Source"), origin.IdMagSource.ToString(), magnet.IdMagSource.ToString(), ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldDate(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "DtStart"), origin.DtStart, magnet.DtStart, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldDate(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "DtFinish"), origin.DtFinish, magnet.DtFinish, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "SavePath"), origin.SavePath, magnet.SavePath, ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }

                if (HistoryDiffHelpers.GetDifferencesFieldString(string.Format("MagnetId {0} - {1}", magnet.IdMovieMag, "Magnet Status"), origin.IdStatus.ToString(), magnet.IdStatus.ToString(), ref result))
                {
                    movieHistories.Add(new MovieHistory()
                    {
                        DescHistory = result
                    });
                }
            }
            return(movieHistories);
        }
示例#14
0
        public void MonitorMovieDownload()
        {
            try
            {
                _logger.LogInformation("************** Start Monitoring Movie Download Job - {Date} **************", DateTime.Now.ToString("u", DateTimeFormatInfo.InvariantInfo));
                //Check every magnet in status downloading. If not found in qbittorrent or status = downloaded, do fileService
                int         nbMovieAdded             = 0;
                List <Task> lstGenerateMovieFileTask = new List <Task>();
                List <Task> lstDeleteTorrentTask     = new List <Task>();
                List <Task> lstAddTorrentTask        = new List <Task>();

                foreach (MovieMagnet magnet in _movieMagnetService.FindMovieMagnetByStatus(MagnetStatus.Downloading))
                {
                    TorrentInfo torrentInfo = _qbittorrentService.GetTorrentInfo(magnet.Hash);
                    if (torrentInfo == null || torrentInfo.State == TorrentState.Uploading || torrentInfo.Progress >= 1)
                    {
                        if (_localFileService.CheckMovieDownloaded(magnet.SavePath, magnet.MovieNumber.ToUpper()))
                        {
                            _logger?.LogInformation("MovieMagnet {magnetId} for movie {movieNumber} has finished downloading", magnet.IdMovieMag, magnet.MovieNumber);
                            lstGenerateMovieFileTask.Add(TreatDownloadedMovie(magnet));
                        }
                        else
                        {
                            _logger?.LogError("Cannot find movie {movieNumber} in path {moviePath}. Please check manually", magnet.MovieNumber, magnet.SavePath);
                            magnet.IdStatus = MagnetStatus.InError;
                            _movieMagnetService.SaveMovieMagnet(magnet);
                        }
                    }
                    else if (TorrentIsNotActive(magnet, torrentInfo))
                    {
                        _logger?.LogWarning("MovieMagnet {magnetId} for movie {movieNumber} is no longer active, Mark it as dead", magnet.IdMovieMag, magnet.MovieNumber);
                        lstDeleteTorrentTask.Add(_qbittorrentService.DeleteTorrentAsync(magnet.Hash, true));
                        magnet.IdStatus = MagnetStatus.Dead;
                        _movieMagnetService.SaveMovieMagnet(magnet);
                    }
                }

                Task.WaitAll(lstDeleteTorrentTask.ToArray());
                Task.WaitAll(lstGenerateMovieFileTask.ToArray());

                //Send torrent to qbittorrent for the top nbFinished
                List <Movie> lstMoviesToDownload = _movieService.LoadMoviesToDownload();
                if (lstMoviesToDownload.Count > 0)
                {
                    int nbMovieAddMax = _qbittorrentService.GetTorrentCanAddCount();
                    foreach (Movie movie in lstMoviesToDownload)
                    {
                        if (nbMovieAdded >= nbMovieAddMax)
                        {
                            break;
                        }

                        MovieMagnet magnet = _movieMagnetService.FindBestMatchMagnetByMovie(movie);
                        if (magnet != null)
                        {
                            //TODO: Here we can add antoher async function to get the torrentContent and set other files priority to notDownload
                            lstAddTorrentTask.Add(_qbittorrentService.AddTorrentAsync(magnet)
                                                  .ContinueWith(t => _movieMagnetService.SaveMovieMagnet(magnet)));
                            nbMovieAdded++;
                        }
                    }

                    Task.WaitAll(lstAddTorrentTask.ToArray());
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Some errors occurred in MonitorMovieDownload");
            }
            finally
            {
                _logger.LogInformation("************** Monitoring Movie Download Job End - {Date} **************", DateTime.Now.ToString("u", DateTimeFormatInfo.InvariantInfo));
            }
        }
示例#15
0
        public List <MovieMagnet> SearchMagnetFromJavbus(Movie movie)
        {
            string             javbusUrl       = string.Format(_movieMagnetService.LoadMagSourceUrl(MagnetSource.Javbus), movie.Number);
            HtmlDocument       htmlDocument    = _htmlService.GetHtmlDocumentAsync(javbusUrl, maxRetry: 1).Result;
            List <MovieMagnet> lstMovieMagnets = new List <MovieMagnet>();

            if (htmlDocument != null)
            {
                string outerHtml  = htmlDocument.DocumentNode.InnerHtml;
                var    gidPattern = "var gid = (.*?);";
                var    ucPattern  = "var uc = (.*?);";
                var    picPattern = "var img = '(.*?)';";

                var gidMatch = Regex.Match(outerHtml, gidPattern);
                var ucMatch  = Regex.Match(outerHtml, ucPattern);
                var picMatch = Regex.Match(outerHtml, picPattern);

                var gid = gidMatch.Groups[1].Value;
                var uc  = ucMatch.Groups[1].Value;
                var pic = picMatch.Groups[1].Value;

                HtmlDocument magDocument = null;
                var          magUrl      = $"https://www.javbus.com/ajax/uncledatoolsbyajax.php?gid={gid}&lang=zh&img={pic}&uc={uc}&floor=552";
                magDocument = _htmlService.GetHtmlDocumentAsync(magUrl, new Dictionary <string, string>()
                {
                    { "referer", javbusUrl }
                }).Result;

                if (magDocument != null)
                {
                    var magPattern           = "//tr[@style=' border-top:#DDDDDD solid 1px']";
                    HtmlNodeCollection nodes = magDocument.DocumentNode.SelectNodes(magPattern);
                    if (nodes != null)
                    {
                        DateTime?lastDtReleaseInNode = null;
                        foreach (var node in nodes)
                        {
                            MovieMagnet movieMagnet = new MovieMagnet()
                            {
                                IdMovie = movie.IdMovie, MovieNumber = movie.Number, IdMagSource = MagnetSource.Javbus
                            };
                            if (node.ChildNodes.Count >= 2)
                            {
                                if (node.ChildNodes[1].InnerText.Contains("高清"))
                                {
                                    movieMagnet.IsHD = true;
                                }

                                if (node.ChildNodes[1].InnerText.Contains("字幕") && movieMagnet.IsHD)
                                {
                                    movieMagnet.HasSub = true;
                                }

                                movieMagnet.MagName   = node.ChildNodes[1].ChildNodes[1].InnerText.Trim();
                                movieMagnet.MagnetUrl = node.ChildNodes[1].ChildNodes[1].Attributes["href"].Value;
                                movieMagnet.GenerateHash();
                            }

                            if (node.ChildNodes.Count >= 4)
                            {
                                string sizePart = node.ChildNodes[3].InnerText.Trim();
                                movieMagnet.Size = sizePart.GetByteSize();
                            }

                            if (node.ChildNodes.Count >= 5 && !string.Equals(node.ChildNodes[5].InnerText.Trim(), "0000-00-00"))
                            {
                                movieMagnet.DtMagnet = DateTime.Parse(node.ChildNodes[5].InnerText.Trim());
                                if (!lastDtReleaseInNode.HasValue || movieMagnet.DtMagnet < lastDtReleaseInNode)
                                {
                                    lastDtReleaseInNode = movieMagnet.DtMagnet;
                                }
                            }
                            else
                            {
                                movieMagnet.HasSub = false;
                            }

                            lstMovieMagnets.Add(movieMagnet);
                        }

                        //JavBus Bug: The movie is not a SubVersion but has a Sub tag
                        foreach (MovieMagnet mag in lstMovieMagnets)
                        {
                            if (mag.DtMagnet.HasValue && (mag.DtMagnet.Value - lastDtReleaseInNode.Value).Days < 3)
                            {
                                mag.HasSub = false;
                            }
                        }
                    }
                }
            }
            return(lstMovieMagnets);
        }