public void AddAllMissing(string path, DatabaseBuilderType type) { var files = Directory.GetFileSystemEntries(path).ToList(); if (type == DatabaseBuilderType.Movies) { BasicLogger.Log("Adding all or any missing movies to the database.", Verbosity.Information); BasicLogger.Log("Year of each movie in parentheses is expected to appear on each movie's name. Directory will otherwise be ignored.", Verbosity.Information); BasicLogger.Log("Accurate Movie Name is expected for each directory. Movie will not be added otherwise.", Verbosity.Information); foreach (var file in files) { FileAttributes attr = File.GetAttributes(file); if (!attr.HasFlag(FileAttributes.Directory)) continue; string name = Path.GetFileName(file); if (name == null) continue; if (name.Contains("[1080p]")) name = name.Remove(name.IndexOf("[1080p]", StringComparison.Ordinal)).Trim(); if (name.Contains("(") && name.Contains(")")) { var year = name.Substring(name.LastIndexOf('(') + 1); name = name.Remove(name.LastIndexOf('(')).Trim(); year = year.Remove(year.IndexOf(')')).Trim(); name = name.Replace("310 to Yuma", "3:10 to Yuma"); //Hardcoded, can't figure out any other way. Unique case. var movie = _moviesRepository.Query(x => x.Title == name && x.Year == year).FirstOrDefault(); if (movie != null) { BasicLogger.Log("Conflicting entry: " + name + " (" + year + ")", Verbosity.Warning); continue; } var obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name, year: year); Movie obtainedMovieToCheck; try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) throw new Exception(); } catch (Exception) { obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name); //year might be causing trouble try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) throw new Exception(); BasicLogger.Log(name + " was searched for without the year (" + year + "). Please confirm entry.", Verbosity.Warning); } catch (Exception) { if (name.Contains(" and ") || name.Contains(" And ")) { name = name.Replace(" and ", "&"); name = name.Replace(" And ", "&"); } obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name, year: year); try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) throw new Exception(); } catch (Exception) { if (name.Contains(" and ") || name.Contains(" And ")) { name = name.Replace(" and ", "&"); name = name.Replace(" And ", "&"); } obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name); try { Task.WaitAll(obtainedMovieTask); BasicLogger.Log(name + " was searched for without the year (" + year + "). Please confirm entry.", Verbosity.Warning); } catch (Exception ex) { BasicLogger.Log(ex.Message + " " + name + " (" + year + ")", Verbosity.Error); continue; } } } } var obtainedMovie = obtainedMovieTask.Result; if (obtainedMovie == null) { BasicLogger.Log("Something went wrong with: " + name + " (" + year + ")", Verbosity.Error); continue; } movie = _moviesRepository.Query(x => x.ImdbId == obtainedMovie.ImdbId).FirstOrDefault(); if (movie != null) { BasicLogger.Log("Conflicting entries: " + name + " (" + year + "), " + movie.Title + " (" + movie.Year + ")", Verbosity.Warning); continue; } UpdateDatabaseWithWatchable(obtainedMovie, type, file); } else { BasicLogger.Log("Skipped: " + name, Verbosity.Warning); } } } }
public void AddAllMissing(string path, DatabaseBuilderType type) { var files = Directory.GetFileSystemEntries(path).ToList(); if (type == DatabaseBuilderType.Movies) { BasicLogger.Log("Adding all or any missing movies to the database.", Verbosity.Information); BasicLogger.Log("Year of each movie in parentheses is expected to appear on each movie's name. Directory will otherwise be ignored.", Verbosity.Information); BasicLogger.Log("Accurate Movie Name is expected for each directory. Movie will not be added otherwise.", Verbosity.Information); foreach (var file in files) { FileAttributes attr = File.GetAttributes(file); if (!attr.HasFlag(FileAttributes.Directory)) { continue; } string name = Path.GetFileName(file); if (name == null) { continue; } if (name.Contains("[1080p]")) { name = name.Remove(name.IndexOf("[1080p]", StringComparison.Ordinal)).Trim(); } if (name.Contains("(") && name.Contains(")")) { var year = name.Substring(name.LastIndexOf('(') + 1); name = name.Remove(name.LastIndexOf('(')).Trim(); year = year.Remove(year.IndexOf(')')).Trim(); name = name.Replace("310 to Yuma", "3:10 to Yuma"); //Hardcoded, can't figure out any other way. Unique case. var movie = _moviesRepository.Query(x => x.Title == name && x.Year == year).FirstOrDefault(); if (movie != null) { BasicLogger.Log("Conflicting entry: " + name + " (" + year + ")", Verbosity.Warning); continue; } var obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name, year: year); Movie obtainedMovieToCheck; try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) { throw new Exception(); } } catch (Exception) { obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name); //year might be causing trouble try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) { throw new Exception(); } BasicLogger.Log(name + " was searched for without the year (" + year + "). Please confirm entry.", Verbosity.Warning); } catch (Exception) { if (name.Contains(" and ") || name.Contains(" And ")) { name = name.Replace(" and ", "&"); name = name.Replace(" And ", "&"); } obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name, year: year); try { Task.WaitAll(obtainedMovieTask); obtainedMovieToCheck = obtainedMovieTask.Result; if (obtainedMovieToCheck == null) { throw new Exception(); } } catch (Exception) { if (name.Contains(" and ") || name.Contains(" And ")) { name = name.Replace(" and ", "&"); name = name.Replace(" And ", "&"); } obtainedMovieTask = _omdbApiHandler.GetRequestedMovie(name); try { Task.WaitAll(obtainedMovieTask); BasicLogger.Log(name + " was searched for without the year (" + year + "). Please confirm entry.", Verbosity.Warning); } catch (Exception ex) { BasicLogger.Log(ex.Message + " " + name + " (" + year + ")", Verbosity.Error); continue; } } } } var obtainedMovie = obtainedMovieTask.Result; if (obtainedMovie == null) { BasicLogger.Log("Something went wrong with: " + name + " (" + year + ")", Verbosity.Error); continue; } movie = _moviesRepository.Query(x => x.ImdbId == obtainedMovie.ImdbId).FirstOrDefault(); if (movie != null) { BasicLogger.Log("Conflicting entries: " + name + " (" + year + "), " + movie.Title + " (" + movie.Year + ")", Verbosity.Warning); continue; } UpdateDatabaseWithWatchable(obtainedMovie, type, file); } else { BasicLogger.Log("Skipped: " + name, Verbosity.Warning); } } } }
private void UpdateDatabaseWithWatchable(CompleteWatchable watchable, DatabaseBuilderType type, string path = "") { if (type == DatabaseBuilderType.Movies) { var files = Directory.GetFileSystemEntries(path).ToList(); var actors = new List<Actor>(watchable.Actors); var writers = new List<Writer>(watchable.Writers); var directors = new List<Director>(watchable.Directors); var genres = new List<Genre>(watchable.Genres); watchable.Actors.Clear(); watchable.Writers.Clear(); watchable.Directors.Clear(); watchable.Genres.Clear(); _moviesRepository.Create((Movie)watchable); foreach (var file in files) { if (file.EndsWith("srt")) { if (files.Count > 2) BasicLogger.Log(watchable.Title + "'s subtitles not added due to more than 2 files being present in the directory.", Verbosity.Error); else { var subs = new Subtitles { Language = SubtitleLanguage.English, Path = file, Watchable = watchable }; _subtitlesRepository.Create(subs); } } else if (file.EndsWith("mp4") || file.EndsWith("avi") || file.EndsWith("mkv") || file.EndsWith("wmv")) { watchable.Path = file; _moviesRepository.Update((Movie)watchable); } } foreach (var actor in actors) { var databaseActor = _actorsRepository.Query(x => x.Name == actor.Name).FirstOrDefault(); if (databaseActor == null) { actor.Watchables = new List<Watchable>{watchable}; _actorsRepository.Create(actor); } else { if(databaseActor.Watchables == null) databaseActor.Watchables = new List<Watchable>(); if (databaseActor.Watchables.Contains(watchable)) continue; databaseActor.Watchables.Add(watchable); _actorsRepository.Update(databaseActor); } } foreach (var writer in writers) { var databaseWriter = _writersRepository.Query(x => x.Name == writer.Name).FirstOrDefault(); if (databaseWriter == null) { writer.Watchables = new List<Watchable> { watchable }; _writersRepository.Create(writer); } else { if (databaseWriter.Watchables == null) databaseWriter.Watchables = new List<Watchable>(); if (databaseWriter.Watchables.Contains(watchable)) continue; databaseWriter.Watchables.Add(watchable); _writersRepository.Update(databaseWriter); } } foreach (var director in directors) { var databaseDirector = _directorsRepository.Query(x => x.Name == director.Name).FirstOrDefault(); if (databaseDirector == null) { director.Watchables = new List<Watchable> { watchable }; _directorsRepository.Create(director); } else { if (databaseDirector.Watchables == null) databaseDirector.Watchables = new List<Watchable>(); if (databaseDirector.Watchables.Contains(watchable)) continue; databaseDirector.Watchables.Add(watchable); _directorsRepository.Update(databaseDirector); } } foreach (var genre in genres) { var databaseGenre = _genresRepository.Query(x => x.Name == genre.Name).FirstOrDefault(); if (databaseGenre == null) { genre.Watchables = new List<Watchable> { watchable }; _genresRepository.Create(genre); } else { if (databaseGenre.Watchables == null) databaseGenre.Watchables = new List<Watchable>(); if (databaseGenre.Watchables.Contains(watchable)) continue; databaseGenre.Watchables.Add(watchable); _genresRepository.Update(databaseGenre); } } } }
private void UpdateDatabaseWithWatchable(CompleteWatchable watchable, DatabaseBuilderType type, string path = "") { if (type == DatabaseBuilderType.Movies) { var files = Directory.GetFileSystemEntries(path).ToList(); var actors = new List <Actor>(watchable.Actors); var writers = new List <Writer>(watchable.Writers); var directors = new List <Director>(watchable.Directors); var genres = new List <Genre>(watchable.Genres); watchable.Actors.Clear(); watchable.Writers.Clear(); watchable.Directors.Clear(); watchable.Genres.Clear(); _moviesRepository.Create((Movie)watchable); foreach (var file in files) { if (file.EndsWith("srt")) { if (files.Count > 2) { BasicLogger.Log(watchable.Title + "'s subtitles not added due to more than 2 files being present in the directory.", Verbosity.Error); } else { var subs = new Subtitles { Language = SubtitleLanguage.English, Path = file, Watchable = watchable }; _subtitlesRepository.Create(subs); } } else if (file.EndsWith("mp4") || file.EndsWith("avi") || file.EndsWith("mkv") || file.EndsWith("wmv")) { watchable.Path = file; _moviesRepository.Update((Movie)watchable); } } foreach (var actor in actors) { var databaseActor = _actorsRepository.Query(x => x.Name == actor.Name).FirstOrDefault(); if (databaseActor == null) { actor.Watchables = new List <Watchable> { watchable }; _actorsRepository.Create(actor); } else { if (databaseActor.Watchables == null) { databaseActor.Watchables = new List <Watchable>(); } if (databaseActor.Watchables.Contains(watchable)) { continue; } databaseActor.Watchables.Add(watchable); _actorsRepository.Update(databaseActor); } } foreach (var writer in writers) { var databaseWriter = _writersRepository.Query(x => x.Name == writer.Name).FirstOrDefault(); if (databaseWriter == null) { writer.Watchables = new List <Watchable> { watchable }; _writersRepository.Create(writer); } else { if (databaseWriter.Watchables == null) { databaseWriter.Watchables = new List <Watchable>(); } if (databaseWriter.Watchables.Contains(watchable)) { continue; } databaseWriter.Watchables.Add(watchable); _writersRepository.Update(databaseWriter); } } foreach (var director in directors) { var databaseDirector = _directorsRepository.Query(x => x.Name == director.Name).FirstOrDefault(); if (databaseDirector == null) { director.Watchables = new List <Watchable> { watchable }; _directorsRepository.Create(director); } else { if (databaseDirector.Watchables == null) { databaseDirector.Watchables = new List <Watchable>(); } if (databaseDirector.Watchables.Contains(watchable)) { continue; } databaseDirector.Watchables.Add(watchable); _directorsRepository.Update(databaseDirector); } } foreach (var genre in genres) { var databaseGenre = _genresRepository.Query(x => x.Name == genre.Name).FirstOrDefault(); if (databaseGenre == null) { genre.Watchables = new List <Watchable> { watchable }; _genresRepository.Create(genre); } else { if (databaseGenre.Watchables == null) { databaseGenre.Watchables = new List <Watchable>(); } if (databaseGenre.Watchables.Contains(watchable)) { continue; } databaseGenre.Watchables.Add(watchable); _genresRepository.Update(databaseGenre); } } } }