10 Commits
Author SHA1 Message Date
minster586 30f2c38763 Reworked UI and added SMTC Output (Works with Nutty SMTC bridge) 2026-10-24 21:50:54 -04:00
minster586 3b9437b4cb So there was a small subtle issue with the notifications on Windows toast where the image wouldn't render correctly I changed it to the hero style which shows the album art way better 2026-09-10 17:02:26 -04:00
minster586 e74fa6246a Removed an issue of it flickering that title name and any of the labels also removed scrolling and the marquee function as it wasn't working as originally intended 2026-09-05 20:15:57 -04:00
minster586 0f43ffe5d7 Renamed some of the labels for the input data and fix that also had an issue where sometimes the UI would not show the data but the output was not messed with 2026-09-05 00:48:31 -04:00
minster586 b0c37b815d Fixed issue with About me version not showing correctly for the right version 2026-09-05 00:26:36 -04:00
minster586 f1c4de4523 Moved the UI around in the settings 2026-09-05 00:16:06 -04:00
minster586 94e4c89776 So I also tried to work on the UI again and for some odd reason I can't seem to get it the way that I want where it will show a separating character at the end of the text and only scroll if required it likes to cut it off so my whole thing is oh well but there is that I think everything should be good 2026-09-05 00:15:00 -04:00
minster586 75a378e948 Toas will not show No title or artist flags 2026-09-04 23:44:06 -04:00
minster586 7b67c03270 Added in Windows toast notifications 2026-09-03 00:20:33 -04:00
minster586 34c80bda7b Set Time Clock 2026-07-01 22:37:18 -04:00
13 changed files with 2174 additions and 809 deletions
+126 -80
View File
@@ -43,9 +43,14 @@
this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.groupBox1 = new System.Windows.Forms.GroupBox();
this.label6 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
this.time_data_label = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.time_label = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.album_data = new System.Windows.Forms.Label();
this.artist_data = new System.Windows.Forms.Label();
this.title_data = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
@@ -56,8 +61,6 @@
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.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, 309);
this.statusStrip1.Name = "statusStrip1";
this.statusStrip1.Size = new System.Drawing.Size(612, 25);
this.statusStrip1.Size = new System.Drawing.Size(780, 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(344, 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(344, 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(780, 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,63 +172,123 @@
// 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);
this.groupBox1.Controls.Add(this.label5);
this.groupBox1.Controls.Add(this.label4);
this.groupBox1.Controls.Add(this.album_data);
this.groupBox1.Controls.Add(this.artist_data);
this.groupBox1.Controls.Add(this.title_data);
this.groupBox1.Controls.Add(this.label3);
this.groupBox1.Controls.Add(this.label2);
this.groupBox1.Controls.Add(this.label1);
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(569, 205);
this.groupBox1.TabIndex = 4;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "Song Info";
//
// label6
// time_data_label
//
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.Name = "label6";
this.label6.Size = new System.Drawing.Size(266, 17);
this.label6.TabIndex = 5;
this.label6.Text = "No album";
this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
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(101, 159);
this.time_data_label.Name = "time_data_label";
this.time_data_label.Size = new System.Drawing.Size(437, 21);
this.time_data_label.TabIndex = 10;
this.time_data_label.Text = "No Data";
this.time_data_label.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label5
// label9
//
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.Name = "label5";
this.label5.Size = new System.Drawing.Size(266, 17);
this.label5.TabIndex = 4;
this.label5.Text = "No artist";
this.label5.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(17, 144);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(539, 16);
this.label9.TabIndex = 9;
this.label9.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label9.TextAlign = System.Drawing.ContentAlignment.BottomCenter;
//
// label4
// time_label
//
this.label4.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.label4.Location = new System.Drawing.Point(99, 33);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(266, 16);
this.label4.TabIndex = 3;
this.label4.Text = "No title";
this.label4.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
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
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(20, 103);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(539, 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(539, 16);
this.label7.TabIndex = 6;
this.label7.Text = "――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――";
this.label7.Click += new System.EventHandler(this.label7_Click_1);
//
// album_data
//
this.album_data.AutoEllipsis = true;
this.album_data.AutoSize = false;
this.album_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.album_data.Location = new System.Drawing.Point(100, 119);
this.album_data.Name = "album_data";
this.album_data.Size = new System.Drawing.Size(443, 19);
this.album_data.TabIndex = 5;
this.album_data.Text = "No album";
this.album_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// artist_data
//
this.artist_data.AutoEllipsis = true;
this.artist_data.AutoSize = false;
this.artist_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.artist_data.Location = new System.Drawing.Point(99, 76);
this.artist_data.Name = "artist_data";
this.artist_data.Size = new System.Drawing.Size(433, 23);
this.artist_data.TabIndex = 4;
this.artist_data.Text = "No artist";
this.artist_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// title_data
//
this.title_data.AutoEllipsis = true;
this.title_data.AutoSize = false;
this.title_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.title_data.Location = new System.Drawing.Point(97, 33);
this.title_data.Name = "title_data";
this.title_data.Size = new System.Drawing.Size(443, 20);
this.title_data.TabIndex = 3;
this.title_data.Text = "No title";
this.title_data.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label3
//
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 +298,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 +316,7 @@
//
// button1
//
this.button1.Location = new System.Drawing.Point(62, 230);
this.button1.Location = new System.Drawing.Point(425, 254);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(99, 42);
this.button1.TabIndex = 5;
@@ -264,7 +326,7 @@
//
// button2
//
this.button2.Location = new System.Drawing.Point(180, 230);
this.button2.Location = new System.Drawing.Point(577, 253);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(99, 42);
this.button2.TabIndex = 6;
@@ -275,7 +337,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(740, 262);
this.uicolor.Name = "uicolor";
this.uicolor.Size = new System.Drawing.Size(28, 23);
this.uicolor.TabIndex = 7;
@@ -283,7 +345,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 +354,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, 268);
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 +362,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, 272);
this.profile_label.Name = "profile_label";
this.profile_label.Size = new System.Drawing.Size(44, 13);
this.profile_label.TabIndex = 9;
@@ -309,37 +371,18 @@
//
// load_profile_button
//
this.load_profile_button.Location = new System.Drawing.Point(285, 276);
this.load_profile_button.Location = new System.Drawing.Point(292, 267);
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
//
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 = "――――――――――――――――――――――――――――――――――――――――――――――――――";
//
// label8
//
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;
//
// 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(780, 335);
this.Controls.Add(this.load_profile_button);
this.Controls.Add(this.profile_label);
this.Controls.Add(this.profile_drop_box);
@@ -379,9 +422,9 @@
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label album_data;
private System.Windows.Forms.Label artist_data;
private System.Windows.Forms.Label title_data;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
@@ -396,6 +439,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;
}
}
+1408 -407
View File
File diff suppressed because it is too large Load Diff
+1 -8
View File
@@ -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
+4
View File
@@ -23,6 +23,10 @@ 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 bool SmtcEnabled { get; set; }
}
public static class ProfileStorage
+10 -3
View File
@@ -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());
+2 -2
View File
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("1.9.0")]
[assembly: AssemblyFileVersion("1.9.0")]
[assembly: AssemblyVersion("1.15.0")]
[assembly: AssemblyFileVersion("1.15.0")]
+78 -1
View File
@@ -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();
+3 -2
View File
@@ -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>
+302 -158
View File
@@ -54,25 +54,42 @@
this.button6 = new System.Windows.Forms.Button();
this.label6 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label();
this.textBox7 = new System.Windows.Forms.TextBox();
this.polling_rate_textbox = new System.Windows.Forms.TextBox();
this.groupBox2 = new System.Windows.Forms.GroupBox();
this.label13 = new System.Windows.Forms.Label();
this.comboBoxScrollSpeed = new System.Windows.Forms.ComboBox();
this.textBoxPauseTime = new System.Windows.Forms.TextBox();
this.separatingcharacterformatbox = new System.Windows.Forms.TextBox();
this.textBox9 = new System.Windows.Forms.TextBox();
this.label9 = new System.Windows.Forms.Label();
this.label8 = new System.Windows.Forms.Label();
this.label12 = new System.Windows.Forms.Label();
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.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.label12 = new System.Windows.Forms.Label();
this.tab_controls = new System.Windows.Forms.TabControl();
this.settings_tab_page = new System.Windows.Forms.TabPage();
this.output_settings_tab_page = new System.Windows.Forms.TabPage();
this.connection_settings_box = new System.Windows.Forms.GroupBox();
this.notice_one = new System.Windows.Forms.Label();
this.misc_tab_page = new System.Windows.Forms.TabPage();
this.groupBox4 = new System.Windows.Forms.GroupBox();
this.smtc_enable_label = new System.Windows.Forms.Label();
this.smtc_check_box = new System.Windows.Forms.CheckBox();
this.notice_two = new System.Windows.Forms.Label();
this.loaded_profile_label = new System.Windows.Forms.Label();
this.profile_loaded_data = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout();
this.groupBox3.SuspendLayout();
this.groupBox2.SuspendLayout();
this.toast_box_group_box.SuspendLayout();
this.web_server_settings_groupbox.SuspendLayout();
this.tab_controls.SuspendLayout();
this.settings_tab_page.SuspendLayout();
this.output_settings_tab_page.SuspendLayout();
this.connection_settings_box.SuspendLayout();
this.misc_tab_page.SuspendLayout();
this.groupBox4.SuspendLayout();
this.SuspendLayout();
//
// groupBox1
@@ -104,7 +121,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, 684);
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 +130,7 @@
//
// button2
//
this.button2.Location = new System.Drawing.Point(305, 648);
this.button2.Location = new System.Drawing.Point(301, 684);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(157, 23);
this.button2.TabIndex = 2;
@@ -140,7 +157,7 @@
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(20, 100);
this.label3.Location = new System.Drawing.Point(20, 27);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(57, 13);
this.label3.TabIndex = 2;
@@ -148,46 +165,46 @@
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(120, 97);
this.textBox2.Location = new System.Drawing.Point(103, 24);
this.textBox2.Name = "textBox2";
this.textBox2.Size = new System.Drawing.Size(290, 20);
this.textBox2.Size = new System.Drawing.Size(122, 20);
this.textBox2.TabIndex = 3;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(20, 135);
this.label4.Location = new System.Drawing.Point(20, 60);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(26, 13);
this.label4.Size = new System.Drawing.Size(29, 13);
this.label4.TabIndex = 4;
this.label4.Text = "Port";
this.label4.Text = "Port:";
//
// textBox3
//
this.textBox3.Location = new System.Drawing.Point(120, 132);
this.textBox3.Location = new System.Drawing.Point(103, 54);
this.textBox3.Name = "textBox3";
this.textBox3.Size = new System.Drawing.Size(290, 20);
this.textBox3.Size = new System.Drawing.Size(122, 20);
this.textBox3.TabIndex = 5;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(20, 170);
this.label5.Location = new System.Drawing.Point(20, 88);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(53, 13);
this.label5.Size = new System.Drawing.Size(56, 13);
this.label5.TabIndex = 6;
this.label5.Text = "Password";
this.label5.Text = "Password:";
//
// textBox4
//
this.textBox4.Location = new System.Drawing.Point(120, 167);
this.textBox4.Location = new System.Drawing.Point(103, 83);
this.textBox4.Name = "textBox4";
this.textBox4.Size = new System.Drawing.Size(290, 20);
this.textBox4.Size = new System.Drawing.Size(122, 20);
this.textBox4.TabIndex = 7;
//
// button3
//
this.button3.Location = new System.Drawing.Point(71, 491);
this.button3.Location = new System.Drawing.Point(66, 537);
this.button3.Name = "button3";
this.button3.Size = new System.Drawing.Size(120, 30);
this.button3.TabIndex = 8;
@@ -196,7 +213,7 @@
//
// button4
//
this.button4.Location = new System.Drawing.Point(316, 491);
this.button4.Location = new System.Drawing.Point(279, 537);
this.button4.Name = "button4";
this.button4.Size = new System.Drawing.Size(120, 30);
this.button4.TabIndex = 9;
@@ -205,20 +222,21 @@
//
// groupBox3
//
this.groupBox3.Controls.Add(this.notice_one);
this.groupBox3.Controls.Add(this.buttonSelectOutputFolder);
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(74, 127);
this.groupBox3.Name = "groupBox3";
this.groupBox3.Size = new System.Drawing.Size(482, 115);
this.groupBox3.Size = new System.Drawing.Size(256, 229);
this.groupBox3.TabIndex = 12;
this.groupBox3.TabStop = false;
this.groupBox3.Text = "Output Setting";
//
// buttonSelectOutputFolder
//
this.buttonSelectOutputFolder.Location = new System.Drawing.Point(20, 36);
this.buttonSelectOutputFolder.Location = new System.Drawing.Point(63, 58);
this.buttonSelectOutputFolder.Name = "buttonSelectOutputFolder";
this.buttonSelectOutputFolder.Size = new System.Drawing.Size(140, 23);
this.buttonSelectOutputFolder.TabIndex = 17;
@@ -228,23 +246,24 @@
// labelOutputFolderPath
//
this.labelOutputFolderPath.AutoSize = true;
this.labelOutputFolderPath.Location = new System.Drawing.Point(166, 41);
this.labelOutputFolderPath.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelOutputFolderPath.Location = new System.Drawing.Point(78, 89);
this.labelOutputFolderPath.Name = "labelOutputFolderPath";
this.labelOutputFolderPath.Size = new System.Drawing.Size(93, 13);
this.labelOutputFolderPath.Size = new System.Drawing.Size(111, 13);
this.labelOutputFolderPath.TabIndex = 16;
this.labelOutputFolderPath.Text = "No folder selected";
//
// textBox5
//
this.textBox5.Location = new System.Drawing.Point(149, 80);
this.textBox5.Location = new System.Drawing.Point(159, 29);
this.textBox5.Name = "textBox5";
this.textBox5.Size = new System.Drawing.Size(247, 20);
this.textBox5.Size = new System.Drawing.Size(83, 20);
this.textBox5.TabIndex = 16;
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(17, 83);
this.label10.Location = new System.Drawing.Point(19, 32);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(126, 13);
this.label10.TabIndex = 15;
@@ -268,17 +287,17 @@
//
// button6
//
this.button6.Location = new System.Drawing.Point(23, 269);
this.button6.Location = new System.Drawing.Point(53, 149);
this.button6.Name = "button6";
this.button6.Size = new System.Drawing.Size(140, 23);
this.button6.TabIndex = 18;
this.button6.Text = "Select Main Image Folder";
this.button6.Text = "Main Image Folder";
this.button6.UseVisualStyleBackColor = true;
//
// label6
//
this.label6.AutoSize = true;
this.label6.Location = new System.Drawing.Point(169, 274);
this.label6.Location = new System.Drawing.Point(78, 181);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(93, 13);
this.label6.TabIndex = 19;
@@ -287,125 +306,116 @@
// label7
//
this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(20, 211);
this.label7.Location = new System.Drawing.Point(20, 117);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(124, 13);
this.label7.Size = new System.Drawing.Size(127, 13);
this.label7.TabIndex = 20;
this.label7.Text = "Polling Rate (in seconds)";
this.label7.Text = "Polling Rate (in seconds):";
//
// textBox7
// polling_rate_textbox
//
this.textBox7.Location = new System.Drawing.Point(150, 208);
this.textBox7.Name = "textBox7";
this.textBox7.Size = new System.Drawing.Size(63, 20);
this.textBox7.TabIndex = 21;
this.polling_rate_textbox.Location = new System.Drawing.Point(176, 114);
this.polling_rate_textbox.Name = "polling_rate_textbox";
this.polling_rate_textbox.Size = new System.Drawing.Size(49, 20);
this.polling_rate_textbox.TabIndex = 21;
//
// groupBox2
//
this.groupBox2.Controls.Add(this.web_server_settings_groupbox);
this.groupBox2.Controls.Add(this.label13);
this.groupBox2.Controls.Add(this.comboBoxScrollSpeed);
this.groupBox2.Controls.Add(this.textBoxPauseTime);
this.groupBox2.Controls.Add(this.separatingcharacterformatbox);
this.groupBox2.Controls.Add(this.profile_loaded_data);
this.groupBox2.Controls.Add(this.loaded_profile_label);
this.groupBox2.Controls.Add(this.tab_controls);
this.groupBox2.Controls.Add(this.textBox6);
this.groupBox2.Controls.Add(this.label11);
this.groupBox2.Controls.Add(this.textBox9);
this.groupBox2.Controls.Add(this.label9);
this.groupBox2.Controls.Add(this.label8);
this.groupBox2.Controls.Add(this.textBox7);
this.groupBox2.Controls.Add(this.label7);
this.groupBox2.Controls.Add(this.label6);
this.groupBox2.Controls.Add(this.button6);
this.groupBox2.Controls.Add(this.groupBox3);
this.groupBox2.Controls.Add(this.button4);
this.groupBox2.Controls.Add(this.button3);
this.groupBox2.Controls.Add(this.textBox4);
this.groupBox2.Controls.Add(this.label5);
this.groupBox2.Controls.Add(this.textBox3);
this.groupBox2.Controls.Add(this.label4);
this.groupBox2.Controls.Add(this.textBox2);
this.groupBox2.Controls.Add(this.label3);
this.groupBox2.Controls.Add(this.label2);
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, 578);
this.groupBox2.TabIndex = 3;
this.groupBox2.TabStop = false;
this.groupBox2.Text = "Profiles";
//
// label13
// toast_box_group_box
//
this.label13.AutoSize = true;
this.label13.Location = new System.Drawing.Point(20, 240);
this.label13.Name = "label13";
this.label13.Size = new System.Drawing.Size(142, 13);
this.label13.TabIndex = 32;
this.label13.Text = "Separating Character Format";
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(20, 22);
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";
//
// comboBoxScrollSpeed
// toast_check_box_enable
//
this.comboBoxScrollSpeed.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.comboBoxScrollSpeed.FormattingEnabled = true;
this.comboBoxScrollSpeed.Items.AddRange(new object[] {
"Very Slow",
"Slow",
"Medium",
"Fast",
"Very Fast"});
this.comboBoxScrollSpeed.Location = new System.Drawing.Point(382, 207);
this.comboBoxScrollSpeed.Name = "comboBoxScrollSpeed";
this.comboBoxScrollSpeed.Size = new System.Drawing.Size(97, 21);
this.comboBoxScrollSpeed.TabIndex = 29;
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;
//
// textBoxPauseTime
// toast_label
//
this.textBoxPauseTime.Location = new System.Drawing.Point(382, 237);
this.textBoxPauseTime.Name = "textBoxPauseTime";
this.textBoxPauseTime.Size = new System.Drawing.Size(97, 20);
this.textBoxPauseTime.TabIndex = 30;
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:";
//
// separatingcharacterformatbox
// web_server_settings_groupbox
//
this.separatingcharacterformatbox.Location = new System.Drawing.Point(164, 237);
this.separatingcharacterformatbox.Name = "separatingcharacterformatbox";
this.separatingcharacterformatbox.Size = new System.Drawing.Size(49, 20);
this.separatingcharacterformatbox.TabIndex = 31;
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(80, 26);
this.web_server_settings_groupbox.Name = "web_server_settings_groupbox";
this.web_server_settings_groupbox.Size = new System.Drawing.Size(236, 95);
this.web_server_settings_groupbox.TabIndex = 35;
this.web_server_settings_groupbox.TabStop = false;
this.web_server_settings_groupbox.Text = "Web Server Settings";
//
// textBox9
// clock_visibility_checkBox
//
this.textBox9.Location = new System.Drawing.Point(382, 237);
this.textBox9.Name = "textBox9";
this.textBox9.Size = new System.Drawing.Size(97, 20);
this.textBox9.TabIndex = 25;
this.clock_visibility_checkBox.AutoSize = true;
this.clock_visibility_checkBox.Location = new System.Drawing.Point(156, 67);
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;
//
// label9
// clock_label
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(239, 240);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(119, 13);
this.label9.TabIndex = 24;
this.label9.Text = "Pause time (in seconds)";
this.clock_label.AutoSize = true;
this.clock_label.Location = new System.Drawing.Point(44, 68);
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:";
//
// label8
// web_server_port_textbox
//
this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(239, 211);
this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(127, 13);
this.label8.TabIndex = 22;
this.label8.Text = "Scroll Speed (in Main UI)";
this.label8.Click += new System.EventHandler(this.label8_Click);
this.web_server_port_textbox.Location = new System.Drawing.Point(139, 42);
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;
//
// label12
// web_server_port_label
//
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(20, 240);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(138, 13);
this.label12.TabIndex = 27;
this.label12.Text = "Separating character format";
this.web_server_port_label.AutoSize = true;
this.web_server_port_label.Location = new System.Drawing.Point(45, 46);
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
//
@@ -419,47 +429,161 @@
// web_server_checkbox
//
this.web_server_checkbox.AutoSize = true;
this.web_server_checkbox.Location = new System.Drawing.Point(111, 23);
this.web_server_checkbox.Location = new System.Drawing.Point(154, 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
// label12
//
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";
this.label12.AutoSize = true;
this.label12.Location = new System.Drawing.Point(20, 240);
this.label12.Name = "label12";
this.label12.Size = new System.Drawing.Size(138, 13);
this.label12.TabIndex = 27;
this.label12.Text = "Separating character format";
//
// web_server_port_label
// tab_controls
//
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:";
this.tab_controls.Controls.Add(this.settings_tab_page);
this.tab_controls.Controls.Add(this.output_settings_tab_page);
this.tab_controls.Controls.Add(this.misc_tab_page);
this.tab_controls.Location = new System.Drawing.Point(42, 133);
this.tab_controls.Name = "tab_controls";
this.tab_controls.SelectedIndex = 0;
this.tab_controls.Size = new System.Drawing.Size(423, 398);
this.tab_controls.TabIndex = 22;
//
// web_server_port_textbox
// settings_tab_page
//
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;
this.settings_tab_page.Controls.Add(this.connection_settings_box);
this.settings_tab_page.Location = new System.Drawing.Point(4, 22);
this.settings_tab_page.Name = "settings_tab_page";
this.settings_tab_page.Padding = new System.Windows.Forms.Padding(3);
this.settings_tab_page.Size = new System.Drawing.Size(415, 372);
this.settings_tab_page.TabIndex = 0;
this.settings_tab_page.Text = "Profile Settings";
this.settings_tab_page.UseVisualStyleBackColor = true;
//
// output_settings_tab_page
//
this.output_settings_tab_page.Controls.Add(this.web_server_settings_groupbox);
this.output_settings_tab_page.Controls.Add(this.groupBox3);
this.output_settings_tab_page.Location = new System.Drawing.Point(4, 22);
this.output_settings_tab_page.Name = "output_settings_tab_page";
this.output_settings_tab_page.Padding = new System.Windows.Forms.Padding(3);
this.output_settings_tab_page.Size = new System.Drawing.Size(415, 372);
this.output_settings_tab_page.TabIndex = 1;
this.output_settings_tab_page.Text = "Output Settings";
this.output_settings_tab_page.UseVisualStyleBackColor = true;
//
// connection_settings_box
//
this.connection_settings_box.Controls.Add(this.textBox2);
this.connection_settings_box.Controls.Add(this.label3);
this.connection_settings_box.Controls.Add(this.label4);
this.connection_settings_box.Controls.Add(this.label6);
this.connection_settings_box.Controls.Add(this.polling_rate_textbox);
this.connection_settings_box.Controls.Add(this.button6);
this.connection_settings_box.Controls.Add(this.textBox3);
this.connection_settings_box.Controls.Add(this.label7);
this.connection_settings_box.Controls.Add(this.label5);
this.connection_settings_box.Controls.Add(this.textBox4);
this.connection_settings_box.Location = new System.Drawing.Point(74, 82);
this.connection_settings_box.Name = "connection_settings_box";
this.connection_settings_box.Size = new System.Drawing.Size(248, 215);
this.connection_settings_box.TabIndex = 13;
this.connection_settings_box.TabStop = false;
this.connection_settings_box.Text = "Connection Settings";
//
// notice_one
//
this.notice_one.AutoSize = true;
this.notice_one.Location = new System.Drawing.Point(53, 117);
this.notice_one.Name = "notice_one";
this.notice_one.Size = new System.Drawing.Size(182, 65);
this.notice_one.TabIndex = 18;
this.notice_one.Text = "It is asking for an image file name.\r\nThis is what you would use\r\nto put a name o" +
"f what\r\nthe saved image will be outputted as.\r\nFor example, it might be img.png";
//
// misc_tab_page
//
this.misc_tab_page.Controls.Add(this.groupBox4);
this.misc_tab_page.Controls.Add(this.toast_box_group_box);
this.misc_tab_page.Location = new System.Drawing.Point(4, 22);
this.misc_tab_page.Name = "misc_tab_page";
this.misc_tab_page.Padding = new System.Windows.Forms.Padding(3);
this.misc_tab_page.Size = new System.Drawing.Size(415, 372);
this.misc_tab_page.TabIndex = 2;
this.misc_tab_page.Text = "Misc Settings";
this.misc_tab_page.UseVisualStyleBackColor = true;
//
// groupBox4
//
this.groupBox4.Controls.Add(this.notice_two);
this.groupBox4.Controls.Add(this.smtc_check_box);
this.groupBox4.Controls.Add(this.smtc_enable_label);
this.groupBox4.Location = new System.Drawing.Point(20, 92);
this.groupBox4.Name = "groupBox4";
this.groupBox4.Size = new System.Drawing.Size(370, 155);
this.groupBox4.TabIndex = 4;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "SMTC Control";
//
// smtc_enable_label
//
this.smtc_enable_label.AutoSize = true;
this.smtc_enable_label.Location = new System.Drawing.Point(115, 27);
this.smtc_enable_label.Name = "smtc_enable_label";
this.smtc_enable_label.Size = new System.Drawing.Size(73, 13);
this.smtc_enable_label.TabIndex = 0;
this.smtc_enable_label.Text = "SMTC Enable";
//
// smtc_check_box
//
this.smtc_check_box.AutoSize = true;
this.smtc_check_box.Location = new System.Drawing.Point(194, 27);
this.smtc_check_box.Name = "smtc_check_box";
this.smtc_check_box.Size = new System.Drawing.Size(59, 17);
this.smtc_check_box.TabIndex = 2;
this.smtc_check_box.Text = "Enable";
this.smtc_check_box.UseVisualStyleBackColor = true;
//
// notice_two
//
this.notice_two.AutoSize = true;
this.notice_two.Location = new System.Drawing.Point(52, 62);
this.notice_two.Name = "notice_two";
this.notice_two.Size = new System.Drawing.Size(274, 78);
this.notice_two.TabIndex = 3;
this.notice_two.Text = resources.GetString("notice_two.Text");
//
// loaded_profile_label
//
this.loaded_profile_label.AutoSize = true;
this.loaded_profile_label.Location = new System.Drawing.Point(134, 103);
this.loaded_profile_label.Name = "loaded_profile_label";
this.loaded_profile_label.Size = new System.Drawing.Size(77, 13);
this.loaded_profile_label.TabIndex = 23;
this.loaded_profile_label.Text = "Loaded profile:";
//
// profile_loaded_data
//
this.profile_loaded_data.AutoSize = true;
this.profile_loaded_data.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.profile_loaded_data.Location = new System.Drawing.Point(218, 102);
this.profile_loaded_data.Name = "profile_loaded_data";
this.profile_loaded_data.Size = new System.Drawing.Size(104, 13);
this.profile_loaded_data.TabIndex = 24;
this.profile_loaded_data.Text = "No profile loaded";
//
// 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, 716);
this.Controls.Add(this.groupBox2);
this.Controls.Add(this.button2);
this.Controls.Add(this.ok_button_master);
@@ -473,8 +597,18 @@
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.tab_controls.ResumeLayout(false);
this.settings_tab_page.ResumeLayout(false);
this.output_settings_tab_page.ResumeLayout(false);
this.connection_settings_box.ResumeLayout(false);
this.connection_settings_box.PerformLayout();
this.misc_tab_page.ResumeLayout(false);
this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.ResumeLayout(false);
}
@@ -506,22 +640,32 @@
private System.Windows.Forms.Button button6;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label7;
private System.Windows.Forms.TextBox textBox7;
private System.Windows.Forms.TextBox polling_rate_textbox;
private System.Windows.Forms.GroupBox groupBox2;
private System.Windows.Forms.Label label8;
private System.Windows.Forms.TextBox textBox9;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.ComboBox comboBox2;
private System.Windows.Forms.TextBox textBox8;
private System.Windows.Forms.Label label12;
private System.Windows.Forms.ComboBox comboBoxScrollSpeed;
private System.Windows.Forms.TextBox textBoxPauseTime;
private System.Windows.Forms.TextBox separatingcharacterformatbox;
private System.Windows.Forms.Label label13;
private System.Windows.Forms.GroupBox web_server_settings_groupbox;
private System.Windows.Forms.Label web_server_label;
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;
private System.Windows.Forms.TabControl tab_controls;
private System.Windows.Forms.TabPage settings_tab_page;
private System.Windows.Forms.TabPage output_settings_tab_page;
private System.Windows.Forms.GroupBox connection_settings_box;
private System.Windows.Forms.Label notice_one;
private System.Windows.Forms.TabPage misc_tab_page;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.Label notice_two;
private System.Windows.Forms.CheckBox smtc_check_box;
private System.Windows.Forms.Label smtc_enable_label;
private System.Windows.Forms.Label profile_loaded_data;
private System.Windows.Forms.Label loaded_profile_label;
}
}
+26 -19
View File
@@ -20,15 +20,6 @@ namespace RadioDJViewer
{
InitializeComponent();
textBox4.UseSystemPasswordChar = true; // Obscure password field
comboBoxScrollSpeed.Items.Clear();
comboBoxScrollSpeed.Items.AddRange(new object[] {
"Very Slow",
"Slow",
"Medium",
"Fast",
"Very Fast"
});
comboBoxScrollSpeed.SelectedItem = "Medium";
this.buttonSelectOutputFolder.Click += ButtonSelectOutputFolder_Click;
this.button6.Click += ButtonSelectMainImagesFolder_Click;
this.button3.Click += button3_Click;
@@ -73,20 +64,25 @@ namespace RadioDJViewer
label6.Text = mainImagesFolderPath;
textBox5.Text = profile.OutputImageName;
textBox1.Text = profile.UrlFormat;
profile_loaded_data.Text = profile.Name;
// Default polling rate to 3 if missing or zero
textBox7.Text = (profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3).ToString();
comboBoxScrollSpeed.SelectedItem = profile.MarqueeScrollSpeed ?? "Medium";
textBoxPauseTime.Text = profile.MarqueePauseTime > 0 ? profile.MarqueePauseTime.ToString() : "6";
separatingcharacterformatbox.Text = profile.MarqueeSeparator ?? " | ";
polling_rate_textbox.Text = (profile.PollingRateSeconds > 0 ? profile.PollingRateSeconds : 3).ToString();
// Web server settings
try
{
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;
smtc_check_box.Checked = profile.SmtcEnabled;
}
catch { }
return;
}
}
profile_loaded_data.Text = "No profile loaded";
}
private void ButtonSelectOutputFolder_Click(object sender, EventArgs e)
@@ -122,7 +118,7 @@ namespace RadioDJViewer
return;
}
int pollingRate = 3;
int.TryParse(textBox7.Text, out pollingRate);
int.TryParse(polling_rate_textbox.Text, out pollingRate);
var profile = new Profile
{
Name = textBox6.Text,
@@ -134,18 +130,24 @@ namespace RadioDJViewer
OutputImageName = textBox5.Text,
UrlFormat = textBox1.Text,
PollingRateSeconds = pollingRate,
MarqueeScrollSpeed = comboBoxScrollSpeed.SelectedItem?.ToString() ?? "Medium",
MarqueePauseTime = int.TryParse(textBoxPauseTime.Text, out int pt) ? pt : 6,
MarqueeSeparator = separatingcharacterformatbox.Text,
MarqueeScrollSpeed = "Medium",
MarqueePauseTime = 6,
MarqueeSeparator = " | ",
// 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,
SmtcEnabled = smtc_check_box.Checked
};
ProfileStorage.SaveProfile(profile);
// Refresh profile list
comboBox1.Items.Clear();
var names = ProfileStorage.GetProfileNames();
comboBox1.Items.AddRange(names.ToArray());
comboBox1.SelectedItem = profile.Name;
profile_loaded_data.Text = profile.Name;
MessageBox.Show("Profile saved successfully.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
@@ -154,10 +156,15 @@ namespace RadioDJViewer
// Remove Profile (Remove Profile button)
if (comboBox1.SelectedItem != null)
{
ProfileStorage.DeleteProfile(comboBox1.SelectedItem.ToString());
string removed = comboBox1.SelectedItem.ToString();
ProfileStorage.DeleteProfile(removed);
comboBox1.Items.Clear();
var names = ProfileStorage.GetProfileNames();
comboBox1.Items.AddRange(names.ToArray());
if (comboBox1.Items.Count > 0)
comboBox1.SelectedIndex = 0;
else
profile_loaded_data.Text = "No profile loaded";
}
}
@@ -117,6 +117,14 @@
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<data name="notice_two.Text" xml:space="preserve">
<value>With this option, it will enable the output
to Simple Media Transport Control Protocol (AKA SMTC).
You will not be able to control Radio DJ,
but you will get push notifications
or it will be pushed out to the SMTC protocol
with the ability to use it with other applications.</value>
</data>
<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>
+127 -84
View File
@@ -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
function getTextContent(selector) {
var element = document.querySelector(selector);
if (!element || typeof element.textContent !== "string") {
return "";
}
return trimText(element.textContent);
}
// Image filename - update this if the backend changes the image path
const IMAGE_FILENAME = "Album-Art.png";
function trimText(value) {
return String(value || "").replace(/^\s+|\s+$/g, "");
}
//////////////////
// GLOBAL STATE //
//////////////////
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;
}
let currentArtist = "";
let currentTitle = "";
let refreshInterval = null;
//////////////////
// REFRESH LOGIC //
//////////////////
/**
* Fetches the artist and title from text files
*/
async function fetchSongData() {
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 {
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;
}
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;
xhr.send(null);
} catch (e) {
callback(fallbackValue);
}
}
/**
* 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");
function updateSongDisplay(data) {
var titleElement = document.querySelector(".song-title");
var artistElement = document.querySelector(".song-artist");
var trackChanged = false;
var nextTitle;
var nextArtist;
let trackChanged = false;
if (!titleElement || !artistElement || !data) {
return false;
}
// Only update if data has actually changed
if (title !== currentTitle) {
currentTitle = title;
nextTitle = trimText(data.title || "");
nextArtist = trimText(data.artist || "");
if (nextTitle !== currentTitle) {
currentTitle = nextTitle;
titleElement.classList.add("updating");
titleElement.textContent = title || "Unknown Title";
titleElement.textContent = currentTitle || "Unknown Title";
trackChanged = true;
setTimeout(() => {
setTimeout(function () {
titleElement.classList.remove("updating");
}, 400);
}
if (artist !== currentArtist) {
currentArtist = artist;
if (nextArtist !== currentArtist) {
currentArtist = nextArtist;
artistElement.classList.add("updating");
artistElement.textContent = artist || "Unknown Artist";
artistElement.textContent = currentArtist || "Unknown Artist";
trackChanged = true;
setTimeout(() => {
setTimeout(function () {
artistElement.classList.remove("updating");
}, 400);
}
// Return whether track changed (to trigger image update)
return trackChanged;
}
/**
* 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}`;
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;
}
/**
* 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
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();
}
}
});
});
});
}
///////////////
// INITIALIZE //
///////////////
function refreshTime() {
var requestId = latestTimeRequestId + 1;
latestTimeRequestId = requestId;
fetchText("time.txt", currentTime || "No Data", function (nextTime) {
if (requestId !== latestTimeRequestId) {
return;
}
updateTimeDisplay(nextTime);
});
}
function init() {
// Load initial data immediately
refresh();
// Set up refresh interval based on URL parameter or default
refreshInterval = setInterval(refresh, refreshRate * 1000);
console.log(`Radio DJ widget initialized - refreshing every ${refreshRate}s`);
refreshMetadata();
refreshTime();
refreshInterval = window.setInterval(refreshMetadata, refreshRateMs);
timeRefreshInterval = window.setInterval(refreshTime, timeRefreshRateMs);
}
// Start when DOM is ready
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
+34
View File
@@ -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;
}