logging in with quick connect works now!

This commit is contained in:
random() 2025-05-15 21:05:32 -06:00
parent 70c2372535
commit 6235a69e43
10 changed files with 131 additions and 64 deletions

View file

@ -47,8 +47,9 @@
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage2 = new System.Windows.Forms.TabPage(); this.tabPage2 = new System.Windows.Forms.TabPage();
this.button2 = new System.Windows.Forms.Button();
this.button1 = new System.Windows.Forms.Button();
this.label9 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label();
this.button4 = new System.Windows.Forms.Button();
this.textBox4 = new System.Windows.Forms.TextBox(); this.textBox4 = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
@ -221,8 +222,8 @@
// //
// tabControl1 // tabControl1
// //
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3); this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage1); this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Location = new System.Drawing.Point(1, 0); this.tabControl1.Location = new System.Drawing.Point(1, 0);
this.tabControl1.Name = "tabControl1"; this.tabControl1.Name = "tabControl1";
@ -232,8 +233,9 @@
// //
// tabPage2 // tabPage2
// //
this.tabPage2.Controls.Add(this.button2);
this.tabPage2.Controls.Add(this.button1);
this.tabPage2.Controls.Add(this.label9); this.tabPage2.Controls.Add(this.label9);
this.tabPage2.Controls.Add(this.button4);
this.tabPage2.Controls.Add(this.textBox4); this.tabPage2.Controls.Add(this.textBox4);
this.tabPage2.Controls.Add(this.label5); this.tabPage2.Controls.Add(this.label5);
this.tabPage2.Controls.Add(this.label4); this.tabPage2.Controls.Add(this.label4);
@ -245,12 +247,32 @@
this.tabPage2.Text = "Quick Connect"; this.tabPage2.Text = "Quick Connect";
this.tabPage2.Click += new System.EventHandler(this.tabPage2_Click); this.tabPage2.Click += new System.EventHandler(this.tabPage2_Click);
// //
// button2
//
this.button2.Location = new System.Drawing.Point(71, 123);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(134, 23);
this.button2.TabIndex = 7;
this.button2.Text = "Save URL and Close";
this.button2.UseVisualStyleBackColor = true;
this.button2.Click += new System.EventHandler(this.button2_Click);
//
// button1
//
this.button1.Location = new System.Drawing.Point(101, 65);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 6;
this.button1.Text = "Confirm";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label9 // label9
// //
this.label9.AutoEllipsis = true; this.label9.AutoEllipsis = true;
this.label9.AutoSize = true; this.label9.AutoSize = true;
this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System; this.label9.FlatStyle = System.Windows.Forms.FlatStyle.System;
this.label9.Location = new System.Drawing.Point(7, 74); this.label9.Location = new System.Drawing.Point(8, 70);
this.label9.MaximumSize = new System.Drawing.Size(260, 0); this.label9.MaximumSize = new System.Drawing.Size(260, 0);
this.label9.MinimumSize = new System.Drawing.Size(260, 0); this.label9.MinimumSize = new System.Drawing.Size(260, 0);
this.label9.Name = "label9"; this.label9.Name = "label9";
@ -258,16 +280,6 @@
this.label9.TabIndex = 5; this.label9.TabIndex = 5;
this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.label9.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
// //
// button4
//
this.button4.Location = new System.Drawing.Point(101, 116);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(75, 23);
this.button4.TabIndex = 4;
this.button4.Text = "Submit";
this.button4.UseVisualStyleBackColor = true;
this.button4.Click += new System.EventHandler(this.button4_Click);
//
// textBox4 // textBox4
// //
this.textBox4.Location = new System.Drawing.Point(8, 24); this.textBox4.Location = new System.Drawing.Point(8, 24);
@ -318,6 +330,7 @@
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
this.Text = "Server Config"; this.Text = "Server Config";
this.TopMost = true; this.TopMost = true;
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ConfigForm_FormClosing);
this.Load += new System.EventHandler(this.ConfigForm_Load); this.Load += new System.EventHandler(this.ConfigForm_Load);
this.tabPage1.ResumeLayout(false); this.tabPage1.ResumeLayout(false);
this.tabPage1.PerformLayout(); this.tabPage1.PerformLayout();
@ -348,7 +361,6 @@
private System.Windows.Forms.Label label6; private System.Windows.Forms.Label label6;
private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.Button button4;
private System.Windows.Forms.TextBox textBox4; private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.Label label5; private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4; private System.Windows.Forms.Label label4;
@ -356,5 +368,7 @@
private System.Windows.Forms.ToolTip toolTip1; private System.Windows.Forms.ToolTip toolTip1;
public System.Windows.Forms.TextBox textBox6; public System.Windows.Forms.TextBox textBox6;
public System.Windows.Forms.MaskedTextBox maskedTextBox2; public System.Windows.Forms.MaskedTextBox maskedTextBox2;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button1;
} }
} }

View file

