PageRenderTime 29ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/GDFlacToolVS2012/GDFlacTool.Common/TagFromFileHelper.cs

http://gdflactool.codeplex.com
C# | 364 lines | 283 code | 76 blank | 5 comment | 31 complexity | f7413040f436e986e26b35afc4a04d98 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Globalization;
  3. using System.IO;
  4. using System.Text.RegularExpressions;
  5. namespace GDFlacTool.Common
  6. {
  7. public class TagFromFileHelper
  8. {
  9. private readonly string _mask = string.Empty;
  10. private List<TagHelper> _tagHelpers = new List<TagHelper>();
  11. private int _tagCount;
  12. private int _nonTagCount;
  13. private readonly bool _replaceUnderscores;
  14. private readonly bool _useCase;
  15. private readonly CaseType _caseType;
  16. public TagFromFileHelper(string mask, bool replaceUnderscores, bool useCase, CaseType caseType)
  17. {
  18. _mask = mask;
  19. _replaceUnderscores = replaceUnderscores;
  20. _useCase = useCase;
  21. _caseType = caseType;
  22. _tagHelpers = TagsFromFileParser(_mask);
  23. }
  24. public List<TagHelper> GetTagHelper
  25. {
  26. get { return _tagHelpers; }
  27. }
  28. public int TagCount
  29. {
  30. get { return _tagCount; }
  31. }
  32. public int NonTagCount
  33. {
  34. get { return _nonTagCount; }
  35. }
  36. public List<TagHelper> Refresh(string mask)
  37. {
  38. _tagHelpers.Clear();
  39. _nonTagCount = 0;
  40. _tagCount = 0;
  41. _tagHelpers = TagsFromFileParser(mask);
  42. return _tagHelpers;
  43. }
  44. public List<TagFileObject> GetTagFromFilename(IList<Track> tracks, List<TagHelper> tagHelpers)
  45. {
  46. var ret = new List<TagFileObject>();
  47. foreach (Track track in tracks)
  48. {
  49. TagFileObject obj = CreateTags(Path.GetFileNameWithoutExtension(track.FullPath), tagHelpers);
  50. obj.FileName = track.FileName;
  51. ret.Add(obj);
  52. }
  53. return ret;
  54. }
  55. private TagFileObject CreateTags(string fileName, List<TagHelper> tagHelpers)
  56. {
  57. int pos = 0;
  58. string name;
  59. if (_replaceUnderscores)
  60. {
  61. name = fileName.Replace("_", " ");
  62. }
  63. else
  64. {
  65. name = fileName;
  66. }
  67. //string name = fileName;
  68. var obj = new TagFileObject();
  69. if(!tagHelpers[0].Variable.StartsWith("%"))
  70. {
  71. if(name.StartsWith(tagHelpers[0].Variable))
  72. {
  73. name = name.Remove(0, tagHelpers[0].Variable.Length);
  74. pos = 1;
  75. }
  76. }
  77. for (int i = pos; i < tagHelpers.Count; i++)
  78. {
  79. string separator = string.Empty;
  80. string tagType = tagHelpers[i].TagType;
  81. if (i + 1 < tagHelpers.Count)
  82. {
  83. if(!tagHelpers[i + 1].IsTag)
  84. {
  85. separator = tagHelpers[i + 1].Variable;
  86. i++;
  87. }
  88. }
  89. string strTemp = separator.Replace("(", "\\(");
  90. strTemp = strTemp.Replace(")", "\\)");
  91. string[] value = Regex.Split(name, strTemp, RegexOptions.None);
  92. string tag;
  93. if(i == tagHelpers.Count - 1 && string.IsNullOrEmpty(separator))
  94. {
  95. if(tagType == TagType.Remover)
  96. {
  97. tag = string.Empty;
  98. }
  99. else
  100. {
  101. tag = name;
  102. }
  103. }
  104. else
  105. {
  106. tag = value[0];
  107. int lengt = tag.Length + separator.Length;
  108. if(lengt <= name.Length)
  109. {
  110. name = name.Remove(0, lengt);
  111. }
  112. else
  113. {
  114. name = string.Empty;
  115. }
  116. }
  117. //if(_replaceUnderscores)
  118. //{
  119. // tag = tag.Replace("_", " ");
  120. //}
  121. if(_useCase)
  122. {
  123. tag = CheckCase(tag, _caseType);
  124. }
  125. switch(tagType)
  126. {
  127. case "ARTIST":
  128. obj.Artist = tag;
  129. break;
  130. case "ALBUM":
  131. obj.Album = tag;
  132. break;
  133. case "TITLE":
  134. obj.Title = tag;
  135. break;
  136. case "DATE":
  137. obj.Year = tag;
  138. break;
  139. case "TRACKNUMBER":
  140. obj.Track = tag;
  141. break;
  142. case "DISCNUMBER":
  143. obj.Disc = tag;
  144. break;
  145. case "GENRE":
  146. obj.Genre = tag;
  147. break;
  148. case "COMMENT":
  149. obj.Comment = tag;
  150. break;
  151. case "ALBUMARTIST":
  152. obj.AlbumArtist = tag;
  153. break;
  154. case "CATALOG NUMBER":
  155. obj.Catalog = tag;
  156. break;
  157. }
  158. }
  159. return obj;
  160. }
  161. private string CheckCase(string text, CaseType type)
  162. {
  163. TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
  164. string value = text;
  165. if (type != CaseType.None)
  166. {
  167. if (type == CaseType.Lower)
  168. {
  169. value = myTI.ToLower(value);
  170. }
  171. if (type == CaseType.Upper)
  172. {
  173. value = myTI.ToUpper(value);
  174. }
  175. if (type == CaseType.FirstLetter)
  176. {
  177. value = myTI.ToTitleCase(value.ToLower());
  178. }
  179. if (type == CaseType.FirstWord)
  180. {
  181. value = value.ToLower().ToUpperFirstLetter();
  182. }
  183. }
  184. return value;
  185. }
  186. private List<TagHelper> TagsFromFileParser(string mask)
  187. {
  188. string nonVarChar = string.Empty;
  189. bool isVarChar = false;
  190. var list = new List<TagHelper>();
  191. if(mask.Length == 0)
  192. return null;
  193. foreach (char chr in mask)
  194. {
  195. if(chr == '%')
  196. {
  197. isVarChar = true;
  198. }
  199. else
  200. {
  201. if(isVarChar)
  202. {
  203. if(!string.IsNullOrEmpty(nonVarChar))
  204. {
  205. list.Add(GetTagType(nonVarChar));
  206. nonVarChar = string.Empty;
  207. _nonTagCount = NonTagCount + 1;
  208. }
  209. list.Add( GetTagType("%" + chr));
  210. _tagCount = TagCount + 1;
  211. isVarChar = false;
  212. }
  213. else
  214. {
  215. nonVarChar += chr;
  216. }
  217. }
  218. }
  219. if(!string.IsNullOrEmpty(nonVarChar))
  220. {
  221. list.Add(GetTagType(nonVarChar));
  222. }
  223. return list;
  224. }
  225. private TagHelper GetTagType(string variable)
  226. {
  227. switch (variable)
  228. {
  229. case "%1":
  230. return new TagHelper("%1", TagType.Artist, "Artist", "Artist", true, 200);
  231. case "%2":
  232. return new TagHelper("%2", TagType.Title, "Title", "Title", true, 200);
  233. case "%3":
  234. return new TagHelper("%3", TagType.Album, "Album", "Album", true, 200);
  235. case "%4":
  236. return new TagHelper("%4", TagType.Year, "Year", "Year", true, 40);
  237. case "%5":
  238. return new TagHelper("%5", TagType.Genre, "Genre", "Genre", true, 80);
  239. case "%6":
  240. return new TagHelper("%6", TagType.Tracknumber, "Track", "Track", true, 40);
  241. case "%7":
  242. return new TagHelper("%7", TagType.Discnumber, "Disc", "Disc", true, 40);
  243. case "%C":
  244. return new TagHelper("%C", TagType.Comment, "Comment", "Comment", true, 200);
  245. case "%A":
  246. return new TagHelper("%A", TagType.Albumartist, "Album Artist", "AlbumArtist", true, 200);
  247. case "%G":
  248. return new TagHelper("%G", TagType.CatalogNumber, "Catalog", "Catalog", true, 50);
  249. case "%d":
  250. return new TagHelper("%d", TagType.Remover, "", "", true, 0);
  251. default:
  252. return new TagHelper(variable, string.Empty, string.Empty, string.Empty, false, 0);
  253. }
  254. }
  255. }
  256. public class TagHelper
  257. {
  258. public TagHelper(string variable, string tagType, string name, string aspectName, bool isTag, int columnWidth)
  259. {
  260. Variable = variable;
  261. TagType = tagType;
  262. Name = name;
  263. IsTag = isTag;
  264. ColumnWidth = columnWidth;
  265. AspectName = aspectName;
  266. }
  267. public string AspectName { get; set; }
  268. public bool IsTag { get; set; }
  269. public string Variable { get; set; }
  270. public string TagType { get; set; }
  271. public string Name { get; set; }
  272. public int ColumnWidth { get; set; }
  273. }
  274. public class TagFileObject
  275. {
  276. public string FileName { get; set; }
  277. public string Artist { get; set; }
  278. public string Title { get; set; }
  279. public string Album { get; set; }
  280. public string Year { get; set; }
  281. public string Genre { get; set; }
  282. public string Track { get; set; }
  283. public string Disc { get; set; }
  284. public string Comment { get; set; }
  285. public string AlbumArtist { get; set; }
  286. public string Catalog { get; set; }
  287. }
  288. }