Making app support absolute paths.

This commit is contained in:
Zoe Roux 2019-10-01 01:12:16 +02:00
parent b3824b3b03
commit ab630b9b84
7 changed files with 76 additions and 19 deletions

View File

@ -132,6 +132,26 @@ namespace Kyoo.InternalAPI
string showName = match.Groups["ShowTitle"].Value;
bool seasonSuccess = long.TryParse(match.Groups["Season"].Value, out long seasonNumber);
bool episodeSucess = long.TryParse(match.Groups["Episode"].Value, out long episodeNumber);
long absoluteNumber = -1;
if(!seasonSuccess || !episodeSucess)
{
//Considering that the episode is using absolute path.
seasonNumber = -1;
episodeNumber = -1;
regex = new Regex(config.GetValue<string>("absoluteRegex"));
match = regex.Match(path);
showName = match.Groups["ShowTitle"].Value;
bool absoluteSucess = long.TryParse(match.Groups["AbsoluteNumber"].Value, out absoluteNumber);
if (!absoluteSucess)
{
Debug.WriteLine("&Couldn't find basic data for the episode (regexs didn't match) at " + path);
return;
}
}
string showProviderIDs;
if (!libraryManager.IsShowRegistered(showPath, out long showID))
@ -146,15 +166,30 @@ namespace Kyoo.InternalAPI
else
showProviderIDs = libraryManager.GetShowExternalIDs(showID);
if (!libraryManager.IsSeasonRegistered(showID, seasonNumber, out long seasonID))
long seasonID = -1;
if (seasonNumber != -1)
{
Season season = await metadataProvider.GetSeason(showName, seasonNumber);
season.ShowID = showID;
seasonID = libraryManager.RegisterSeason(season);
if (!libraryManager.IsSeasonRegistered(showID, seasonNumber, out seasonID))
{
Season season = await metadataProvider.GetSeason(showName, seasonNumber);
season.ShowID = showID;
seasonID = libraryManager.RegisterSeason(season);
}
}
Episode episode = await metadataProvider.GetEpisode(showProviderIDs, seasonNumber, episodeNumber, path);
Episode episode = await metadataProvider.GetEpisode(showProviderIDs, seasonNumber, episodeNumber, absoluteNumber, path);
episode.ShowID = showID;
if(seasonID == -1)
{
if (!libraryManager.IsSeasonRegistered(showID, episode.seasonNumber, out seasonID))
{
Season season = await metadataProvider.GetSeason(showName, episode.seasonNumber);
season.ShowID = showID;
seasonID = libraryManager.RegisterSeason(season);
}
}
episode.SeasonID = seasonID;
long episodeID = libraryManager.RegisterEpisode(episode);
episode.id = episodeID;

View File

@ -60,6 +60,7 @@ namespace Kyoo.InternalAPI
seasonID INTEGER,
seasonNumber INTEGER,
episodeNumber INTEGER,
absoluteNumber INTEGER,
path TEXT,
title TEXT,
overview TEXT,
@ -707,13 +708,14 @@ namespace Kyoo.InternalAPI
public long RegisterEpisode(Episode episode)
{
string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber,$episodeNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);";
string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, absoluteNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber, $episodeNumber, $absoluteNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber);
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
cmd.Parameters.AddWithValue("$absoluteNumber", episode.absoluteNumber);
cmd.Parameters.AddWithValue("$path", episode.Path);
cmd.Parameters.AddWithValue("$title", episode.Title);
cmd.Parameters.AddWithValue("$overview", episode.Overview);

View File

@ -17,6 +17,6 @@ namespace Kyoo.InternalAPI
Task<string> GetSeasonImage(string showName, long seasonNumber);
//For the episodes
Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath);
Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath);
}
}

View File

