mirror of
https://github.com/Jackett/Jackett.git
synced 2025-09-17 17:34:09 +02:00
Now works on Linux (headless), detailed logging, season searching
This commit is contained in:
@@ -89,8 +89,10 @@ namespace Jackett
|
|||||||
{
|
{
|
||||||
var browseQuery = new TorznabQuery();
|
var browseQuery = new TorznabQuery();
|
||||||
var results = await indexer.PerformQuery(browseQuery);
|
var results = await indexer.PerformQuery(browseQuery);
|
||||||
|
Program.LoggerInstance.Debug(string.Format("Found {0} releases from {1}", results.Length, indexer.DisplayName));
|
||||||
if (results.Length == 0)
|
if (results.Length == 0)
|
||||||
throw new Exception("Found no results while trying to browse this tracker");
|
throw new Exception("Found no results while trying to browse this tracker");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -23,12 +23,18 @@ namespace Jackett
|
|||||||
toolStripMenuItemAutoStart.Checked = AutoStart;
|
toolStripMenuItemAutoStart.Checked = AutoStart;
|
||||||
toolStripMenuItemAutoStart.CheckedChanged += toolStripMenuItemAutoStart_CheckedChanged;
|
toolStripMenuItemAutoStart.CheckedChanged += toolStripMenuItemAutoStart_CheckedChanged;
|
||||||
|
|
||||||
|
toolStripMenuItemWebUI.Click += toolStripMenuItemWebUI_Click;
|
||||||
toolStripMenuItemShutdown.Click += toolStripMenuItemShutdown_Click;
|
toolStripMenuItemShutdown.Click += toolStripMenuItemShutdown_Click;
|
||||||
|
|
||||||
if (Program.IsFirstRun)
|
if (Program.IsFirstRun)
|
||||||
AutoStart = true;
|
AutoStart = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void toolStripMenuItemWebUI_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Process.Start("http://127.0.0.1:" + Server.Port);
|
||||||
|
}
|
||||||
|
|
||||||
void toolStripMenuItemShutdown_Click(object sender, EventArgs e)
|
void toolStripMenuItemShutdown_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
Application.Exit();
|
Application.Exit();
|
||||||
|
@@ -24,8 +24,12 @@ namespace Jackett
|
|||||||
|
|
||||||
public static Logger LoggerInstance { get; private set; }
|
public static Logger LoggerInstance { get; private set; }
|
||||||
|
|
||||||
|
public static ManualResetEvent ExitEvent { get; private set; }
|
||||||
|
|
||||||
static void Main(string[] args)
|
static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
ExitEvent = new ManualResetEvent(false);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!Directory.Exists(AppConfigDirectory))
|
if (!Directory.Exists(AppConfigDirectory))
|
||||||
@@ -46,31 +50,45 @@ namespace Jackett
|
|||||||
var logFile = new FileTarget();
|
var logFile = new FileTarget();
|
||||||
logConfig.AddTarget("file", logFile);
|
logConfig.AddTarget("file", logFile);
|
||||||
logFile.FileName = Path.Combine(AppConfigDirectory, "log.txt");
|
logFile.FileName = Path.Combine(AppConfigDirectory, "log.txt");
|
||||||
logFile.Layout = "${longdate} ${level} ${message}";
|
logFile.Layout = "${longdate} ${level} ${message} \n ${exception:format=ToString}\n";
|
||||||
var logFileRule = new LoggingRule("*", LogLevel.Debug, logFile);
|
var logFileRule = new LoggingRule("*", LogLevel.Debug, logFile);
|
||||||
|
|
||||||
var logAlert = new MessageBoxTarget();
|
var logAlert = new MessageBoxTarget();
|
||||||
logConfig.AddTarget("alert", logAlert);
|
logConfig.AddTarget("alert", logAlert);
|
||||||
logAlert.Layout = "${message}";
|
logAlert.Layout = "${message}";
|
||||||
logAlert.Caption = "Alert";
|
logAlert.Caption = "Alert";
|
||||||
var logAlertRule = new LoggingRule("*", LogLevel.Error, logAlert);
|
var logAlertRule = new LoggingRule("*", LogLevel.Fatal, logAlert);
|
||||||
|
|
||||||
|
var logConsole = new ConsoleTarget();
|
||||||
|
logConfig.AddTarget("console", logConsole);
|
||||||
|
logConsole.Layout = "${longdate} ${level} ${message} ${exception:format=ToString}";
|
||||||
|
var logConsoleRule = new LoggingRule("*", LogLevel.Debug, logConsole);
|
||||||
|
|
||||||
logConfig.LoggingRules.Add(logFileRule);
|
logConfig.LoggingRules.Add(logFileRule);
|
||||||
logConfig.LoggingRules.Add(logAlertRule);
|
logConfig.LoggingRules.Add(logAlertRule);
|
||||||
|
logConfig.LoggingRules.Add(logConsoleRule);
|
||||||
LogManager.Configuration = logConfig;
|
LogManager.Configuration = logConfig;
|
||||||
LoggerInstance = LogManager.GetCurrentClassLogger();
|
LoggerInstance = LogManager.GetCurrentClassLogger();
|
||||||
|
|
||||||
Task.Run(() =>
|
var serverTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
ServerInstance = new Server();
|
ServerInstance = new Server();
|
||||||
ServerInstance.Start();
|
await ServerInstance.Start();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
Application.EnableVisualStyles();
|
Application.EnableVisualStyles();
|
||||||
Application.SetCompatibleTextRenderingDefault(false);
|
Application.SetCompatibleTextRenderingDefault(false);
|
||||||
Application.Run(new Main());
|
Application.Run(new Main());
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Running in headless mode.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Task.WaitAll(serverTask);
|
||||||
|
Console.WriteLine("Server thread exit");
|
||||||
}
|
}
|
||||||
|
|
||||||
static public void RestartAsAdmin()
|
static public void RestartAsAdmin()
|
||||||
|
@@ -15,7 +15,7 @@ namespace Jackett
|
|||||||
{
|
{
|
||||||
public class Server
|
public class Server
|
||||||
{
|
{
|
||||||
int Port = 9117;
|
public const int Port = 9117;
|
||||||
|
|
||||||
HttpListener listener;
|
HttpListener listener;
|
||||||
IndexerManager indexerManager;
|
IndexerManager indexerManager;
|
||||||
@@ -46,17 +46,17 @@ namespace Jackett
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Start()
|
public async Task Start()
|
||||||
{
|
{
|
||||||
Program.LoggerInstance.Info("Starting HTTP server...");
|
Program.LoggerInstance.Info("Starting HTTP server...");
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
listener.Start();
|
listener.Start();
|
||||||
Process.Start("http://127.0.0.1:" + Port);
|
|
||||||
}
|
}
|
||||||
catch (HttpListenerException ex)
|
catch (HttpListenerException ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("Server start exception: " + ex.ToString());
|
||||||
var dialogResult = MessageBox.Show(
|
var dialogResult = MessageBox.Show(
|
||||||
"App must be ran as Admin for permission to use port " + Port + Environment.NewLine + "Restart app with admin privileges?",
|
"App must be ran as Admin for permission to use port " + Port + Environment.NewLine + "Restart app with admin privileges?",
|
||||||
"Failed to open port",
|
"Failed to open port",
|
||||||
@@ -75,10 +75,18 @@ namespace Jackett
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("Server start exception: " + ex.ToString());
|
||||||
Program.LoggerInstance.ErrorException("Error: " + ex.Message, ex);
|
Program.LoggerInstance.ErrorException("Error: " + ex.Message, ex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Program.LoggerInstance.Info("Server started on port " + Port);
|
Program.LoggerInstance.Info("Server started on port " + Port);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Process.Start("http://127.0.0.1:" + Port);
|
||||||
|
}
|
||||||
|
catch (Exception) { }
|
||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
var context = await listener.GetContextAsync();
|
var context = await listener.GetContextAsync();
|
||||||
@@ -115,6 +123,7 @@ namespace Jackett
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
exception = ex;
|
exception = ex;
|
||||||
|
Program.LoggerInstance.ErrorException(ex.Message + ex.ToString(), ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exception != null)
|
if (exception != null)
|
||||||
@@ -127,7 +136,11 @@ namespace Jackett
|
|||||||
catch (Exception) { }
|
catch (Exception) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
context.Response.Close();
|
context.Response.Close();
|
||||||
|
}
|
||||||
|
catch (Exception) { }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,6 +170,8 @@ namespace Jackett
|
|||||||
|
|
||||||
var releases = await indexer.PerformQuery(torznabQuery);
|
var releases = await indexer.PerformQuery(torznabQuery);
|
||||||
|
|
||||||
|
Program.LoggerInstance.Debug(string.Format("Found {0} releases from {1}", releases.Length, indexer.DisplayName));
|
||||||
|
|
||||||
var severUrl = string.Format("{0}://{1}:{2}/", context.Request.Url.Scheme, context.Request.Url.Host, context.Request.Url.Port);
|
var severUrl = string.Format("{0}://{1}:{2}/", context.Request.Url.Scheme, context.Request.Url.Host, context.Request.Url.Port);
|
||||||
|
|
||||||
var resultPage = new ResultPage(new ChannelInfo
|
var resultPage = new ResultPage(new ChannelInfo
|
||||||
|
@@ -30,6 +30,8 @@ namespace Jackett
|
|||||||
DateTime showDate;
|
DateTime showDate;
|
||||||
if (DateTime.TryParseExact(string.Format("{0} {1}", Season, Episode), "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out showDate))
|
if (DateTime.TryParseExact(string.Format("{0} {1}", Season, Episode), "yyyy MM/dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out showDate))
|
||||||
episodeString = showDate.ToString("yyyy.MM.dd");
|
episodeString = showDate.ToString("yyyy.MM.dd");
|
||||||
|
else if (string.IsNullOrEmpty(Episode))
|
||||||
|
episodeString = string.Format("S{0:00}", Season);
|
||||||
else
|
else
|
||||||
episodeString = string.Format("S{0:00}E{1:00}", Season, int.Parse(Episode));
|
episodeString = string.Format("S{0:00}E{1:00}", Season, int.Parse(Episode));
|
||||||
|
|
||||||
|
@@ -131,14 +131,21 @@ namespace Jackett
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
JToken jsonReply = await handlerTask(context);
|
JToken jsonReply = await handlerTask(context);
|
||||||
ReplyWithJson(context, jsonReply);
|
await ReplyWithJson(context, jsonReply, method.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
async void ReplyWithJson(HttpListenerContext context, JToken json)
|
async Task ReplyWithJson(HttpListenerContext context, JToken json, string apiCall)
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
byte[] jsonBytes = Encoding.UTF8.GetBytes(json.ToString());
|
byte[] jsonBytes = Encoding.UTF8.GetBytes(json.ToString());
|
||||||
await context.Response.OutputStream.WriteAsync(jsonBytes, 0, jsonBytes.Length);
|
await context.Response.OutputStream.WriteAsync(jsonBytes, 0, jsonBytes.Length);
|
||||||
}
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error writing json to stream for API call " + apiCall + Environment.NewLine + ex.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async Task<JToken> HandleTestSonarr(HttpListenerContext context)
|
async Task<JToken> HandleTestSonarr(HttpListenerContext context)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user