@ -47,16 +47,15 @@ namespace JellyfinRPC
this.Close(); this.Close();
} }
static string quickConnectLabel; private void ConfigForm_Load(object sender, EventArgs e)
private async void ConfigForm_Load(object sender, EventArgs e)
{ {
textBox1.Text = ConfigManager.GetEntry("ServerURL"); textBox1.Text = ConfigManager.GetEntry("ServerURL");
textBox2.Text = ConfigManager.GetEntry("UserID"); textBox2.Text = ConfigManager.GetEntry("UserID");
maskedTextBox1.Text = ConfigManager.GetEntry("APIKey"); maskedTextBox1.Text = ConfigManager.GetEntry("APIKey");
textBox4.Text = ConfigManager.GetEntry("ServerURL"); textBox4.Text = ConfigManager.GetEntry("ServerURL");
textBox5.Text = ConfigManager.GetEntry("ServerURL"); textBox5.Text = ConfigManager.GetEntry("ServerURL");
quickConnectLabel = await JellyfinAPI.SendQuickConnectRequest(); JellyfinAPI.formClosed = false;
label9.Text = quickConnectLabel;
} }
private void label4_Click(object sender, EventArgs e) private void label4_Click(object sender, EventArgs e)
@ -78,10 +77,10 @@ namespace JellyfinRPC
{ {
} }
private void button4_Click(object sender, EventArgs e) private void button4_Click(object sender, EventArgs e)
{ {
ConfigManager.SetEntry("ServerURL", textBox4.Text); ConfigManager.SetEntry("ServerURL", textBox4.Text);
} }
private void label6_Click(object sender, EventArgs e) private void label6_Click(object sender, EventArgs e)
@ -119,5 +118,22 @@ namespace JellyfinRPC
{ {
toolTip1.Show("Format like https://mydomain.local.", textBox1, textBox1.PointToClient(textBox1.Location).X + 30, textBox1.PointToClient(textBox1.Location).Y + 90, 2000); toolTip1.Show("Format like https://mydomain.local.", textBox1, textBox1.PointToClient(textBox1.Location).X + 30, textBox1.PointToClient(textBox1.Location).Y + 90, 2000);
} }
private async void button1_Click(object sender, EventArgs e)
{
button1.Hide();
await JellyfinAPI.AuthWithQuickConnect();
}
private void button2_Click(object sender, EventArgs e)
{
ConfigManager.SetEntry("ServerURL", textBox4.Text);
Close();
}
private void ConfigForm_FormClosing(object sender, FormClosingEventArgs e)
{
JellyfinAPI.formClosed = true;
}
} }
} }

View file

