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; string showName = match.Groups["ShowTitle"].Value;
bool seasonSuccess = long.TryParse(match.Groups["Season"].Value, out long seasonNumber); bool seasonSuccess = long.TryParse(match.Groups["Season"].Value, out long seasonNumber);
bool episodeSucess = long.TryParse(match.Groups["Episode"].Value, out long episodeNumber); 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; string showProviderIDs;
if (!libraryManager.IsShowRegistered(showPath, out long showID)) if (!libraryManager.IsShowRegistered(showPath, out long showID))
@ -146,15 +166,30 @@ namespace Kyoo.InternalAPI
else else
showProviderIDs = libraryManager.GetShowExternalIDs(showID); 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); if (!libraryManager.IsSeasonRegistered(showID, seasonNumber, out seasonID))
season.ShowID = showID; {
seasonID = libraryManager.RegisterSeason(season); 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; 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; episode.SeasonID = seasonID;
long episodeID = libraryManager.RegisterEpisode(episode); long episodeID = libraryManager.RegisterEpisode(episode);
episode.id = episodeID; episode.id = episodeID;

View File

@ -60,6 +60,7 @@ namespace Kyoo.InternalAPI
seasonID INTEGER, seasonID INTEGER,
seasonNumber INTEGER, seasonNumber INTEGER,
episodeNumber INTEGER, episodeNumber INTEGER,
absoluteNumber INTEGER,
path TEXT, path TEXT,
title TEXT, title TEXT,
overview TEXT, overview TEXT,
@ -707,13 +708,14 @@ namespace Kyoo.InternalAPI
public long RegisterEpisode(Episode episode) 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)) using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{ {
cmd.Parameters.AddWithValue("$showID", episode.ShowID); cmd.Parameters.AddWithValue("$showID", episode.ShowID);
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID); cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber); cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber);
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber); cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
cmd.Parameters.AddWithValue("$absoluteNumber", episode.absoluteNumber);
cmd.Parameters.AddWithValue("$path", episode.Path); cmd.Parameters.AddWithValue("$path", episode.Path);
cmd.Parameters.AddWithValue("$title", episode.Title); cmd.Parameters.AddWithValue("$title", episode.Title);
cmd.Parameters.AddWithValue("$overview", episode.Overview); cmd.Parameters.AddWithValue("$overview", episode.Overview);

View File

@ -17,6 +17,6 @@ namespace Kyoo.InternalAPI
Task<string> GetSeasonImage(string showName, long seasonNumber); Task<string> GetSeasonImage(string showName, long seasonNumber);
//For the episodes //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; 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); string id = GetID(externalIDs);
if (id == null) 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(); string token = await Authentificate();
if (token == null) 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.Method = "GET";
request.Timeout = 12000; request.Timeout = 12000;
request.ContentType = "application/json"; request.ContentType = "application/json";
@ -306,20 +311,30 @@ namespace Kyoo.InternalAPI.MetadataProvider
dynamic episode = data.data[0]; dynamic episode = data.data[0];
DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture); 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 else
{ {
Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + response.StatusCode + " Message: " + response.StatusDescription); Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + response.StatusCode + " Message: " + response.StatusDescription);
response.Close(); 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) catch (WebException ex)
{ {
Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + ex.Status); 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); 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>(); List<Episode> datas = new List<Episode>();
for (int i = 0; i < providers.Count; i++) 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); Episode episode = Merge(datas);

View File

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

View File

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