public AlbumDescriptor Visit(IAlbumDescriptorBuilder iBuilder) { bool res = PrivateVisit(iBuilder); if (res == false) return null; return iBuilder.Mature(); }
protected override bool PrivateVisit(IAlbumDescriptorBuilder iab) { if (_Path == null) return false; foreach (string tbp in _Path) { string[] splitted = tbp.Split(new char[] { '=' }); if (splitted.Length != 2) continue; Match m = _Indexed.Match(splitted[0]); if (m.Success) { IAttributeObjectBuilder<TrackDescriptor> track = iab.DescribeNewTrack(); track.DescribeAttribute("TNUMBER", () => m.Groups[2].Value); track.DescribeAttribute(m.Groups[1].Value, () => splitted[1]); track.Mature(); continue; } if (splitted[0] == _DTitle) { string[] splitted2 = splitted[1].Split(new char[] { '/' }); int l = splitted2.Length; if ((l != 1) && (l != 2)) return false; iab.DescribeAttribute(string.Format("{0}0",splitted[0]), () => splitted2[0].Trim()); iab.DescribeAttribute(string.Format("{0}1", splitted[0]), () => ((l == 2) ? splitted2[1] : splitted2[0]).Trim()); continue; } iab.DescribeAttribute(splitted[0], ()=>splitted[1]); } return true; }
protected abstract bool PrivateVisit(IAlbumDescriptorBuilder iab);
protected override bool PrivateVisit(IAlbumDescriptorBuilder iab) { if (iab == null) return false; IAttributeObjectDescriber currentobjecr = iab; int filenumber = 0; using (StreamReader tr = new StreamReader(_Path, Encoding.Default)) { string lign; while ((lign = tr.ReadLine()) != null) { lign = lign.NormalizeSpace(); Match m = _Reader.Match(lign); if (m.Success) { List<string> res = (from g in m.Groups.Cast<Group>().Where(ma => ma.Success).Skip(1) from c in g.Captures.Cast<Capture>() orderby c.Index select c.Value).ToList(); string attribute = res[0]; switch (attribute) { case _Track: IAttributeObjectBuilder<ITrackDescriptor> old = currentobjecr as IAttributeObjectBuilder<ITrackDescriptor>; if (old != null) { old.Mature(); } currentobjecr = iab.DescribeNewTrack(); if (res.Count != 3) return false; currentobjecr.DescribeAttribute(attribute, () => res[1]); continue; case _Comment: if (res.Count != 3) continue; currentobjecr.DescribeAttribute(res[1], () => res[2]); continue; case _File: filenumber++; if (filenumber > 1) return false; break; case _Index: if (res.Count != 3) return false; if (!m.Groups[2].Success) continue; currentobjecr.DescribeAttribute(string.Format("{0} {1}", res[0], res[1]), () => res[2]); continue; } currentobjecr.DescribeAttribute(attribute, () => res[1]); } } } IAttributeObjectBuilder<ITrackDescriptor> last = currentobjecr as IAttributeObjectBuilder<ITrackDescriptor>; if (last != null) { last.Mature(); } return (filenumber == 1); }