void Check() { var searcher = new EpisodeFileSearcher(); // Only checks the first library (downloads) for now var results = Core.Models.Settings.Default.Libraries.Take(1).AsParallel() .Select(p => { try { return searcher.Search(p); } catch(Exception e) { Logger.Error("Error searching for episode files: " + e.ToString()); return null; } }) .Where(r => r != null) .ToList(); var groups = results .SelectMany(r => r) .GroupBy(r => r.Match.Name, StringComparer.OrdinalIgnoreCase) .Select(g => new { SeriesName = g.Key, Results = g.ToList() }) .OrderBy(g => g.SeriesName); var para = groups .AsParallel() .WithDegreeOfParallelism(5); para.ForAll(info => { using(var db = new EpisodeTrackerDBContext()) { var seriesName = info.SeriesName; if(db.SeriesIgnore.Any(s => s.Name == seriesName)) { return; } var series = db.Series.SingleOrDefault(s => s.Name == seriesName || s.Aliases.Any(a => a.Name == seriesName)); if(series == null) return; var episodes = series.Episodes.ToList(); foreach(var r in info.Results) { var eps = episodes.WhereTVMatch(r.Match); eps.ToList().ForEach(ep => ep.FileName = r.FileName); } db.SaveChanges(); } }); }
async void PerformWatch(Episode episode) { if(episode == null) { MessageBox.Show("Nothing to watch"); } if(episode.FileName == null || !File.Exists(episode.FileName)) { // Try and find var status = new StatusModal { Text = "Searching for episode file...", SubText = "Parsing files: 0", ShowSubText = true }; status.SetValue(Grid.RowProperty, 1); grid.Children.Add(status); var searcher = new EpisodeFileSearcher(); var totalFound = 0; searcher.FilesFound += (o, ea) => { this.Dispatcher.BeginInvoke(new Action(() => { Interlocked.Add(ref totalFound, ea.Results); status.SubText = "Parsing files: " + totalFound; })); }; var results = await Task.Factory.StartNew(() => { return Core.Models.Settings.Default.Libraries.AsParallel() .Select(path => { try { return searcher.Search(path); } catch(Exception e) { Logger.Error("Problem searching for episode file: " + episode + "-->" + e); return new List<EpisodeFileSearchResult>(); } }); }); var groups = results .SelectMany(r => r) .GroupBy(r => r.Match.Name, StringComparer.OrdinalIgnoreCase) .Select(g => new { SeriesName = g.Key, Results = g.ToList() }) .OrderBy(g => g.SeriesName); var total = groups.Count(); HashSet<string> aliases; Series series; using(var db = new EpisodeTrackerDBContext()) { series = db.Series.Single(s => s.ID == episode.SeriesID); aliases = new HashSet<string>(series.Aliases.Select(a => a.Name), StringComparer.OrdinalIgnoreCase); if(!aliases.Contains(series.Name)) aliases.Add(series.Name); } status.Text = "Checking results..."; status.SubText = String.Format("{0} / {1} series", 0, total); status.ShowProgress = true; var completed = 0; EpisodeFileSearchResult result = null; await Task.Factory.StartNew(() => { var para = groups .AsParallel() .WithDegreeOfParallelism(5); para.ForAll(info => { try { using(var db = new EpisodeTrackerDBContext()) { var seriesName = info.SeriesName; if(db.SeriesIgnore.Any(s => s.Name == seriesName)) { return; } if(!aliases.Contains(seriesName)) return; var ep = episode; var r = info.Results.FirstOrDefault(f => Episode.EqualsMatchExpression(f.Match).Compile()(ep)); if(r != null) result = r; } } finally { Interlocked.Increment(ref completed); this.Dispatcher.BeginInvoke(new Action(() => { status.SubText = String.Format("{0} / {1} series", completed, total); status.UpdateProgress(completed, total); })); } }); }); grid.Children.Remove(status); if(result != null) { using(var db = new EpisodeTrackerDBContext()) { var episodeDB = db.Episodes.Single(ep => ep.ID == episode.ID); episodeDB.FileName = result.FileName; episode.FileName = result.FileName; db.SaveChanges(); } } else { MessageBox.Show("Could not find file"); return; } } try { Process.Start(episode.FileName); } catch(Exception ex) { MessageBox.Show("Problem opening file: " + ex.Message); Logger.Error("Error opening filename: " + episode.FileName + " - " + ex); } }
public void FindsFiles() { var path = @"D:\Downloads\Media"; var searcher = new EpisodeFileSearcher(); var results = searcher.Search(path); }