@ -9,6 +9,7 @@ using System.Reflection;
using System.Security.Cryptography; using System.Security.Cryptography;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.IO; using System.IO;
using System.Threading;
namespace JellyfinRPC namespace JellyfinRPC
{ {
@ -179,47 +180,83 @@ namespace JellyfinRPC
} }
return "album_cover"; return "album_cover";
} }
public static async Task<string> SendQuickConnectRequest() public static string quickConnectToken;
static bool authSuccess;
public static bool formClosed;
public static async Task AuthWithQuickConnect()
{ {
using var httpClient = new HttpClient(); using var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"MediaBrowser Client=\"JellyfinRPC\", Device=\"{Environment.OSVersion}\", DeviceId=\"{ConfigManager.GetEntry("DeviceID")}\", Version=\"{AssemblyVersion}\""); httpClient.DefaultRequestHeaders.Add("Authorization", $"MediaBrowser Client=\"JellyfinRPC {AssemblyVersion}, \", Device=\"{System.Net.Dns.GetHostName()}\", DeviceId=\"{ConfigManager.GetEntry("DeviceID")}\", Version=\"running on {Environment.OSVersion}\"");
if (ConfigManager.GetEntry("ServerURL") != "") if (ConfigManager.GetEntry("ServerURL") != "")
{ {
var response = await httpClient.GetAsync($"{ConfigManager.GetEntry("ServerURL")}/QuickConnect/Initiate"); var quickConnectInitResponse = await httpClient.GetAsync($"{ConfigManager.GetEntry("ServerURL")}/QuickConnect/Initiate");
if (response.StatusCode is (System.Net.HttpStatusCode)401) authSuccess = false;
if (quickConnectInitResponse.StatusCode is (System.Net.HttpStatusCode)401)
{ {
System.Windows.Forms.MessageBox.Show("This server does not have Quick Connect enabled.", "Quick Connect Unavailable.", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1); System.Windows.Forms.MessageBox.Show("This server does not have Quick Connect enabled.", "Quick Connect Unavailable.", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1);
return "Error: Server does not have Quick Connect Enabled.";
} }
else else
{ {
try try
{ {
response.EnsureSuccessStatusCode(); quickConnectInitResponse.EnsureSuccessStatusCode();
var jsonResponse = await response.Content.ReadAsStringAsync(); var jsonResponse = await quickConnectInitResponse.Content.ReadAsStringAsync();
var jsonObject = JObject.Parse(jsonResponse); var jsonObject = JObject.Parse(jsonResponse);
if (!jsonObject.HasValues) if (!jsonObject.HasValues)
{ {
return "Error: Server did not respond.";
} }
else else
{ {
string quickConnectCode = jsonObject.Value<string>("Code"); string quickConnectCode = jsonObject.Value<string>("Code");
string quickConnectToken = jsonObject.Value<string>("Secret"); if (jsonObject.Value<string>("Secret") != null && jsonObject.Value<string>("Secret") != "")
return quickConnectCode; {
quickConnectToken = jsonObject.Value<string>("Secret");
}
else
{
quickConnectToken = null;
}
(System.Windows.Forms.Application.OpenForms["ConfigForm"] as ConfigForm).label9.Text = quickConnectCode;
while (authSuccess == false)
{
var getThings = await CheckQuickConnectStatus();
if (formClosed == true)
{
break;
}
else if (getThings == null)
{
await CheckQuickConnectStatus();
}
else if (getThings == "this isn't gonna work")
{
System.Windows.Forms.MessageBox.Show("Quick Connect doesn't seem to be working. Check your Internet connection and try again later.", "Quick Connect Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error);
break;
}
else
{
authSuccess = true;
}
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
return $"{ex.Message.Trim()}"; #if DEBUG
System.Windows.Forms.MessageBox.Show(ex.ToString());
#endif
} }
} }
} }
else else
{ {
return "Error: No Server URL Set."; System.Windows.Forms.MessageBox.Show("No Server URL Set", "Quick Connect Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Exclamation);
} }
} }
@ -246,16 +283,16 @@ namespace JellyfinRPC
var loginRequest = new Login() { username = username, pw = password }; var loginRequest = new Login() { username = username, pw = password };
var loginJson = JsonConvert.SerializeObject(loginRequest); var loginJson = JsonConvert.SerializeObject(loginRequest);
HttpResponseMessage response = await httpClient.PostAsync($"{ConfigManager.GetEntry("ServerURL")}/Users/AuthenticateByName", new StringContent(loginJson, Encoding.UTF8, "application/json")); HttpResponseMessage loginWithUsernameandPassResponse = await httpClient.PostAsync($"{ConfigManager.GetEntry("ServerURL")}/Users/AuthenticateByName", new StringContent(loginJson, Encoding.UTF8, "application/json"));
if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized) if (loginWithUsernameandPassResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{ {
System.Windows.Forms.MessageBox.Show("The Username or Password is incorrect.", "Authentication Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1); System.Windows.Forms.MessageBox.Show("The Username or Password is incorrect.", "Authentication Error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1);
} }
else else
{ {
response.EnsureSuccessStatusCode(); loginWithUsernameandPassResponse.EnsureSuccessStatusCode();
var jsonResponse = await response.Content.ReadAsStringAsync(); var jsonResponse = await loginWithUsernameandPassResponse.Content.ReadAsStringAsync();
var jsonShit = JObject.Parse(jsonResponse); var jsonShit = JObject.Parse(jsonResponse);
@ -269,6 +306,32 @@ namespace JellyfinRPC
} }
} }
} }
public static async Task<string> CheckQuickConnectStatus()
{
using var httpClient = new HttpClient();
if (quickConnectToken != null && quickConnectToken != "")
{
TaskEx.Delay(1000);
string secret = quickConnectToken.Replace('"', ' ').Trim();
HttpResponseMessage QuickConnectStatusResponse = await httpClient.GetAsync($"{ConfigManager.GetEntry("ServerURL")}/QuickConnect/Connect?Secret={quickConnectToken}");
QuickConnectStatusResponse.EnsureSuccessStatusCode();
var responseAsString = await QuickConnectStatusResponse.Content.ReadAsStringAsync();
var responseJson = JObject.Parse(responseAsString);
if (responseJson.ContainsKey("AccessToken"))
{
return responseJson.Value<string>("AccessToken");
}
else
{
return null;
}
}
else
{
return "this isn't gonna work";
}
}
} }
public class Login public class Login
@ -277,31 +340,5 @@ namespace JellyfinRPC
public string username { get; set; } public string username { get; set; }
public string pw { get; set; } public string pw { get; set; }
#pragma warning restore IDE1006 // Naming Styles #pragma warning restore IDE1006 // Naming Styles
} }
public class QuickConnect
{
[JsonProperty("Authenticated")]
public bool Authenticated { get; set; }
[JsonProperty("Secret")]
public string Secret { get; set; }
[JsonProperty("Code")]
public string Code { get; set; }
[JsonProperty("DeviceId")]
public string DeviceId { get; set; }
[JsonProperty("DeviceName")]
public string DeviceName { get; set; }
[JsonProperty("AppName")]
public string AppName { get; set; }
[JsonProperty("AppVersion")]
public string AppVersion { get; set; }
[JsonProperty("DateAdded")]
public DateTime DateAdded { get; set; }
}
} }