Files
cuetools.net/CUETools.CTDB.EACPlugin/FormMetadata.cs

337 lines
13 KiB
C#
Raw Normal View History

2011-05-15 17:41:14 +00:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
2011-05-21 23:28:33 +00:00
using CUETools.CTDB.EACPlugin.Properties;
2012-01-17 08:04:16 +00:00
using System.Net;
using System.IO;
using AudioDataPlugIn;
2011-05-15 17:41:14 +00:00
namespace CUETools.CTDB.EACPlugin
{
2012-01-17 08:04:16 +00:00
public partial class FormMetadata : Form
{
private CUEToolsDB ctdb;
private string agent;
private bool cdinfo, cover;
private ImagePreview m_currently_selected;
public FormMetadata(CUEToolsDB ctdb, string agent, bool cdinfo, bool cover)
{
this.ctdb = ctdb;
this.agent = agent;
this.cdinfo = cdinfo;
this.cover = cover;
this.InitializeComponent();
this.Size = Options.MetadataWindowSize;
2012-01-17 08:04:16 +00:00
}
public CTDBResponseMeta Meta
{
get
{
return this.DialogResult != DialogResult.Cancel &&
listView1.SelectedItems.Count > 0 ?
listView1.SelectedItems[0].Tag as CTDBResponseMeta : null;
}
}
public InternetImage Image
{
get
{
return this.DialogResult != DialogResult.Cancel &&
m_currently_selected != null ?
m_currently_selected.Image : null;
}
}
private void FormMetadata_Load(object sender, EventArgs e)
{
this.Icon = Resources.ctdb;
this.backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
#if DEBUG
string server = "hq.cuetools.net";
#else
string server = null;
#endif
this.ctdb.ContactDB(server, this.agent, null, false, false,
AudioDataPlugIn.Options.MetadataSearch);
if (this.cdinfo)
2012-01-17 08:04:16 +00:00
{
foreach (var metadata in ctdb.Metadata)
{
backgroundWorker1.ReportProgress(0, metadata);
}
2012-01-17 08:04:16 +00:00
}
var knownUrls = new List<string>();
foreach (var metadata in ctdb.Metadata)
{
if (metadata.coverart == null || !this.cover)
continue;
if (!this.cdinfo)
{
backgroundWorker1.ReportProgress(0, metadata);
}
if (backgroundWorker1.CancellationPending)
{
throw new Exception();
}
2012-01-17 08:04:16 +00:00
foreach (var coverart in metadata.coverart)
{
var uri = Options.CoversSearch == CTDBCoversSearch.Large ?
coverart.uri : coverart.uri150 ?? coverart.uri;
if (knownUrls.Contains(uri) || !coverart.primary)
2012-01-17 08:04:16 +00:00
continue;
var ms = new MemoryStream();
if (!this.ctdb.FetchFile(uri, ms))
continue;
var img = new InternetImage();
img.URL = uri;
img.Data = ms.ToArray();
img.Image = new Bitmap(ms);
knownUrls.Add(uri);
backgroundWorker1.ReportProgress(0, img);
2012-01-17 08:04:16 +00:00
}
}
}
public void Form1_DoubleClick(object sender, MouseEventArgs e)
{
if (this.m_currently_selected != null && !this.cdinfo && !backgroundWorker1.IsBusy)
2012-01-17 08:04:16 +00:00
{
this.DialogResult = DialogResult.OK;
}
}
public void Form1_MouseClick(object sender, MouseEventArgs e)
{
ImagePreview ssp = null;
if (sender is ImagePreview)
{
ssp = sender as ImagePreview;
}
//else if (sender is LargeImage)
//{
// if (m_current_control is ImagePreview)
// {
// ssp = m_current_control as ImagePreview;
// }
//}
else if (sender is Control)
{
Control cp = (sender as Control).Parent;
if (cp != null)
{
if (cp is ImagePreview)
{
ssp = cp as ImagePreview;
}
}
}
if (ssp != null)
{
if (m_currently_selected != null)
{
m_currently_selected.Selected = false;
}
ssp.Selected = true;
m_currently_selected = ssp;
//AcceptImage.Enabled = true;
}
}
public void Form1_MouseMove(object sender, MouseEventArgs e)
{
//if (sender is Control)
//{
// bool ison = false;
// Point screencoord = (sender as Control).PointToScreen(e.Location);
// Point clientcoord = ImagesPanel.PointToClient(screencoord);
// Control cp = ImagesPanel.GetChildAtPoint(clientcoord);
// ImagePreview ssp = null;
// if (cp is ImagePreview)
// {
// ssp = cp as ImagePreview;
// if (!ssp.IsMouseOverPanel(screencoord))
// {
// cp = null;
// ssp = null;
// }
// }
// label1.Text = "(" + (ison) + "/" + (cp != null) + "/" + cp + "-" + m_current_control + ")";
// if (cp != m_current_control)
// {
// m_current_control = cp;
// if (cp == null)
// {
// Capture = false;
// li.UnshowImage();
// }
// else
// {
// Point np = new Point(cp.Left + cp.Width / 2, cp.Top + cp.Height / 2);
// if (ssp != null)
// {
// if (ssp.Image != null)
// {
// //Capture = true;
// li.ShowImage(ssp.Image, ImagesPanel.PointToScreen(np));
// //System.Threading.Thread.Sleep(5000);
// li.Activate();
// li.Focus();
// //label2.Text = "" + li.ContainsFocus;
// }
// }
// }
// }
//}
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.progressBar1.Visible = false;
this.button1.Visible = true;
this.button2.Visible = true;
if (listView1.Items.Count == 0 && flowLayoutPanel1.Controls.Count == 0)
2012-01-17 08:04:16 +00:00
{
this.DialogResult = DialogResult.Cancel;
return;
}
if (listView1.Items.Count > 0)
listView1.Items[0].Selected = true;
if (flowLayoutPanel1.Controls.Count > 0 && m_currently_selected == null)
{
m_currently_selected = flowLayoutPanel1.Controls[0] as ImagePreview;
m_currently_selected.Selected = true;
}
if ((!this.cdinfo || listView1.Items.Count == 1) && (!this.cover || flowLayoutPanel1.Controls.Count == 1))
{
2012-01-17 08:04:16 +00:00
this.DialogResult = DialogResult.OK;
}
2012-01-17 08:04:16 +00:00
}
private void listView1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (this.cdinfo && !backgroundWorker1.IsBusy)
{
var ht = listView1.HitTest(e.Location);
if (ht.Item != null)
this.DialogResult = DialogResult.OK;
}
2012-01-17 08:04:16 +00:00
}
private void AddMeta(CTDBResponseMeta metadata)
{
uint td = 0, dn = 0;
var disccount = metadata.disccount ?? "1";
var discnumber = metadata.discnumber ?? "1";
var discnumber01 = (uint.TryParse(disccount, out td) && uint.TryParse(discnumber, out dn) && td > 9 && dn > 0) ?
string.Format("{0:00}", dn) : discnumber;
var discnumberandtotal = disccount != "1" ? discnumber01 + "/" + disccount : (discnumber != "1" ? discnumber01 : "");
var label = metadata.country ?? "";
if (metadata.label != null)
foreach (var l in metadata.label)
label = (label == "" ? "" : label + ": ") + (l.name ?? "") + (l.name != null && l.catno != null ? " " : "") + (l.catno ?? "");
if (metadata.releasedate != null)
label = (label == "" ? "" : label + ": ") + metadata.releasedate;
var text = string.Format("{0}{1} - {2}{3}{4}", metadata.year != null ? metadata.year + ": " : "",
metadata.artist == null ? "Unknown Artist" : metadata.artist,
metadata.album == "" ? "Unknown Title" : metadata.album,
discnumberandtotal != "" ? " (disc " + discnumberandtotal + (metadata.discname != null ? ": " + metadata.discname : "") + ")" : "",
label == "" ? "" : " (" + label + ")");
var tip = new StringBuilder();
var i = 0;
if (metadata.track != null)
{
foreach (var tr in metadata.track)
tip.AppendFormat("{0}. {2}{1}\n", ++i, tr.name, ((tr.artist ?? metadata.artist) == metadata.artist) ? "" : tr.artist + " / ");
}
listView1.Items.Add(new ListViewItem(text) { Tag = metadata, ImageKey = metadata.source, ToolTipText = tip.ToString() });
this.listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
}
private static string FreedbToEncoding(Encoding iso, Encoding def, ref bool changed, ref bool error, string s)
{
if (s == null)
return null;
try
{
string res = def.GetString(iso.GetBytes(s));
changed |= res != s;
return res;
}
catch // EncoderFallbackException, DecoderFallbackException
{
error = true;
}
return s;
}
private CTDBResponseMeta FreedbToEncoding(CTDBResponseMeta src)
{
if (src.source != "freedb")
return null;
Encoding iso = Encoding.GetEncoding("iso-8859-1", new EncoderExceptionFallback(), new DecoderExceptionFallback());
Encoding def = Encoding.GetEncoding(Encoding.Default.CodePage, new EncoderExceptionFallback(), new DecoderExceptionFallback());
bool different = false;
bool error = false;
var metadata = new CTDBResponseMeta(src);
metadata.artist = FreedbToEncoding(iso, def, ref different, ref error, metadata.artist);
metadata.album = FreedbToEncoding(iso, def, ref different, ref error, metadata.album);
metadata.extra = FreedbToEncoding(iso, def, ref different, ref error, metadata.extra);
if (metadata.track != null)
{
for (int i = 0; i < metadata.track.Length; i++)
{
metadata.track[i].name = FreedbToEncoding(iso, def, ref different, ref error, metadata.track[i].name);
metadata.track[i].artist = FreedbToEncoding(iso, def, ref different, ref error, metadata.track[i].artist);
metadata.track[i].extra = FreedbToEncoding(iso, def, ref different, ref error, metadata.track[i].extra);
}
}
return different && !error ? metadata : null;
}
2012-01-17 08:04:16 +00:00
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (e.UserState is InternetImage)
{
var img = e.UserState as InternetImage;
var preview = new ImagePreview(flowLayoutPanel1, Form1_MouseMove, Form1_MouseClick, Form1_DoubleClick, img);
flowLayoutPanel1.Height = preview.Height + preview.Margin.Vertical;
//flowLayoutPanel1.DoubleBuffered = true;
}
if (e.UserState is CTDBResponseMeta)
{
var metadata = e.UserState as CTDBResponseMeta;
var freedbenc = FreedbToEncoding(metadata);
AddMeta(metadata);
if (freedbenc != null) AddMeta(freedbenc);
2012-01-17 08:04:16 +00:00
}
}
private void FormMetadata_FormClosing(object sender, FormClosingEventArgs e)
{
if (backgroundWorker1.IsBusy)
{
backgroundWorker1.CancelAsync();
e.Cancel = true;
return;
}
Options.MetadataWindowSize = this.Size;
}
2012-01-17 08:04:16 +00:00
}
2011-05-15 17:41:14 +00:00
}