2011-04-01 08:36:34 +02:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2011-05-28 09:16:16 +02:00
|
|
|
|
using System.Linq;
|
2011-09-04 05:05:44 +02:00
|
|
|
|
using System.Web.Mvc;
|
2012-08-30 02:57:23 +02:00
|
|
|
|
using NLog;
|
2011-11-13 05:07:06 +01:00
|
|
|
|
using NzbDrone.Common;
|
2011-12-02 02:33:17 +01:00
|
|
|
|
using NzbDrone.Core.Jobs;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
using NzbDrone.Core.Providers;
|
2011-04-04 05:50:12 +02:00
|
|
|
|
using NzbDrone.Core.Providers.Core;
|
2011-05-31 08:13:46 +02:00
|
|
|
|
using NzbDrone.Core.Repository;
|
2012-01-19 04:58:32 +01:00
|
|
|
|
using NzbDrone.Web.Filters;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
using NzbDrone.Web.Models;
|
2012-09-15 05:24:34 +02:00
|
|
|
|
using TvdbLib.Exceptions;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
|
|
|
|
namespace NzbDrone.Web.Controllers
|
|
|
|
|
{
|
|
|
|
|
public class AddSeriesController : Controller
|
|
|
|
|
{
|
2011-04-10 03:34:36 +02:00
|
|
|
|
private readonly ConfigProvider _configProvider;
|
2011-04-08 06:11:45 +02:00
|
|
|
|
private readonly QualityProvider _qualityProvider;
|
2011-04-10 04:44:01 +02:00
|
|
|
|
private readonly RootDirProvider _rootFolderProvider;
|
2011-04-09 01:55:23 +02:00
|
|
|
|
private readonly SeriesProvider _seriesProvider;
|
2011-04-20 09:44:13 +02:00
|
|
|
|
private readonly JobProvider _jobProvider;
|
2011-04-10 04:44:01 +02:00
|
|
|
|
private readonly TvDbProvider _tvDbProvider;
|
2011-05-28 09:16:16 +02:00
|
|
|
|
private readonly DiskProvider _diskProvider;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2012-08-30 02:57:23 +02:00
|
|
|
|
private static readonly Logger logger = LogManager.GetCurrentClassLogger();
|
|
|
|
|
|
2011-06-14 03:23:04 +02:00
|
|
|
|
public AddSeriesController(RootDirProvider rootFolderProvider,
|
2011-04-10 04:44:01 +02:00
|
|
|
|
ConfigProvider configProvider,
|
|
|
|
|
QualityProvider qualityProvider, TvDbProvider tvDbProvider,
|
2011-05-28 09:16:16 +02:00
|
|
|
|
SeriesProvider seriesProvider, JobProvider jobProvider,
|
|
|
|
|
DiskProvider diskProvider)
|
2011-04-01 08:36:34 +02:00
|
|
|
|
{
|
2011-06-14 03:23:04 +02:00
|
|
|
|
|
2011-04-01 08:36:34 +02:00
|
|
|
|
_rootFolderProvider = rootFolderProvider;
|
|
|
|
|
_configProvider = configProvider;
|
|
|
|
|
_qualityProvider = qualityProvider;
|
|
|
|
|
_tvDbProvider = tvDbProvider;
|
|
|
|
|
_seriesProvider = seriesProvider;
|
2011-04-20 09:44:13 +02:00
|
|
|
|
_jobProvider = jobProvider;
|
2011-05-28 09:16:16 +02:00
|
|
|
|
_diskProvider = diskProvider;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
2012-01-19 06:01:47 +01:00
|
|
|
|
public EmptyResult ScanNewSeries()
|
2011-04-01 08:36:34 +02:00
|
|
|
|
{
|
2011-05-21 02:23:49 +02:00
|
|
|
|
_jobProvider.QueueJob(typeof(ImportNewSeriesJob));
|
2012-01-19 06:01:47 +01:00
|
|
|
|
return new EmptyResult();
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ActionResult AddNew()
|
|
|
|
|
{
|
2011-07-08 05:27:11 +02:00
|
|
|
|
ViewData["RootDirs"] = _rootFolderProvider.GetAll().Select(c => c.Path).OrderBy(e => e).ToList();
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2011-05-28 09:16:16 +02:00
|
|
|
|
var defaultQuality = _configProvider.DefaultQualityProfile;
|
2011-07-08 07:41:08 +02:00
|
|
|
|
var qualityProfiles = _qualityProvider.All();
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2011-10-19 17:16:34 +02:00
|
|
|
|
ViewData["qualityProfiles"] = new SelectList(
|
2011-05-28 09:16:16 +02:00
|
|
|
|
qualityProfiles,
|
|
|
|
|
"QualityProfileId",
|
|
|
|
|
"Name",
|
|
|
|
|
defaultQuality);
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2011-05-28 09:16:16 +02:00
|
|
|
|
return View();
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-31 22:50:19 +02:00
|
|
|
|
public ActionResult Index()
|
2011-04-01 08:36:34 +02:00
|
|
|
|
{
|
2011-07-28 00:59:48 +02:00
|
|
|
|
return View();
|
2011-05-31 22:50:19 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
public ActionResult ExistingSeries()
|
2011-05-31 22:50:19 +02:00
|
|
|
|
{
|
2011-07-28 00:59:48 +02:00
|
|
|
|
var result = new ExistingSeriesModel();
|
2011-05-31 22:50:19 +02:00
|
|
|
|
|
|
|
|
|
var unmappedList = new List<String>();
|
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
foreach (var folder in _rootFolderProvider.GetAll())
|
2011-04-01 08:36:34 +02:00
|
|
|
|
{
|
2011-05-20 05:47:07 +02:00
|
|
|
|
unmappedList.AddRange(_rootFolderProvider.GetUnmappedFolders(folder.Path));
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-09-09 05:52:25 +02:00
|
|
|
|
result.ExistingSeries = new List<Tuple<string, string, int>>();
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
foreach (var folder in unmappedList)
|
|
|
|
|
{
|
|
|
|
|
var foldername = new DirectoryInfo(folder).Name;
|
2011-04-01 08:36:34 +02:00
|
|
|
|
|
2012-08-30 02:57:23 +02:00
|
|
|
|
try
|
2011-07-28 00:59:48 +02:00
|
|
|
|
{
|
2012-08-30 02:57:23 +02:00
|
|
|
|
var tvdbResult = _tvDbProvider.SearchSeries(foldername).FirstOrDefault();
|
|
|
|
|
|
|
|
|
|
var title = String.Empty;
|
|
|
|
|
var seriesId = 0;
|
|
|
|
|
if (tvdbResult != null)
|
|
|
|
|
{
|
|
|
|
|
title = tvdbResult.SeriesName;
|
|
|
|
|
seriesId = tvdbResult.Id;
|
|
|
|
|
}
|
2011-04-04 03:31:27 +02:00
|
|
|
|
|
2012-08-30 02:57:23 +02:00
|
|
|
|
result.ExistingSeries.Add(new Tuple<string, string, int>(folder, title, seriesId));
|
|
|
|
|
}
|
|
|
|
|
catch(Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logger.WarnException("Failed to connect to TheTVDB to search for: " + foldername, ex);
|
|
|
|
|
return View();
|
|
|
|
|
}
|
2011-07-28 00:59:48 +02:00
|
|
|
|
}
|
2011-04-05 04:48:46 +02:00
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
var defaultQuality = Convert.ToInt32(_configProvider.DefaultQualityProfile);
|
|
|
|
|
result.Quality = new SelectList(_qualityProvider.All(), "QualityProfileId", "Name", defaultQuality);
|
2011-04-04 03:31:27 +02:00
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
return View(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[HttpPost]
|
2011-09-09 05:52:25 +02:00
|
|
|
|
public JsonResult AddNewSeries(string path, string seriesName, int seriesId, int qualityProfileId)
|
2011-07-28 00:59:48 +02:00
|
|
|
|
{
|
2012-02-27 04:25:57 +01:00
|
|
|
|
if (string.IsNullOrWhiteSpace(path) || String.Equals(path,"null",StringComparison.InvariantCultureIgnoreCase))
|
|
|
|
|
return JsonNotificationResult.Error("Couldn't add " + seriesName, "You need a valid root folder");
|
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
path = Path.Combine(path, MediaFileProvider.CleanFilename(seriesName));
|
2011-09-10 01:28:21 +02:00
|
|
|
|
|
|
|
|
|
//Create the folder for the new series
|
|
|
|
|
//Use the created folder name when adding the series
|
|
|
|
|
path = _diskProvider.CreateDirectory(path);
|
|
|
|
|
|
2011-09-09 05:52:25 +02:00
|
|
|
|
return AddExistingSeries(path, seriesName, seriesId, qualityProfileId);
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-05-28 09:16:16 +02:00
|
|
|
|
[HttpPost]
|
2012-01-19 06:01:47 +01:00
|
|
|
|
[JsonErrorFilter]
|
2011-09-09 05:52:25 +02:00
|
|
|
|
public JsonResult AddExistingSeries(string path, string seriesName, int seriesId, int qualityProfileId)
|
2011-05-28 09:16:16 +02:00
|
|
|
|
{
|
2012-01-13 17:54:20 +01:00
|
|
|
|
if (seriesId == 0 || String.IsNullOrWhiteSpace(seriesName))
|
2012-01-19 06:01:47 +01:00
|
|
|
|
return JsonNotificationResult.Error("Add Existing series failed.", "Invalid Series information");
|
2012-01-13 17:54:20 +01:00
|
|
|
|
|
2012-02-29 09:25:41 +01:00
|
|
|
|
_seriesProvider.AddSeries(seriesName,path, seriesId, qualityProfileId);
|
2012-01-19 06:01:47 +01:00
|
|
|
|
ScanNewSeries();
|
2011-05-31 08:13:46 +02:00
|
|
|
|
|
2012-01-19 06:01:47 +01:00
|
|
|
|
return JsonNotificationResult.Info(seriesName, "Was added successfully");
|
2011-05-28 09:16:16 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-10-19 17:16:34 +02:00
|
|
|
|
[HttpPost]
|
|
|
|
|
public JsonResult QuickAddNewSeries(string seriesName, int seriesId, int qualityProfileId)
|
|
|
|
|
{
|
|
|
|
|
var path = _rootFolderProvider.GetMostFreeRootDir();
|
|
|
|
|
path = Path.Combine(path, MediaFileProvider.CleanFilename(seriesName));
|
|
|
|
|
|
|
|
|
|
//Create the folder for the new series
|
|
|
|
|
//Use the created folder name when adding the series
|
|
|
|
|
path = _diskProvider.CreateDirectory(path);
|
|
|
|
|
|
|
|
|
|
return AddExistingSeries(path, seriesName, seriesId, qualityProfileId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[ChildActionOnly]
|
|
|
|
|
public ActionResult QuickAdd()
|
|
|
|
|
{
|
|
|
|
|
var defaultQuality = _configProvider.DefaultQualityProfile;
|
|
|
|
|
var qualityProfiles = _qualityProvider.All();
|
|
|
|
|
|
|
|
|
|
ViewData["qualityProfiles"] = new SelectList(
|
|
|
|
|
qualityProfiles,
|
|
|
|
|
"QualityProfileId",
|
|
|
|
|
"Name",
|
|
|
|
|
defaultQuality);
|
|
|
|
|
|
|
|
|
|
return PartialView();
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-31 08:13:46 +02:00
|
|
|
|
|
|
|
|
|
[HttpPost]
|
2012-01-19 06:01:47 +01:00
|
|
|
|
[JsonErrorFilter]
|
2011-06-30 08:15:06 +02:00
|
|
|
|
public JsonResult SaveRootDir(string path)
|
2011-05-31 08:13:46 +02:00
|
|
|
|
{
|
2011-06-16 04:32:55 +02:00
|
|
|
|
if (String.IsNullOrWhiteSpace(path))
|
2012-01-19 06:01:47 +01:00
|
|
|
|
JsonNotificationResult.Error("Can't add root folder", "Path can not be empty");
|
2011-09-23 02:18:41 +02:00
|
|
|
|
|
2012-01-19 04:58:32 +01:00
|
|
|
|
_rootFolderProvider.Add(new RootDir { Path = path });
|
2011-06-16 04:32:55 +02:00
|
|
|
|
|
2012-07-27 21:28:15 +02:00
|
|
|
|
return JsonNotificationResult.Info("Root Folder saved", "Root folder saved successfully.");
|
2011-05-31 08:13:46 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-28 00:59:48 +02:00
|
|
|
|
[HttpGet]
|
2011-09-09 05:26:48 +02:00
|
|
|
|
public JsonResult LookupSeries(string term)
|
2011-05-31 08:13:46 +02:00
|
|
|
|
{
|
2012-09-15 05:24:34 +02:00
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var tvDbResults = _tvDbProvider.SearchSeries(term).Select(r => new TvDbSearchResultModel
|
|
|
|
|
{
|
|
|
|
|
Id = r.Id,
|
|
|
|
|
Title = r.SeriesName,
|
|
|
|
|
DisplayedTitle = r.FirstAired.Year > 1900 && !r.SeriesName.EndsWith("(" + r.FirstAired.Year + ")")
|
|
|
|
|
? string.Format("{0} ({1})", r.SeriesName, r.FirstAired.Year)
|
|
|
|
|
: r.SeriesName,
|
|
|
|
|
Banner = r.Banner.BannerPath,
|
|
|
|
|
Url = String.Format("http://www.thetvdb.com/?tab=series&id={0}", r.Id)
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
|
|
|
|
return Json(tvDbResults, JsonRequestBehavior.AllowGet);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
catch(TvdbNotAvailableException ex)
|
|
|
|
|
{
|
|
|
|
|
logger.WarnException("Unable to lookup series on TheTVDB", ex);
|
|
|
|
|
return JsonNotificationResult.Info("Lookup Failed", "TheTVDB is not available at this time.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
catch(Exception ex)
|
|
|
|
|
{
|
|
|
|
|
logger.WarnException("Unknown Error when looking up series on TheTVDB", ex);
|
|
|
|
|
return JsonNotificationResult.Info("Lookup Failed", "Unknown error while connecting to TheTVDB");
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-31 08:13:46 +02:00
|
|
|
|
}
|
|
|
|
|
|
2011-07-01 09:23:07 +02:00
|
|
|
|
public ActionResult RootList()
|
2011-06-30 08:15:06 +02:00
|
|
|
|
{
|
2011-07-01 09:52:44 +02:00
|
|
|
|
IEnumerable<String> rootDir = _rootFolderProvider.GetAll().Select(c => c.Path).OrderBy(e => e);
|
2011-07-01 09:23:07 +02:00
|
|
|
|
return PartialView("RootList", rootDir);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public ActionResult RootDir()
|
|
|
|
|
{
|
|
|
|
|
return PartialView("RootDir");
|
2011-06-30 08:15:06 +02:00
|
|
|
|
}
|
|
|
|
|
|
2012-01-19 06:01:47 +01:00
|
|
|
|
[JsonErrorFilter]
|
2011-06-30 08:15:06 +02:00
|
|
|
|
public JsonResult DeleteRootDir(string path)
|
2011-05-31 08:13:46 +02:00
|
|
|
|
{
|
|
|
|
|
|
2012-01-19 06:01:47 +01:00
|
|
|
|
var id = _rootFolderProvider.GetAll().Where(c => c.Path == path).First().Id;
|
|
|
|
|
_rootFolderProvider.Remove(id);
|
2011-05-31 08:13:46 +02:00
|
|
|
|
|
2012-01-19 06:01:47 +01:00
|
|
|
|
return null;
|
2011-05-31 08:13:46 +02:00
|
|
|
|
}
|
2011-04-01 08:36:34 +02:00
|
|
|
|
}
|
2011-04-10 04:44:01 +02:00
|
|
|
|
}
|