Compare commits
5
Commits
1.9.0
...
f1c4de4523
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f1c4de4523 | ||
|
|
94e4c89776 | ||
|
|
75a378e948 | ||
|
|
7b67c03270 | ||
|
|
34c80bda7b |
Generated
+84
-45
@@ -43,6 +43,8 @@
|
||||
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.label6 = new System.Windows.Forms.Label();
|
||||
this.label5 = new System.Windows.Forms.Label();
|
||||
this.label4 = new System.Windows.Forms.Label();
|
||||
@@ -56,8 +58,9 @@
|
||||
this.profile_drop_box = new System.Windows.Forms.ComboBox();
|
||||
this.profile_label = new System.Windows.Forms.Label();
|
||||
this.load_profile_button = new System.Windows.Forms.Button();
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.time_label = new System.Windows.Forms.Label();
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.time_data_label = new System.Windows.Forms.Label();
|
||||
this.statusStrip1.SuspendLayout();
|
||||
this.menuStrip2.SuspendLayout();
|
||||
this.groupBox1.SuspendLayout();
|
||||
@@ -71,9 +74,9 @@
|
||||
this.toolStripStatusLabel2,
|
||||
this.toolStripStatusLabel4,
|
||||
this.toolStripStatusLabel3});
|
||||
this.statusStrip1.Location = new System.Drawing.Point(0, 314);
|
||||
this.statusStrip1.Location = new System.Drawing.Point(0, 362);
|
||||
this.statusStrip1.Name = "statusStrip1";
|
||||
this.statusStrip1.Size = new System.Drawing.Size(612, 25);
|
||||
this.statusStrip1.Size = new System.Drawing.Size(612, 26);
|
||||
this.statusStrip1.TabIndex = 0;
|
||||
this.statusStrip1.Text = "statusStrip1";
|
||||
//
|
||||
@@ -81,23 +84,22 @@
|
||||
//
|
||||
this.toolStripStatusLabel1.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
|
||||
this.toolStripStatusLabel1.Size = new System.Drawing.Size(57, 20);
|
||||
this.toolStripStatusLabel1.Size = new System.Drawing.Size(64, 21);
|
||||
this.toolStripStatusLabel1.Text = "Status:";
|
||||
//
|
||||
// toolStripStatusLabel2
|
||||
//
|
||||
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
|
||||
this.toolStripStatusLabel2.Size = new System.Drawing.Size(16, 20);
|
||||
// Use BackColor only to indicate status. Text is a single space so the label renders as a square.
|
||||
this.toolStripStatusLabel2.Text = " ";
|
||||
this.toolStripStatusLabel2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||
this.toolStripStatusLabel2.BackColor = System.Drawing.Color.Red;
|
||||
this.toolStripStatusLabel2.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
||||
this.toolStripStatusLabel2.Name = "toolStripStatusLabel2";
|
||||
this.toolStripStatusLabel2.Size = new System.Drawing.Size(12, 21);
|
||||
this.toolStripStatusLabel2.Text = " ";
|
||||
//
|
||||
// toolStripStatusLabel4
|
||||
//
|
||||
this.toolStripStatusLabel4.Font = new System.Drawing.Font("Segoe UI", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.toolStripStatusLabel4.Name = "toolStripStatusLabel4";
|
||||
this.toolStripStatusLabel4.Size = new System.Drawing.Size(262, 20);
|
||||
this.toolStripStatusLabel4.Size = new System.Drawing.Size(260, 21);
|
||||
this.toolStripStatusLabel4.Spring = true;
|
||||
this.toolStripStatusLabel4.Text = "Profile:";
|
||||
this.toolStripStatusLabel4.Click += new System.EventHandler(this.toolStripStatusLabel4_Click);
|
||||
@@ -105,7 +107,7 @@
|
||||
// toolStripStatusLabel3
|
||||
//
|
||||
this.toolStripStatusLabel3.Name = "toolStripStatusLabel3";
|
||||
this.toolStripStatusLabel3.Size = new System.Drawing.Size(262, 20);
|
||||
this.toolStripStatusLabel3.Size = new System.Drawing.Size(260, 21);
|
||||
this.toolStripStatusLabel3.Spring = true;
|
||||
this.toolStripStatusLabel3.Text = "Song Changed Updateing";
|
||||
this.toolStripStatusLabel3.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
|
||||
@@ -117,7 +119,7 @@
|
||||
this.aboutToolStripMenuItem});
|
||||
this.menuStrip2.Location = new System.Drawing.Point(0, 0);
|
||||
this.menuStrip2.Name = "menuStrip2";
|
||||
this.menuStrip2.Size = new System.Drawing.Size(612, 24);
|
||||
this.menuStrip2.Size = new System.Drawing.Size(612, 25);
|
||||
this.menuStrip2.TabIndex = 2;
|
||||
this.menuStrip2.Text = "menuStrip2";
|
||||
//
|
||||
@@ -128,7 +130,7 @@
|
||||
this.loggingToolStripMenuItem,
|
||||
this.exitToolStripMenuItem});
|
||||
this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
|
||||
this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
|
||||
this.fileToolStripMenuItem.Size = new System.Drawing.Size(41, 21);
|
||||
this.fileToolStripMenuItem.Text = "File";
|
||||
//
|
||||
// restAPISettingToolStripMenuItem
|
||||
@@ -151,13 +153,13 @@
|
||||
// onToolStripMenuItem
|
||||
//
|
||||
this.onToolStripMenuItem.Name = "onToolStripMenuItem";
|
||||
this.onToolStripMenuItem.Size = new System.Drawing.Size(91, 22);
|
||||
this.onToolStripMenuItem.Size = new System.Drawing.Size(98, 22);
|
||||
this.onToolStripMenuItem.Text = "On";
|
||||
//
|
||||
// offToolStripMenuItem
|
||||
//
|
||||
this.offToolStripMenuItem.Name = "offToolStripMenuItem";
|
||||
this.offToolStripMenuItem.Size = new System.Drawing.Size(91, 22);
|
||||
this.offToolStripMenuItem.Size = new System.Drawing.Size(98, 22);
|
||||
this.offToolStripMenuItem.Text = "Off";
|
||||
//
|
||||
// exitToolStripMenuItem
|
||||
@@ -170,12 +172,15 @@
|
||||
// aboutToolStripMenuItem
|
||||
//
|
||||
this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem";
|
||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(52, 20);
|
||||
this.aboutToolStripMenuItem.Size = new System.Drawing.Size(52, 21);
|
||||
this.aboutToolStripMenuItem.Text = "About";
|
||||
this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click);
|
||||
//
|
||||
// groupBox1
|
||||
//
|
||||
this.groupBox1.Controls.Add(this.time_data_label);
|
||||
this.groupBox1.Controls.Add(this.label9);
|
||||
this.groupBox1.Controls.Add(this.time_label);
|
||||
this.groupBox1.Controls.Add(this.label8);
|
||||
this.groupBox1.Controls.Add(this.label7);
|
||||
this.groupBox1.Controls.Add(this.label6);
|
||||
@@ -187,15 +192,34 @@
|
||||
this.groupBox1.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.groupBox1.Location = new System.Drawing.Point(199, 37);
|
||||
this.groupBox1.Name = "groupBox1";
|
||||
this.groupBox1.Size = new System.Drawing.Size(390, 173);
|
||||
this.groupBox1.Size = new System.Drawing.Size(390, 205);
|
||||
this.groupBox1.TabIndex = 4;
|
||||
this.groupBox1.TabStop = false;
|
||||
this.groupBox1.Text = "Song Info";
|
||||
//
|
||||
// label8
|
||||
//
|
||||
this.label8.AutoSize = true;
|
||||
this.label8.Location = new System.Drawing.Point(20, 103);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(357, 16);
|
||||
this.label8.TabIndex = 7;
|
||||
this.label8.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
|
||||
this.label8.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
|
||||
//
|
||||
// label7
|
||||
//
|
||||
this.label7.AutoSize = true;
|
||||
this.label7.Location = new System.Drawing.Point(19, 61);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(357, 16);
|
||||
this.label7.TabIndex = 6;
|
||||
this.label7.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
|
||||
//
|
||||
// label6
|
||||
//
|
||||
this.label6.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label6.Location = new System.Drawing.Point(99, 140);
|
||||
this.label6.Location = new System.Drawing.Point(99, 121);
|
||||
this.label6.Name = "label6";
|
||||
this.label6.Size = new System.Drawing.Size(266, 17);
|
||||
this.label6.TabIndex = 5;
|
||||
@@ -205,7 +229,7 @@
|
||||
// label5
|
||||
//
|
||||
this.label5.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label5.Location = new System.Drawing.Point(99, 84);
|
||||
this.label5.Location = new System.Drawing.Point(99, 76);
|
||||
this.label5.Name = "label5";
|
||||
this.label5.Size = new System.Drawing.Size(266, 17);
|
||||
this.label5.TabIndex = 4;
|
||||
@@ -226,7 +250,7 @@
|
||||
//
|
||||
this.label3.AutoSize = true;
|
||||
this.label3.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label3.Location = new System.Drawing.Point(23, 138);
|
||||
this.label3.Location = new System.Drawing.Point(23, 116);
|
||||
this.label3.Name = "label3";
|
||||
this.label3.Size = new System.Drawing.Size(76, 24);
|
||||
this.label3.TabIndex = 2;
|
||||
@@ -236,7 +260,7 @@
|
||||
//
|
||||
this.label2.AutoSize = true;
|
||||
this.label2.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.label2.Location = new System.Drawing.Point(23, 82);
|
||||
this.label2.Location = new System.Drawing.Point(23, 75);
|
||||
this.label2.Name = "label2";
|
||||
this.label2.Size = new System.Drawing.Size(62, 24);
|
||||
this.label2.TabIndex = 1;
|
||||
@@ -254,7 +278,7 @@
|
||||
//
|
||||
// button1
|
||||
//
|
||||
this.button1.Location = new System.Drawing.Point(62, 230);
|
||||
this.button1.Location = new System.Drawing.Point(62, 281);
|
||||
this.button1.Name = "button1";
|
||||
this.button1.Size = new System.Drawing.Size(99, 42);
|
||||
this.button1.TabIndex = 5;
|
||||
@@ -264,7 +288,7 @@
|
||||
//
|
||||
// button2
|
||||
//
|
||||
this.button2.Location = new System.Drawing.Point(180, 230);
|
||||
this.button2.Location = new System.Drawing.Point(180, 281);
|
||||
this.button2.Name = "button2";
|
||||
this.button2.Size = new System.Drawing.Size(99, 42);
|
||||
this.button2.TabIndex = 6;
|
||||
@@ -275,7 +299,7 @@
|
||||
// uicolor
|
||||
//
|
||||
this.uicolor.Image = global::RadioDJViewer.Properties.Resources.MdiWeatherNight;
|
||||
this.uicolor.Location = new System.Drawing.Point(572, 276);
|
||||
this.uicolor.Location = new System.Drawing.Point(572, 327);
|
||||
this.uicolor.Name = "uicolor";
|
||||
this.uicolor.Size = new System.Drawing.Size(28, 23);
|
||||
this.uicolor.TabIndex = 7;
|
||||
@@ -283,7 +307,7 @@
|
||||
//
|
||||
// pictureBox1
|
||||
//
|
||||
this.pictureBox1.Location = new System.Drawing.Point(13, 37);
|
||||
this.pictureBox1.Location = new System.Drawing.Point(13, 69);
|
||||
this.pictureBox1.Name = "pictureBox1";
|
||||
this.pictureBox1.Size = new System.Drawing.Size(180, 173);
|
||||
this.pictureBox1.TabIndex = 3;
|
||||
@@ -292,7 +316,7 @@
|
||||
// profile_drop_box
|
||||
//
|
||||
this.profile_drop_box.FormattingEnabled = true;
|
||||
this.profile_drop_box.Location = new System.Drawing.Point(62, 278);
|
||||
this.profile_drop_box.Location = new System.Drawing.Point(62, 329);
|
||||
this.profile_drop_box.Name = "profile_drop_box";
|
||||
this.profile_drop_box.Size = new System.Drawing.Size(217, 21);
|
||||
this.profile_drop_box.TabIndex = 8;
|
||||
@@ -300,7 +324,7 @@
|
||||
// profile_label
|
||||
//
|
||||
this.profile_label.AutoSize = true;
|
||||
this.profile_label.Location = new System.Drawing.Point(12, 281);
|
||||
this.profile_label.Location = new System.Drawing.Point(12, 332);
|
||||
this.profile_label.Name = "profile_label";
|
||||
this.profile_label.Size = new System.Drawing.Size(44, 13);
|
||||
this.profile_label.TabIndex = 9;
|
||||
@@ -309,37 +333,49 @@
|
||||
//
|
||||
// load_profile_button
|
||||
//
|
||||
this.load_profile_button.Location = new System.Drawing.Point(285, 276);
|
||||
this.load_profile_button.Location = new System.Drawing.Point(285, 327);
|
||||
this.load_profile_button.Name = "load_profile_button";
|
||||
this.load_profile_button.Size = new System.Drawing.Size(75, 23);
|
||||
this.load_profile_button.TabIndex = 10;
|
||||
this.load_profile_button.Text = "Load Profile";
|
||||
this.load_profile_button.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label7
|
||||
// time_label
|
||||
//
|
||||
this.label7.AutoSize = true;
|
||||
this.label7.Location = new System.Drawing.Point(19, 61);
|
||||
this.label7.Name = "label7";
|
||||
this.label7.Size = new System.Drawing.Size(357, 16);
|
||||
this.label7.TabIndex = 6;
|
||||
this.label7.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
|
||||
this.time_label.AutoSize = true;
|
||||
this.time_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Underline))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.time_label.Location = new System.Drawing.Point(20, 157);
|
||||
this.time_label.Name = "time_label";
|
||||
this.time_label.Size = new System.Drawing.Size(63, 24);
|
||||
this.time_label.TabIndex = 8;
|
||||
this.time_label.Text = "Time:";
|
||||
this.time_label.Click += new System.EventHandler(this.label9_Click);
|
||||
//
|
||||
// label8
|
||||
// label9
|
||||
//
|
||||
this.label8.AutoSize = true;
|
||||
this.label8.Location = new System.Drawing.Point(24, 118);
|
||||
this.label8.Name = "label8";
|
||||
this.label8.Size = new System.Drawing.Size(357, 16);
|
||||
this.label8.TabIndex = 7;
|
||||
this.label8.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
|
||||
this.label8.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
|
||||
this.label9.AutoSize = true;
|
||||
this.label9.Location = new System.Drawing.Point(17, 144);
|
||||
this.label9.Name = "label9";
|
||||
this.label9.Size = new System.Drawing.Size(357, 16);
|
||||
this.label9.TabIndex = 9;
|
||||
this.label9.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――";
|
||||
this.label9.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
|
||||
//
|
||||
// time_data_label
|
||||
//
|
||||
this.time_data_label.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
|
||||
this.time_data_label.Location = new System.Drawing.Point(97, 160);
|
||||
this.time_data_label.Name = "time_data_label";
|
||||
this.time_data_label.Size = new System.Drawing.Size(266, 17);
|
||||
this.time_data_label.TabIndex = 10;
|
||||
this.time_data_label.Text = "No Data";
|
||||
this.time_data_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
|
||||
//
|
||||
// Main
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(612, 339);
|
||||
this.ClientSize = new System.Drawing.Size(612, 388);
|
||||
this.Controls.Add(this.load_profile_button);
|
||||
this.Controls.Add(this.profile_label);
|
||||
this.Controls.Add(this.profile_drop_box);
|
||||
@@ -396,6 +432,9 @@
|
||||
private System.Windows.Forms.Button load_profile_button;
|
||||
private System.Windows.Forms.Label label7;
|
||||
private System.Windows.Forms.Label label8;
|
||||
private System.Windows.Forms.Label time_label;
|
||||
private System.Windows.Forms.Label label9;
|
||||
private System.Windows.Forms.Label time_data_label;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+630
-139
File diff suppressed because it is too large
Load Diff
@@ -120,17 +120,10 @@
|
||||
<metadata name="statusStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="toolStripStatusLabel2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
iVBORw0KGgoAAAANSUhEUgAAAIAAAACABAMAAAAxEHz4AAAABGdBTUEAALGPC/xhBQAAAANQTFRFJn8A
|
||||
Mx1isQAAAAlwSFlzAAAOvAAADrwBlbxySQAAAB9JREFUaN7twTEBAAAAwqD1T20IX6AAAAAAAAAAAD4D
|
||||
IIAAAT2Y3yoAAAAASUVORK5CYII=
|
||||
</value>
|
||||
</data>
|
||||
<metadata name="menuStrip2.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>247, 17</value>
|
||||
</metadata>
|
||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
||||
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>
|
||||
AAABAAEAIBgAAAEAIACIDAAAFgAAACgAAAAgAAAAMAAAAAEAIAAAAAAAAAwAAMMOAADDDgAAAAAAAAAA
|
||||
|
||||
@@ -23,6 +23,9 @@ namespace RadioDJViewer
|
||||
// Web server settings
|
||||
public bool WebServerEnabled { get; set; }
|
||||
public int WebServerPort { get; set; }
|
||||
// Clock visibility setting
|
||||
public bool ClockVisibilityEnabled { get; set; }
|
||||
public bool ToastNotificationsEnabled { get; set; }
|
||||
}
|
||||
|
||||
public static class ProfileStorage
|
||||
|
||||
@@ -1,19 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace RadioDJViewer
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
[DllImport("shell32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
|
||||
private static extern int SetCurrentProcessExplicitAppUserModelID(string AppID);
|
||||
|
||||
/// <summary>
|
||||
/// The main entry point for the application.
|
||||
/// </summary>
|
||||
[STAThread]
|
||||
static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
SetCurrentProcessExplicitAppUserModelID("RadioDJViewer.App");
|
||||
}
|
||||
catch { }
|
||||
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
Application.Run(new Main());
|
||||
|
||||
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("1.9.0")]
|
||||
[assembly: AssemblyFileVersion("1.9.0")]
|
||||
[assembly: AssemblyVersion("1.14.0")]
|
||||
[assembly: AssemblyFileVersion("1.14.0")]
|
||||
|
||||
@@ -21,7 +21,12 @@ namespace RadioDJViewer
|
||||
// In-memory cache for fast serving
|
||||
public static string CachedArtist = "";
|
||||
public static string CachedTitle = "";
|
||||
public static string CachedTime = "No Data";
|
||||
public static string CachedElapsed = "0";
|
||||
public static string CachedDuration = "0";
|
||||
public static bool CachedPaused = true;
|
||||
public static byte[] CachedImageBytes = null;
|
||||
public static bool CachedClockVisibility = false;
|
||||
|
||||
private readonly int port;
|
||||
private readonly Func<string> getArtist;
|
||||
@@ -112,14 +117,35 @@ namespace RadioDJViewer
|
||||
var html = htmlTemplate ?? "";
|
||||
// Replace placeholders with in-memory cache values
|
||||
html = html.Replace("{{ARTIST}}", WebUtility.HtmlEncode(CachedArtist ?? string.Empty))
|
||||
.Replace("{{TITLE}}", WebUtility.HtmlEncode(CachedTitle ?? string.Empty));
|
||||
.Replace("{{TITLE}}", WebUtility.HtmlEncode(CachedTitle ?? string.Empty))
|
||||
.Replace("{{TIME}}", WebUtility.HtmlEncode(CachedTime ?? string.Empty));
|
||||
var buf = Encoding.UTF8.GetBytes(html);
|
||||
resp.ContentType = "text/html; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/status.json", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var json = "{"
|
||||
+ $"\"artist\":\"{JsonEscape(CachedArtist ?? string.Empty)}\","
|
||||
+ $"\"title\":\"{JsonEscape(CachedTitle ?? string.Empty)}\","
|
||||
+ $"\"time\":\"{JsonEscape(CachedTime ?? "No Data")}\","
|
||||
+ $"\"elapsed\":\"{JsonEscape(CachedElapsed ?? "0")}\","
|
||||
+ $"\"duration\":\"{JsonEscape(CachedDuration ?? "0")}\","
|
||||
+ $"\"paused\":{(CachedPaused ? "true" : "false")},"
|
||||
+ $"\"clockVisible\":{(CachedClockVisibility ? "true" : "false")}"
|
||||
+ "}";
|
||||
var buf = Encoding.UTF8.GetBytes(json);
|
||||
resp.ContentType = "application/json; charset=utf-8";
|
||||
resp.Headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0";
|
||||
resp.Headers["Pragma"] = "no-cache";
|
||||
resp.Headers["Expires"] = "0";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/artist.txt", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedArtist ?? string.Empty);
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
@@ -127,11 +153,44 @@ namespace RadioDJViewer
|
||||
}
|
||||
else if (path.Equals("/title.txt", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedTitle ?? string.Empty);
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/time.txt", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedTime ?? "No Data");
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/elapsed", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedElapsed ?? "0");
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/duration", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedDuration ?? "0");
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/clock-visibility", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
ApplyNoCache(resp);
|
||||
var buf = Encoding.UTF8.GetBytes(CachedClockVisibility ? "true" : "false");
|
||||
resp.ContentType = "text/plain; charset=utf-8";
|
||||
resp.ContentLength64 = buf.Length;
|
||||
resp.OutputStream.Write(buf, 0, buf.Length);
|
||||
}
|
||||
else if (path.Equals("/style.css", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var buf = Encoding.UTF8.GetBytes(cssText ?? "");
|
||||
@@ -209,6 +268,24 @@ namespace RadioDJViewer
|
||||
}
|
||||
}
|
||||
|
||||
private static void ApplyNoCache(HttpListenerResponse resp)
|
||||
{
|
||||
resp.Headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0";
|
||||
resp.Headers["Pragma"] = "no-cache";
|
||||
resp.Headers["Expires"] = "0";
|
||||
}
|
||||
|
||||
private static string JsonEscape(string value)
|
||||
{
|
||||
if (string.IsNullOrEmpty(value))
|
||||
return string.Empty;
|
||||
|
||||
return value.Replace("\\", "\\\\")
|
||||
.Replace("\"", "\\\"")
|
||||
.Replace("\r", "\\r")
|
||||
.Replace("\n", "\\n");
|
||||
}
|
||||
|
||||
private string GetMimeTypeFromPath(string path)
|
||||
{
|
||||
var ext = Path.GetExtension(path).ToLowerInvariant();
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
|
||||
<!-- Song info (right) -->
|
||||
<div class="song-info">
|
||||
<div class="song-title">Loading...</div>
|
||||
<div class="song-artist">Loading...</div>
|
||||
<div class="song-title">{{TITLE}}</div>
|
||||
<div class="song-artist">{{ARTIST}}</div>
|
||||
<div class="song-time" id="song-time">{{TIME}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+125
-60
@@ -56,6 +56,16 @@
|
||||
this.label7 = new System.Windows.Forms.Label();
|
||||
this.textBox7 = new System.Windows.Forms.TextBox();
|
||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
||||
this.toast_box_group_box = new System.Windows.Forms.GroupBox();
|
||||
this.toast_check_box_enable = new System.Windows.Forms.CheckBox();
|
||||
this.toast_label = new System.Windows.Forms.Label();
|
||||
this.web_server_settings_groupbox = new System.Windows.Forms.GroupBox();
|
||||
this.clock_visibility_checkBox = new System.Windows.Forms.CheckBox();
|
||||
this.clock_label = new System.Windows.Forms.Label();
|
||||
this.web_server_port_textbox = new System.Windows.Forms.TextBox();
|
||||
this.web_server_port_label = new System.Windows.Forms.Label();
|
||||
this.web_server_label = new System.Windows.Forms.Label();
|
||||
this.web_server_checkbox = new System.Windows.Forms.CheckBox();
|
||||
this.label13 = new System.Windows.Forms.Label();
|
||||
this.comboBoxScrollSpeed = new System.Windows.Forms.ComboBox();
|
||||
this.textBoxPauseTime = new System.Windows.Forms.TextBox();
|
||||
@@ -64,14 +74,10 @@
|
||||
this.label9 = new System.Windows.Forms.Label();
|
||||
this.label8 = new System.Windows.Forms.Label();
|
||||
this.label12 = new System.Windows.Forms.Label();
|
||||
this.web_server_label = new System.Windows.Forms.Label();
|
||||
this.web_server_checkbox = new System.Windows.Forms.CheckBox();
|
||||
this.web_server_settings_groupbox = new System.Windows.Forms.GroupBox();
|
||||
this.web_server_port_label = new System.Windows.Forms.Label();
|
||||
this.web_server_port_textbox = new System.Windows.Forms.TextBox();
|
||||
this.groupBox1.SuspendLayout();
|
||||
this.groupBox3.SuspendLayout();
|
||||
this.groupBox2.SuspendLayout();
|
||||
this.toast_box_group_box.SuspendLayout();
|
||||
this.web_server_settings_groupbox.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
@@ -104,7 +110,7 @@
|
||||
//
|
||||
// ok_button_master
|
||||
//
|
||||
this.ok_button_master.Location = new System.Drawing.Point(65, 648);
|
||||
this.ok_button_master.Location = new System.Drawing.Point(54, 729);
|
||||
this.ok_button_master.Name = "ok_button_master";
|
||||
this.ok_button_master.Size = new System.Drawing.Size(157, 23);
|
||||
this.ok_button_master.TabIndex = 1;
|
||||
@@ -113,7 +119,7 @@
|
||||
//
|
||||
// button2
|
||||
//
|
||||
this.button2.Location = new System.Drawing.Point(305, 648);
|
||||
this.button2.Location = new System.Drawing.Point(302, 729);
|
||||
this.button2.Name = "button2";
|
||||
this.button2.Size = new System.Drawing.Size(157, 23);
|
||||
this.button2.TabIndex = 2;
|
||||
@@ -187,7 +193,7 @@
|
||||
//
|
||||
// button3
|
||||
//
|
||||
this.button3.Location = new System.Drawing.Point(71, 491);
|
||||
this.button3.Location = new System.Drawing.Point(62, 587);
|
||||
this.button3.Name = "button3";
|
||||
this.button3.Size = new System.Drawing.Size(120, 30);
|
||||
this.button3.TabIndex = 8;
|
||||
@@ -196,7 +202,7 @@
|
||||
//
|
||||
// button4
|
||||
//
|
||||
this.button4.Location = new System.Drawing.Point(316, 491);
|
||||
this.button4.Location = new System.Drawing.Point(309, 587);
|
||||
this.button4.Name = "button4";
|
||||
this.button4.Size = new System.Drawing.Size(120, 30);
|
||||
this.button4.TabIndex = 9;
|
||||
@@ -209,7 +215,7 @@
|
||||
this.groupBox3.Controls.Add(this.labelOutputFolderPath);
|
||||
this.groupBox3.Controls.Add(this.textBox5);
|
||||
this.groupBox3.Controls.Add(this.label10);
|
||||
this.groupBox3.Location = new System.Drawing.Point(31, 370);
|
||||
this.groupBox3.Location = new System.Drawing.Point(22, 413);
|
||||
this.groupBox3.Name = "groupBox3";
|
||||
this.groupBox3.Size = new System.Drawing.Size(482, 115);
|
||||
this.groupBox3.TabIndex = 12;
|
||||
@@ -302,6 +308,7 @@
|
||||
//
|
||||
// groupBox2
|
||||
//
|
||||
this.groupBox2.Controls.Add(this.toast_box_group_box);
|
||||
this.groupBox2.Controls.Add(this.web_server_settings_groupbox);
|
||||
this.groupBox2.Controls.Add(this.label13);
|
||||
this.groupBox2.Controls.Add(this.comboBoxScrollSpeed);
|
||||
@@ -329,11 +336,110 @@
|
||||
this.groupBox2.Controls.Add(this.comboBox1);
|
||||
this.groupBox2.Location = new System.Drawing.Point(12, 100);
|
||||
this.groupBox2.Name = "groupBox2";
|
||||
this.groupBox2.Size = new System.Drawing.Size(519, 527);
|
||||
this.groupBox2.Size = new System.Drawing.Size(519, 623);
|
||||
this.groupBox2.TabIndex = 3;
|
||||
this.groupBox2.TabStop = false;
|
||||
this.groupBox2.Text = "Profiles";
|
||||
//
|
||||
// toast_box_group_box
|
||||
//
|
||||
this.toast_box_group_box.Controls.Add(this.toast_check_box_enable);
|
||||
this.toast_box_group_box.Controls.Add(this.toast_label);
|
||||
this.toast_box_group_box.Location = new System.Drawing.Point(118, 534);
|
||||
this.toast_box_group_box.Name = "toast_box_group_box";
|
||||
this.toast_box_group_box.Size = new System.Drawing.Size(248, 42);
|
||||
this.toast_box_group_box.TabIndex = 4;
|
||||
this.toast_box_group_box.TabStop = false;
|
||||
this.toast_box_group_box.Text = "Windows Toast";
|
||||
//
|
||||
// toast_check_box_enable
|
||||
//
|
||||
this.toast_check_box_enable.AutoSize = true;
|
||||
this.toast_check_box_enable.Location = new System.Drawing.Point(130, 17);
|
||||
this.toast_check_box_enable.Name = "toast_check_box_enable";
|
||||
this.toast_check_box_enable.Size = new System.Drawing.Size(59, 17);
|
||||
this.toast_check_box_enable.TabIndex = 1;
|
||||
this.toast_check_box_enable.Text = "Enable";
|
||||
this.toast_check_box_enable.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// toast_label
|
||||
//
|
||||
this.toast_label.AutoSize = true;
|
||||
this.toast_label.Location = new System.Drawing.Point(40, 20);
|
||||
this.toast_label.Name = "toast_label";
|
||||
this.toast_label.Size = new System.Drawing.Size(73, 13);
|
||||
this.toast_label.TabIndex = 0;
|
||||
this.toast_label.Text = "Toast Control:";
|
||||
//
|
||||
// web_server_settings_groupbox
|
||||
//
|
||||
this.web_server_settings_groupbox.Controls.Add(this.clock_visibility_checkBox);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.clock_label);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_port_textbox);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_port_label);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_label);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_checkbox);
|
||||
this.web_server_settings_groupbox.Location = new System.Drawing.Point(31, 308);
|
||||
this.web_server_settings_groupbox.Name = "web_server_settings_groupbox";
|
||||
this.web_server_settings_groupbox.Size = new System.Drawing.Size(471, 99);
|
||||
this.web_server_settings_groupbox.TabIndex = 35;
|
||||
this.web_server_settings_groupbox.TabStop = false;
|
||||
this.web_server_settings_groupbox.Text = "Web Server Settings";
|
||||
//
|
||||
// clock_visibility_checkBox
|
||||
//
|
||||
this.clock_visibility_checkBox.AutoSize = true;
|
||||
this.clock_visibility_checkBox.Location = new System.Drawing.Point(119, 55);
|
||||
this.clock_visibility_checkBox.Name = "clock_visibility_checkBox";
|
||||
this.clock_visibility_checkBox.Size = new System.Drawing.Size(65, 17);
|
||||
this.clock_visibility_checkBox.TabIndex = 38;
|
||||
this.clock_visibility_checkBox.Text = "Enabled";
|
||||
this.clock_visibility_checkBox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// clock_label
|
||||
//
|
||||
this.clock_label.AutoSize = true;
|
||||
this.clock_label.Location = new System.Drawing.Point(44, 56);
|
||||
this.clock_label.Name = "clock_label";
|
||||
this.clock_label.Size = new System.Drawing.Size(76, 13);
|
||||
this.clock_label.TabIndex = 37;
|
||||
this.clock_label.Text = "Clock Visibility:";
|
||||
//
|
||||
// web_server_port_textbox
|
||||
//
|
||||
this.web_server_port_textbox.Location = new System.Drawing.Point(246, 19);
|
||||
this.web_server_port_textbox.Name = "web_server_port_textbox";
|
||||
this.web_server_port_textbox.Size = new System.Drawing.Size(77, 20);
|
||||
this.web_server_port_textbox.TabIndex = 36;
|
||||
//
|
||||
// web_server_port_label
|
||||
//
|
||||
this.web_server_port_label.AutoSize = true;
|
||||
this.web_server_port_label.Location = new System.Drawing.Point(211, 23);
|
||||
this.web_server_port_label.Name = "web_server_port_label";
|
||||
this.web_server_port_label.Size = new System.Drawing.Size(29, 13);
|
||||
this.web_server_port_label.TabIndex = 35;
|
||||
this.web_server_port_label.Text = "Port:";
|
||||
//
|
||||
// web_server_label
|
||||
//
|
||||
this.web_server_label.AutoSize = true;
|
||||
this.web_server_label.Location = new System.Drawing.Point(44, 24);
|
||||
this.web_server_label.Name = "web_server_label";
|
||||
this.web_server_label.Size = new System.Drawing.Size(67, 13);
|
||||
this.web_server_label.TabIndex = 33;
|
||||
this.web_server_label.Text = "Web Server:";
|
||||
//
|
||||
// web_server_checkbox
|
||||
//
|
||||
this.web_server_checkbox.AutoSize = true;
|
||||
this.web_server_checkbox.Location = new System.Drawing.Point(111, 23);
|
||||
this.web_server_checkbox.Name = "web_server_checkbox";
|
||||
this.web_server_checkbox.Size = new System.Drawing.Size(65, 17);
|
||||
this.web_server_checkbox.TabIndex = 34;
|
||||
this.web_server_checkbox.Text = "Enabled";
|
||||
this.web_server_checkbox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// label13
|
||||
//
|
||||
this.label13.AutoSize = true;
|
||||
@@ -407,59 +513,11 @@
|
||||
this.label12.TabIndex = 27;
|
||||
this.label12.Text = "Separating character format";
|
||||
//
|
||||
// web_server_label
|
||||
//
|
||||
this.web_server_label.AutoSize = true;
|
||||
this.web_server_label.Location = new System.Drawing.Point(44, 24);
|
||||
this.web_server_label.Name = "web_server_label";
|
||||
this.web_server_label.Size = new System.Drawing.Size(67, 13);
|
||||
this.web_server_label.TabIndex = 33;
|
||||
this.web_server_label.Text = "Web Server:";
|
||||
//
|
||||
// web_server_checkbox
|
||||
//
|
||||
this.web_server_checkbox.AutoSize = true;
|
||||
this.web_server_checkbox.Location = new System.Drawing.Point(111, 23);
|
||||
this.web_server_checkbox.Name = "web_server_checkbox";
|
||||
this.web_server_checkbox.Size = new System.Drawing.Size(65, 17);
|
||||
this.web_server_checkbox.TabIndex = 34;
|
||||
this.web_server_checkbox.Text = "Enabled";
|
||||
this.web_server_checkbox.UseVisualStyleBackColor = true;
|
||||
//
|
||||
// web_server_settings_groupbox
|
||||
//
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_port_textbox);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_port_label);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_label);
|
||||
this.web_server_settings_groupbox.Controls.Add(this.web_server_checkbox);
|
||||
this.web_server_settings_groupbox.Location = new System.Drawing.Point(31, 298);
|
||||
this.web_server_settings_groupbox.Name = "web_server_settings_groupbox";
|
||||
this.web_server_settings_groupbox.Size = new System.Drawing.Size(396, 58);
|
||||
this.web_server_settings_groupbox.TabIndex = 35;
|
||||
this.web_server_settings_groupbox.TabStop = false;
|
||||
this.web_server_settings_groupbox.Text = "Web Server Settings";
|
||||
//
|
||||
// web_server_port_label
|
||||
//
|
||||
this.web_server_port_label.AutoSize = true;
|
||||
this.web_server_port_label.Location = new System.Drawing.Point(211, 23);
|
||||
this.web_server_port_label.Name = "web_server_port_label";
|
||||
this.web_server_port_label.Size = new System.Drawing.Size(29, 13);
|
||||
this.web_server_port_label.TabIndex = 35;
|
||||
this.web_server_port_label.Text = "Port:";
|
||||
//
|
||||
// web_server_port_textbox
|
||||
//
|
||||
this.web_server_port_textbox.Location = new System.Drawing.Point(246, 19);
|
||||
this.web_server_port_textbox.Name = "web_server_port_textbox";
|
||||
this.web_server_port_textbox.Size = new System.Drawing.Size(77, 20);
|
||||
this.web_server_port_textbox.TabIndex = 36;
|
||||
//
|
||||
// Form1
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(572, 695);
|
||||
this.ClientSize = new System.Drawing.Size(542, 764);
|
||||
this.Controls.Add(this.groupBox2);
|
||||
this.Controls.Add(this.button2);
|
||||
this.Controls.Add(this.ok_button_master);
|
||||
@@ -473,6 +531,8 @@
|
||||
this.groupBox3.PerformLayout();
|
||||
this.groupBox2.ResumeLayout(false);
|
||||
this.groupBox2.PerformLayout();
|
||||
this.toast_box_group_box.ResumeLayout(false);
|
||||
this.toast_box_group_box.PerformLayout();
|
||||
this.web_server_settings_groupbox.ResumeLayout(false);
|
||||
this.web_server_settings_groupbox.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
@@ -523,5 +583,10 @@
|
||||
private System.Windows.Forms.CheckBox web_server_checkbox;
|
||||
private System.Windows.Forms.TextBox web_server_port_textbox;
|
||||
private System.Windows.Forms.Label web_server_port_label;
|
||||
private System.Windows.Forms.CheckBox clock_visibility_checkBox;
|
||||
private System.Windows.Forms.Label clock_label;
|
||||
private System.Windows.Forms.GroupBox toast_box_group_box;
|
||||
private System.Windows.Forms.CheckBox toast_check_box_enable;
|
||||
private System.Windows.Forms.Label toast_label;
|
||||
}
|
||||
}
|
||||
@@ -83,6 +83,9 @@ namespace RadioDJViewer
|
||||
{
|
||||
web_server_checkbox.Checked = profile.WebServerEnabled;
|
||||
web_server_port_textbox.Text = (profile.WebServerPort > 0 ? profile.WebServerPort : 8080).ToString();
|
||||
// Clock visibility setting
|
||||
clock_visibility_checkBox.Checked = profile.ClockVisibilityEnabled;
|
||||
toast_check_box_enable.Checked = profile.ToastNotificationsEnabled;
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
@@ -139,7 +142,10 @@ namespace RadioDJViewer
|
||||
MarqueeSeparator = separatingcharacterformatbox.Text,
|
||||
// Web server settings
|
||||
WebServerEnabled = web_server_checkbox.Checked,
|
||||
WebServerPort = int.TryParse(web_server_port_textbox.Text, out int wp) ? wp : 8080
|
||||
WebServerPort = int.TryParse(web_server_port_textbox.Text, out int wp) ? wp : 8080,
|
||||
// Clock visibility setting
|
||||
ClockVisibilityEnabled = clock_visibility_checkBox.Checked,
|
||||
ToastNotificationsEnabled = toast_check_box_enable.Checked
|
||||
};
|
||||
ProfileStorage.SaveProfile(profile);
|
||||
// Refresh profile list
|
||||
|
||||
+157
-114
@@ -1,128 +1,171 @@
|
||||
///////////////
|
||||
// PARAMETERS //
|
||||
///////////////
|
||||
(function () {
|
||||
var IMAGE_FILENAME = "Album-Art.png";
|
||||
var DEFAULT_REFRESH_RATE_MS = 1000;
|
||||
var DEFAULT_TIME_REFRESH_RATE_MS = 100;
|
||||
var currentArtist = getTextContent(".song-artist");
|
||||
var currentTitle = getTextContent(".song-title");
|
||||
var currentTime = getTextContent(".song-time");
|
||||
var refreshInterval = null;
|
||||
var timeRefreshInterval = null;
|
||||
var latestTimeRequestId = 0;
|
||||
var refreshRateMs = getRefreshRateMs();
|
||||
var timeRefreshRateMs = DEFAULT_TIME_REFRESH_RATE_MS;
|
||||
|
||||
const queryString = window.location.search;
|
||||
const urlParams = new URLSearchParams(queryString);
|
||||
const refreshRate = parseInt(urlParams.get("refreshrate")) || 6; // Default 6 seconds
|
||||
|
||||
// Image filename - update this if the backend changes the image path
|
||||
const IMAGE_FILENAME = "Album-Art.png";
|
||||
|
||||
//////////////////
|
||||
// GLOBAL STATE //
|
||||
//////////////////
|
||||
|
||||
let currentArtist = "";
|
||||
let currentTitle = "";
|
||||
let refreshInterval = null;
|
||||
|
||||
//////////////////
|
||||
// REFRESH LOGIC //
|
||||
//////////////////
|
||||
|
||||
/**
|
||||
* Fetches the artist and title from text files
|
||||
*/
|
||||
async function fetchSongData() {
|
||||
try {
|
||||
const artistResponse = await fetch("artist.txt");
|
||||
const titleResponse = await fetch("title.txt");
|
||||
|
||||
if (!artistResponse.ok || !titleResponse.ok) {
|
||||
console.error("Failed to fetch song data");
|
||||
return null;
|
||||
function getTextContent(selector) {
|
||||
var element = document.querySelector(selector);
|
||||
if (!element || typeof element.textContent !== "string") {
|
||||
return "";
|
||||
}
|
||||
|
||||
const artist = (await artistResponse.text()).trim();
|
||||
const title = (await titleResponse.text()).trim();
|
||||
|
||||
return { artist, title };
|
||||
} catch (error) {
|
||||
console.error("Error fetching song data:", error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the DOM elements if the song data has changed
|
||||
*/
|
||||
function updateSongDisplay(artist, title) {
|
||||
const titleElement = document.querySelector(".song-title");
|
||||
const artistElement = document.querySelector(".song-artist");
|
||||
|
||||
let trackChanged = false;
|
||||
|
||||
// Only update if data has actually changed
|
||||
if (title !== currentTitle) {
|
||||
currentTitle = title;
|
||||
titleElement.classList.add("updating");
|
||||
titleElement.textContent = title || "Unknown Title";
|
||||
trackChanged = true;
|
||||
setTimeout(() => {
|
||||
titleElement.classList.remove("updating");
|
||||
}, 400);
|
||||
return trimText(element.textContent);
|
||||
}
|
||||
|
||||
if (artist !== currentArtist) {
|
||||
currentArtist = artist;
|
||||
artistElement.classList.add("updating");
|
||||
artistElement.textContent = artist || "Unknown Artist";
|
||||
trackChanged = true;
|
||||
setTimeout(() => {
|
||||
artistElement.classList.remove("updating");
|
||||
}, 400);
|
||||
function trimText(value) {
|
||||
return String(value || "").replace(/^\s+|\s+$/g, "");
|
||||
}
|
||||
|
||||
// Return whether track changed (to trigger image update)
|
||||
return trackChanged;
|
||||
}
|
||||
function getRefreshRateMs() {
|
||||
var match = /(?:\?|&)refreshrate=([^&]+)/i.exec(window.location.search || "");
|
||||
var seconds = match ? parseFloat(decodeURIComponent(match[1])) : 1;
|
||||
if (!isFinite(seconds) || seconds <= 0) {
|
||||
seconds = 1;
|
||||
}
|
||||
var interval = Math.round(seconds * 1000);
|
||||
if (interval < 250) {
|
||||
interval = 250;
|
||||
}
|
||||
return interval;
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates both the album art and background image with cache-busting timestamp
|
||||
* Only called when track actually changes
|
||||
*/
|
||||
function updateAlbumArt() {
|
||||
const albumArt = document.querySelector(".album-art");
|
||||
const backgroundImage = document.querySelector(".background-image");
|
||||
const timestamp = new Date().getTime();
|
||||
const imageUrl = `${IMAGE_FILENAME}?v=${timestamp}`;
|
||||
|
||||
albumArt.src = imageUrl;
|
||||
backgroundImage.src = imageUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Main refresh function - fetches data and updates if changed
|
||||
*/
|
||||
async function refresh() {
|
||||
const data = await fetchSongData();
|
||||
if (data) {
|
||||
const trackChanged = updateSongDisplay(data.artist, data.title);
|
||||
// Only update images when track actually changes
|
||||
if (trackChanged) {
|
||||
updateAlbumArt();
|
||||
function fetchText(path, fallbackValue, callback) {
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", path + "?v=" + new Date().getTime(), true);
|
||||
xhr.setRequestHeader("Cache-Control", "no-cache");
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState !== 4) {
|
||||
return;
|
||||
}
|
||||
if (xhr.status >= 200 && xhr.status < 300) {
|
||||
callback(trimText(xhr.responseText));
|
||||
return;
|
||||
}
|
||||
callback(fallbackValue);
|
||||
};
|
||||
xhr.onerror = function () {
|
||||
callback(fallbackValue);
|
||||
};
|
||||
try {
|
||||
xhr.send(null);
|
||||
} catch (e) {
|
||||
callback(fallbackValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////
|
||||
// INITIALIZE //
|
||||
///////////////
|
||||
function updateSongDisplay(data) {
|
||||
var titleElement = document.querySelector(".song-title");
|
||||
var artistElement = document.querySelector(".song-artist");
|
||||
var trackChanged = false;
|
||||
var nextTitle;
|
||||
var nextArtist;
|
||||
|
||||
function init() {
|
||||
// Load initial data immediately
|
||||
refresh();
|
||||
if (!titleElement || !artistElement || !data) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Set up refresh interval based on URL parameter or default
|
||||
refreshInterval = setInterval(refresh, refreshRate * 1000);
|
||||
nextTitle = trimText(data.title || "");
|
||||
nextArtist = trimText(data.artist || "");
|
||||
|
||||
console.log(`Radio DJ widget initialized - refreshing every ${refreshRate}s`);
|
||||
}
|
||||
if (nextTitle !== currentTitle) {
|
||||
currentTitle = nextTitle;
|
||||
titleElement.classList.add("updating");
|
||||
titleElement.textContent = currentTitle || "Unknown Title";
|
||||
trackChanged = true;
|
||||
setTimeout(function () {
|
||||
titleElement.classList.remove("updating");
|
||||
}, 400);
|
||||
}
|
||||
|
||||
// Start when DOM is ready
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", init);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
if (nextArtist !== currentArtist) {
|
||||
currentArtist = nextArtist;
|
||||
artistElement.classList.add("updating");
|
||||
artistElement.textContent = currentArtist || "Unknown Artist";
|
||||
trackChanged = true;
|
||||
setTimeout(function () {
|
||||
artistElement.classList.remove("updating");
|
||||
}, 400);
|
||||
}
|
||||
|
||||
return trackChanged;
|
||||
}
|
||||
|
||||
function updateTimeDisplay(nextTime) {
|
||||
var timeElement = document.querySelector(".song-time");
|
||||
var normalizedTime = trimText(nextTime || "No Data") || "No Data";
|
||||
if (!timeElement) {
|
||||
return;
|
||||
}
|
||||
if (normalizedTime !== currentTime) {
|
||||
currentTime = normalizedTime;
|
||||
timeElement.textContent = currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
function updateAlbumArt() {
|
||||
var albumArt = document.querySelector(".album-art");
|
||||
var backgroundImage = document.querySelector(".background-image");
|
||||
var imageUrl = IMAGE_FILENAME + "?v=" + new Date().getTime();
|
||||
if (!albumArt || !backgroundImage) {
|
||||
return;
|
||||
}
|
||||
albumArt.src = imageUrl;
|
||||
backgroundImage.src = imageUrl;
|
||||
}
|
||||
|
||||
function setClockVisibility(visible) {
|
||||
var timeElement = document.querySelector(".song-time");
|
||||
if (!timeElement) {
|
||||
return;
|
||||
}
|
||||
timeElement.style.display = visible ? "" : "none";
|
||||
}
|
||||
|
||||
function refreshMetadata() {
|
||||
fetchText("artist.txt", currentArtist || "", function (artist) {
|
||||
fetchText("title.txt", currentTitle || "", function (title) {
|
||||
fetchText("clock-visibility", "true", function (clockVisible) {
|
||||
var trackChanged = updateSongDisplay({
|
||||
artist: artist,
|
||||
title: title
|
||||
});
|
||||
setClockVisibility(String(clockVisible || "false").toLowerCase() === "true");
|
||||
if (trackChanged) {
|
||||
updateAlbumArt();
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function refreshTime() {
|
||||
var requestId = latestTimeRequestId + 1;
|
||||
latestTimeRequestId = requestId;
|
||||
fetchText("time.txt", currentTime || "No Data", function (nextTime) {
|
||||
if (requestId !== latestTimeRequestId) {
|
||||
return;
|
||||
}
|
||||
updateTimeDisplay(nextTime);
|
||||
});
|
||||
}
|
||||
|
||||
function init() {
|
||||
refreshMetadata();
|
||||
refreshTime();
|
||||
refreshInterval = window.setInterval(refreshMetadata, refreshRateMs);
|
||||
timeRefreshInterval = window.setInterval(refreshTime, timeRefreshRateMs);
|
||||
}
|
||||
|
||||
if (document.readyState === "loading") {
|
||||
document.addEventListener("DOMContentLoaded", init);
|
||||
} else {
|
||||
init();
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -127,6 +127,21 @@ body {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Song time display (underneath artist) */
|
||||
.song-time {
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #cccccc;
|
||||
text-shadow: 1px 1px 3px rgba(0, 0, 0, 0.9);
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
letter-spacing: 0px;
|
||||
line-height: 1.1;
|
||||
opacity: 0.9;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* Smooth fade animation for updates */
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
@@ -141,3 +156,22 @@ body {
|
||||
.song-artist.updating {
|
||||
animation: fadeIn 0.4s ease-in-out;
|
||||
}
|
||||
|
||||
/* Clock section - positioned at bottom of page */
|
||||
.clock-section {
|
||||
width: 100%;
|
||||
margin-top: 20px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.digital-clock {
|
||||
font-size: 48px;
|
||||
font-weight: 300;
|
||||
color: #ffffff;
|
||||
text-shadow: 2px 2px 5px rgba(0, 0, 0, 0.9);
|
||||
font-family: 'Courier New', monospace;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user