From 155f8bbeab51c312d0d7fcc1a81e3159f0b8cbbb Mon Sep 17 00:00:00 2001
From: minster586 <43217359+minster586@users.noreply.github.com>
Date: Wed, 27 Aug 2025 06:42:45 -0400
Subject: [PATCH] Release
---
RadioDJViewer/Main.Designer.cs | 16 +--
RadioDJViewer/Main.cs | 109 +++++++++++++++---
RadioDJViewer/Main.resx | 2 +-
.../Properties/Resources.Designer.cs | 10 ++
RadioDJViewer/Properties/Resources.resx | 3 +
RadioDJViewer/RadioDJViewer.csproj | 3 +
RadioDJViewer/Resources/fallback.png | Bin 0 -> 13179 bytes
7 files changed, 118 insertions(+), 25 deletions(-)
create mode 100644 RadioDJViewer/Resources/fallback.png
diff --git a/RadioDJViewer/Main.Designer.cs b/RadioDJViewer/Main.Designer.cs
index 4019fcc..900fb5f 100644
--- a/RadioDJViewer/Main.Designer.cs
+++ b/RadioDJViewer/Main.Designer.cs
@@ -122,13 +122,13 @@
//
this.restAPISettingToolStripMenuItem.Name = "restAPISettingToolStripMenuItem";
this.restAPISettingToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
- this.restAPISettingToolStripMenuItem.Text = "Rest API Setting";
+ this.restAPISettingToolStripMenuItem.Text = "Setting";
this.restAPISettingToolStripMenuItem.Click += new System.EventHandler(this.restAPISettingToolStripMenuItem_Click);
//
// exitToolStripMenuItem
//
this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
- this.exitToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
+ this.exitToolStripMenuItem.Size = new System.Drawing.Size(157, 22);
this.exitToolStripMenuItem.Text = "Exit";
this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
//
@@ -166,7 +166,7 @@
// label6
//
this.label6.AutoSize = true;
- this.label6.Location = new System.Drawing.Point(205, 130);
+ this.label6.Location = new System.Drawing.Point(170, 130);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(65, 16);
this.label6.TabIndex = 5;
@@ -175,7 +175,7 @@
// label5
//
this.label5.AutoSize = true;
- this.label5.Location = new System.Drawing.Point(205, 84);
+ this.label5.Location = new System.Drawing.Point(170, 83);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(56, 16);
this.label5.TabIndex = 4;
@@ -184,7 +184,7 @@
// label4
//
this.label4.AutoSize = true;
- this.label4.Location = new System.Drawing.Point(205, 41);
+ this.label4.Location = new System.Drawing.Point(170, 39);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(48, 16);
this.label4.TabIndex = 3;
@@ -270,6 +270,7 @@
private System.Windows.Forms.StatusStrip statusStrip1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2;
+ private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4;
private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3;
private System.Windows.Forms.MenuStrip menuStrip2;
private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem;
@@ -278,15 +279,14 @@
private System.Windows.Forms.ToolStripMenuItem aboutToolStripMenuItem;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.GroupBox groupBox1;
- private System.Windows.Forms.Label label2;
- private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label6;
private System.Windows.Forms.Label label5;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label3;
+ private System.Windows.Forms.Label label2;
+ private System.Windows.Forms.Label label1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
- private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4;
}
}
diff --git a/RadioDJViewer/Main.cs b/RadioDJViewer/Main.cs
index a2fffe4..2541eb4 100644
--- a/RadioDJViewer/Main.cs
+++ b/RadioDJViewer/Main.cs
@@ -9,6 +9,7 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.IO;
+using System.Resources;
namespace RadioDJViewer
{
@@ -30,6 +31,7 @@ namespace RadioDJViewer
public Main()
{
InitializeComponent();
+ EnsureDefaultImageExists();
UpdateStatusBar();
// Auto-load profiles if profiles.json exists
AutoLoadProfiles();
@@ -37,6 +39,45 @@ namespace RadioDJViewer
apiTimer = new System.Windows.Forms.Timer();
apiTimer.Interval = 3000; // 3 seconds
apiTimer.Tick += ApiTimer_Tick;
+ // Set up marquee timer for title
+ marqueeTimer = new System.Windows.Forms.Timer();
+ marqueeTimer.Interval = 100; // Adjust speed as needed
+ marqueeTimer.Tick += MarqueeTimer_Tick;
+ }
+
+ private System.Windows.Forms.Timer marqueeTimer;
+ private int marqueeOffset = 0;
+ private string marqueeText = "";
+
+ private void EnsureDefaultImageExists()
+ {
+ if (!File.Exists(defaultImagePath))
+ {
+ // Try to extract from resources
+ var fallbackImg = Properties.Resources.fallback;
+ if (fallbackImg != null)
+ {
+ fallbackImg.Save(defaultImagePath, System.Drawing.Imaging.ImageFormat.Jpeg);
+ }
+ }
+ }
+
+ private void MarqueeTimer_Tick(object sender, EventArgs e)
+ {
+ if (marqueeText.Length > 0)
+ {
+ int visibleChars = 30; // Adjust for label width
+ if (marqueeText.Length > visibleChars)
+ {
+ marqueeOffset = (marqueeOffset + 1) % marqueeText.Length;
+ string display = marqueeText.Substring(marqueeOffset) + " " + marqueeText.Substring(0, marqueeOffset);
+ label4.Text = display.Substring(0, Math.Min(visibleChars, display.Length));
+ }
+ else
+ {
+ label4.Text = marqueeText;
+ }
+ }
}
private void ApiTimer_Tick(object sender, EventArgs e)
@@ -170,18 +211,32 @@ namespace RadioDJViewer
{
string imagePath = string.Empty;
string outputImageName = loadedProfile?.OutputImageName;
+ bool useFallback = false;
if (!string.IsNullOrEmpty(mainImagesFolderPath) && !string.IsNullOrEmpty(imageName))
{
imagePath = Path.Combine(mainImagesFolderPath, imageName);
- }
- if (string.IsNullOrEmpty(imagePath) || !File.Exists(imagePath))
- {
- // Show default image if not found
- if (File.Exists(defaultImagePath))
+ if (!File.Exists(imagePath))
{
- using (var img = Image.FromFile(defaultImagePath))
+ useFallback = true;
+ }
+ }
+ else
+ {
+ useFallback = true;
+ }
+ if (useFallback)
+ {
+ // Use fallback PNG from resources
+ var fallbackImg = Properties.Resources.fallback;
+ if (fallbackImg != null)
+ {
+ var resized = new Bitmap(fallbackImg, pictureBox1.Size);
+ pictureBox1.Image = resized;
+ // Save fallback image to output folder as PNG
+ if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
{
- pictureBox1.Image = new Bitmap(img);
+ string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
+ resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png);
}
}
else
@@ -192,19 +247,37 @@ namespace RadioDJViewer
}
try
{
- // Display in pictureBox1
using (var img = Image.FromFile(imagePath))
{
- pictureBox1.Image = new Bitmap(img);
- // Copy and convert to PNG in output folder if set and output image name is set
+ var resized = new Bitmap(img, pictureBox1.Size);
+ pictureBox1.Image = resized;
+ // Save to output folder as PNG
if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
{
string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
- img.Save(destPath, System.Drawing.Imaging.ImageFormat.Png);
+ resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png);
}
}
}
- catch { /* Handle errors if needed */ }
+ catch
+ {
+ // If loading image fails, fallback
+ var fallbackImg = Properties.Resources.fallback;
+ if (fallbackImg != null)
+ {
+ var resized = new Bitmap(fallbackImg, pictureBox1.Size);
+ pictureBox1.Image = resized;
+ if (!string.IsNullOrEmpty(outputFolderPath) && !string.IsNullOrEmpty(outputImageName))
+ {
+ string destPath = Path.Combine(outputFolderPath, Path.ChangeExtension(outputImageName, ".png"));
+ resized.Save(destPath, System.Drawing.Imaging.ImageFormat.Png);
+ }
+ }
+ else
+ {
+ pictureBox1.Image = null;
+ }
+ }
}
private void ParseAndDisplaySongInfo(string xml)
@@ -219,14 +292,16 @@ namespace RadioDJViewer
string album = doc.SelectSingleNode("//*[translate(local-name(), 'ALBUM', 'album')='album']")?.InnerText;
string albumArt = doc.SelectSingleNode("//*[translate(local-name(), 'ALBUMART', 'albumart')='albumart']")?.InnerText;
- label4.Text = !string.IsNullOrWhiteSpace(title) ? title : "No title";
+ marqueeText = !string.IsNullOrWhiteSpace(title) ? title : "No title";
+ marqueeOffset = 0;
+ marqueeTimer.Start();
label5.Text = !string.IsNullOrWhiteSpace(artist) ? artist : "No artist";
label6.Text = !string.IsNullOrWhiteSpace(album) ? album : "No album";
// Write to output files
if (!string.IsNullOrEmpty(outputFolderPath))
{
- File.WriteAllText(Path.Combine(outputFolderPath, "title.txt"), label4.Text);
+ File.WriteAllText(Path.Combine(outputFolderPath, "title.txt"), marqueeText);
File.WriteAllText(Path.Combine(outputFolderPath, "artist.txt"), label5.Text);
File.WriteAllText(Path.Combine(outputFolderPath, "album.txt"), label6.Text);
}
@@ -243,7 +318,9 @@ namespace RadioDJViewer
}
catch
{
- label4.Text = "No title";
+ marqueeText = "No title";
+ marqueeOffset = 0;
+ marqueeTimer.Start();
label5.Text = "No artist";
label6.Text = "No album";
pictureBox1.Image = null;
@@ -270,7 +347,7 @@ namespace RadioDJViewer
private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
{
string version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
- string message = $"RadioDJViewer\nVersion: {version}\nGitHub: https://github.com/yourusername/RadioDJViewer";
+ string message = $"RadioDJViewer\nVersion: {version}\nGitHub: https://git.smartcraft.me/minster586/RadioDJViewer";
MessageBox.Show(message, "About RadioDJViewer", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
diff --git a/RadioDJViewer/Main.resx b/RadioDJViewer/Main.resx
index c822fe8..b617e75 100644
--- a/RadioDJViewer/Main.resx
+++ b/RadioDJViewer/Main.resx
@@ -124,7 +124,7 @@
iVBORw0KGgoAAAANSUhEUgAAAIAAAACABAMAAAAxEHz4AAAABGdBTUEAALGPC/xhBQAAAANQTFRFJn8A
- Mx1isQAAAAlwSFlzAAAOvgAADr4B6kKxwAAAAB9JREFUaN7twTEBAAAAwqD1T20IX6AAAAAAAAAAAD4D
+ Mx1isQAAAAlwSFlzAAAOvAAADrwBlbxySQAAAB9JREFUaN7twTEBAAAAwqD1T20IX6AAAAAAAAAAAD4D
IIAAAT2Y3yoAAAAASUVORK5CYII=
diff --git a/RadioDJViewer/Properties/Resources.Designer.cs b/RadioDJViewer/Properties/Resources.Designer.cs
index b2f5ce0..f66a41e 100644
--- a/RadioDJViewer/Properties/Resources.Designer.cs
+++ b/RadioDJViewer/Properties/Resources.Designer.cs
@@ -60,6 +60,16 @@ namespace RadioDJViewer.Properties {
}
}
+ ///
+ /// Looks up a localized resource of type System.Drawing.Bitmap.
+ ///
+ internal static System.Drawing.Bitmap fallback {
+ get {
+ object obj = ResourceManager.GetObject("fallback", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
///
/// Looks up a localized resource of type System.Drawing.Bitmap.
///
diff --git a/RadioDJViewer/Properties/Resources.resx b/RadioDJViewer/Properties/Resources.resx
index a647b1d..b3f5f6c 100644
--- a/RadioDJViewer/Properties/Resources.resx
+++ b/RadioDJViewer/Properties/Resources.resx
@@ -118,6 +118,9 @@
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+ ..\Resources\fallback.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
..\Resources\green.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
diff --git a/RadioDJViewer/RadioDJViewer.csproj b/RadioDJViewer/RadioDJViewer.csproj
index 06dd3a2..eb4675c 100644
--- a/RadioDJViewer/RadioDJViewer.csproj
+++ b/RadioDJViewer/RadioDJViewer.csproj
@@ -100,5 +100,8 @@
+
+
+
\ No newline at end of file
diff --git a/RadioDJViewer/Resources/fallback.png b/RadioDJViewer/Resources/fallback.png
new file mode 100644
index 0000000000000000000000000000000000000000..c573c6fa8d8c717d75b7c9f25a07524a633b080a
GIT binary patch
literal 13179
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
literal 0
HcmV?d00001