@ -271,19 +271,24 @@ namespace Kyoo.InternalAPI.MetadataProvider
return null;
}
public async Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath)
public async Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath)
{
string id = GetID(externalIDs);
if (id == null)
return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs);
return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs);
string token = await Authentificate();
if (token == null)
return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs);
return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs);
WebRequest request;
if(absoluteNumber != -1)
request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?absoluteNumber=" + absoluteNumber);
else
request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?airedSeason=" + seasonNumber + "&airedEpisode=" + episodeNumber);
WebRequest request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?airedSeason=" + seasonNumber + "&airedEpisode=" + episodeNumber);
request.Method = "GET";
request.Timeout = 12000;
request.ContentType = "application/json";
@ -306,20 +311,30 @@ namespace Kyoo.InternalAPI.MetadataProvider
dynamic episode = data.data[0];
DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture);
return new Episode(seasonNumber, episodeNumber, (string)episode.episodeName, (string)episode.overview, dateTime, -1, "https://www.thetvdb.com/banners/" + episode.filename, string.Format("TvDB={0}|", episode.id));
if (absoluteNumber == -1)
absoluteNumber = episode.absoluteNumber as long? ?? -1;
else
{
seasonNumber = episode.airedSeason;
episodeNumber = episode.airedEpisodeNumber;
}
return new Episode(seasonNumber, episodeNumber, absoluteNumber, (string)episode.episodeName, (string)episode.overview, dateTime, -1, "https://www.thetvdb.com/banners/" + episode.filename, string.Format("TvDB={0}|", episode.id));
}
}
else
{
Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + response.StatusCode + " Message: " + response.StatusDescription);
response.Close();
return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs);
return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs);
}
}
catch (WebException ex)
{
Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + ex.Status);
return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs);
return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs);
}
}

View File

@ -136,12 +136,12 @@ namespace Kyoo.InternalAPI
return providers[0].GetSeasonImage(showName, seasonNumber);
}
public async Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath)
public async Task<Episode> GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath)
{
List<Episode> datas = new List<Episode>();
for (int i = 0; i < providers.Count; i++)
{
datas.Add(await providers[i].GetEpisode(externalIDs, seasonNumber, episodeNumber, episodePath));
datas.Add(await providers[i].GetEpisode(externalIDs, seasonNumber, episodeNumber, absoluteNumber, episodePath));
}
Episode episode = Merge(datas);

View File

@ -11,6 +11,7 @@ namespace Kyoo.Models
public long seasonNumber;
public long episodeNumber;
public long absoluteNumber;
[JsonIgnore] public string Path;
public string Title;
public string Overview;
@ -27,13 +28,14 @@ namespace Kyoo.Models
public Episode() { }
public Episode(long seasonNumber, long episodeNumber, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs)
public Episode(long seasonNumber, long episodeNumber, long absoluteNumber, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs)
{
id = -1;
ShowID = -1;
SeasonID = -1;
this.seasonNumber = seasonNumber;
this.episodeNumber = episodeNumber;
this.absoluteNumber = absoluteNumber;
Title = title;
Overview = overview;
ReleaseDate = releaseDate;
@ -42,13 +44,14 @@ namespace Kyoo.Models
ExternalIDs = externalIDs;
}
public Episode(long id, long showID, long seasonID, long seasonNumber, long episodeNumber, string path, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs)
public Episode(long id, long showID, long seasonID, long seasonNumber, long episodeNumber, long absoluteNumber, string path, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs)
{
this.id = id;
ShowID = showID;
SeasonID = seasonID;
this.seasonNumber = seasonNumber;
this.episodeNumber = episodeNumber;
this.absoluteNumber = absoluteNumber;
Path = path;
Title = title;
Overview = overview;
@ -65,6 +68,7 @@ namespace Kyoo.Models
(long)reader["seasonID"],
(long)reader["seasonNumber"],
(long)reader["episodeNumber"],
(long)reader["absoluteNumber"],
reader["path"] as string,
reader["title"] as string,
reader["overview"] as string,

View File

@ -7,5 +7,6 @@
"libraryPaths": [
"\\\\sdg\\video\\Anime"
],
"regex": ".*\\\\(?<ShowTitle>.+?) S(?<Season>\\d+)E(?<Episode>\\d+)"
"regex": ".*\\\\(?<ShowTitle>.+?) S(?<Season>\\d+)E(?<Episode>\\d+)",
"absoluteRegex": ".*\\\\(?<ShowTitle>.+?) (?<AbsoluteNumber>\\d+)"
}