MainForm.cs 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. using System;
  2. using System.ComponentModel;
  3. using System.ComponentModel.Design;
  4. using System.Drawing;
  5. using System.Drawing.Design;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Windows.Forms;
  9. using TagLib;
  10. using File = System.IO.File;
  11. namespace MediaTagger
  12. {
  13. public partial class MainForm : Form
  14. {
  15. private TagLib.File _tagInstance;
  16. public MainForm()
  17. {
  18. InitializeComponent();
  19. MediaFileDragDropLabel.Tag = MediaFileDragDropLabel.Text;
  20. }
  21. private void Reset()
  22. {
  23. LyricsTextBox.DataBindings.Clear();
  24. LyricsTextBox.Clear();
  25. MediaFileDragDropLabel.Text = MediaFileDragDropLabel.Tag as string;
  26. AdvPropertyGrid.SelectedObject = null;
  27. EasyPropertyGrid.SelectedObject = null;
  28. CoverPictureBox.Image = null;
  29. _tagInstance = null;
  30. }
  31. private void Common_DragEnter(object sender, DragEventArgs e)
  32. {
  33. var bMatchDropFormat = e.Data.GetDataPresent(DataFormats.FileDrop);
  34. var bMatchDataType = e.Data.GetData(DataFormats.FileDrop) is string[];
  35. var bMatchFileCount = ((string[])e.Data.GetData(DataFormats.FileDrop)).Length == 1;
  36. var bMatchExistFile = File.Exists(((string[])e.Data.GetData(DataFormats.FileDrop))[0]);
  37. e.Effect = bMatchDropFormat && bMatchDataType && bMatchFileCount && bMatchExistFile
  38. ? DragDropEffects.Link
  39. : DragDropEffects.None;
  40. }
  41. private void MediaFileDragDropLabel_DragDrop(object sender, DragEventArgs e)
  42. {
  43. _tagInstance?.Dispose();
  44. Reset();
  45. var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
  46. _tagInstance = TagLib.File.Create(path);
  47. MediaFileDragDropLabel.Text = path
  48. + Environment.NewLine + "TagType: " + _tagInstance.TagTypes;
  49. AdvPropertyGrid.SelectedObject = _tagInstance.Tag;
  50. EasyPropertyGrid.SelectedObject = new EasyTag(_tagInstance.Tag);
  51. CoverPictureBox.Image = _tagInstance.Tag.Pictures.FirstOrDefault()?.Data.Data.LoadAsImage();
  52. LyricsTextBox.DataBindings.Add("Text", _tagInstance.Tag, nameof(_tagInstance.Tag.Lyrics));
  53. }
  54. private void SaveButton_Click(object sender, EventArgs e)
  55. {
  56. _tagInstance.Save();
  57. Reset();
  58. }
  59. private void DiscardButton_Click(object sender, EventArgs e)
  60. {
  61. _tagInstance.Dispose();
  62. Reset();
  63. }
  64. private void CoverFileDragDropLabel_DragDrop(object sender, DragEventArgs e)
  65. {
  66. var path = ((string[])e.Data.GetData(DataFormats.FileDrop))[0];
  67. try
  68. {
  69. var img = Image.FromFile(path);
  70. if (false == System.Drawing.Imaging.ImageFormat.Jpeg.Equals(img.RawFormat))
  71. {
  72. img.Dispose();
  73. throw new ArgumentException("No a JPEG file");
  74. }
  75. var orig = CoverPictureBox.Image;
  76. CoverPictureBox.Image = img;
  77. orig?.Dispose();
  78. var bytes = File.ReadAllBytes(path);
  79. var pic = new Picture //REF: stackoverflow.com/a/30285220/2430943
  80. {
  81. Type = PictureType.FrontCover,
  82. Description = "Cover",
  83. MimeType = "image/jpeg",
  84. Data = bytes,
  85. };
  86. _tagInstance.Tag.Pictures = new IPicture[] { pic };
  87. }
  88. catch (Exception exception)
  89. {
  90. MessageBox.Show(exception.ToString(), "ERROR");
  91. }
  92. }
  93. private void CoverPictureBox_Click(object sender, EventArgs e)
  94. {
  95. if (null == _tagInstance) return;
  96. ;
  97. var data = _tagInstance.Tag.Pictures.FirstOrDefault()?.Data.Data;
  98. if (null == data)
  99. {
  100. MessageBox.Show("No cover embedded!");
  101. return;
  102. }
  103. var dialog = new SaveFileDialog
  104. {
  105. Title = "Save cover",
  106. Filter = "JPEG file(*.jpeg;*.jpg)|*.jpeg;*.jpg"
  107. };
  108. if (DialogResult.OK == dialog.ShowDialog(this))
  109. {
  110. File.WriteAllBytes(dialog.FileName, data);
  111. }
  112. }
  113. }
  114. internal class EasyTag
  115. {
  116. private readonly Tag _raw;
  117. public EasyTag(Tag tag)
  118. {
  119. _raw = tag;
  120. }
  121. [Category("Frequently Used")]
  122. public string Album { get => _raw.Album; set => _raw.Album = value; }
  123. [Category("Frequently Used")]
  124. public string Artists { get => string.Join(";", _raw.Performers); set => _raw.Performers = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); }
  125. [Category("Frequently Used")]
  126. public string Title { get => _raw.Title; set => _raw.Title = value; }
  127. [Category("Other")]
  128. public string Genres { get => string.Join(";", _raw.Genres); set => _raw.Genres = value.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries); }
  129. [Category("Other")]
  130. public uint Track { get => _raw.Track; set => _raw.Track = value; }
  131. [Category("Other")]
  132. public uint Year { get => _raw.Year; set => _raw.Year = value; }
  133. [Category("Other")]
  134. [Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
  135. public string Lyrics { get => _raw.Lyrics; set => _raw.Lyrics = value; }
  136. }
  137. internal static class ExtensionMethod
  138. {
  139. public static Image LoadAsImage(this byte[] data)
  140. {
  141. using (var ms = new MemoryStream(data))
  142. {
  143. return Image.FromStream(ms);
  144. }
  145. }
  146. }
  147. }