/// <summary> /// Prüft, ob der Song den Filter kriterien entspricht. /// </summary> /// <param name="mp3"></param> /// <returns>Entspricht der Ratingfilter</returns> public Boolean CheckSong(MP3File.MP3File mp3) { //Rating if (Rating != unsetRating && Convert.ToInt16(mp3.Bewertung) < Rating) { return(false); } //AlbumInterpret if (AlbpumInterpretFilter != unset && AlbpumInterpretFilter != mp3.ArtistPlaylist.ToString().ToLower()) { return(false); } if (Gelegenheit != Enums.Gelegenheit.unset && Gelegenheit != mp3.Gelegenheit) { return(false); } if (Stimmung != Enums.Stimmung.unset && Stimmung != mp3.Stimmung) { return(false); } if (Geschwindigkeit != Enums.Geschwindigkeit.unset && Geschwindigkeit != mp3.Geschwindigkeit) { return(false); } return(true); }
/// <summary> /// Versucht die Fehlerliste abzuarbeiten /// </summary> public static void WriteNow() { //Falls mal Fehler vorhanden waren diese nun abarbeiten if (listOfCurrentErrors.Count > 0) { List <int> worked = new List <int>(); int counter = 0; foreach (MP3File item in listOfCurrentErrors) { //Versuchen die Fehler abzuarbeiten if (WriteMetaData(item)) { worked.Add(counter); } counter++; } if (worked.Count > 0) { //Es konnte etwas abgearbeitet werden und wir nun aus der Fehlerliste entfernt foreach (int erledigt in worked) { try { MP3File k = listOfCurrentErrors[erledigt]; listOfCurrentErrors.Remove(k); } // ReSharper disable once EmptyGeneralCatchClause catch { } } } } }
/// <summary> /// Verarbeitungsfehler zufügen. /// </summary> /// <param name="_song">Falls übergebener Song schon vorhanden, werden die neuen Daten genommen.</param> public static void Add(MP3File _song) { MP3File song = listOfCurrentErrors.Find(r => r.Pfad == _song.Pfad); if (song == null) { listOfCurrentErrors.Add(_song); } else { song.Bewertung = _song.Bewertung; song.Geschwindigkeit = _song.Geschwindigkeit; song.Stimmung = _song.Stimmung; song.Gelegenheit = _song.Gelegenheit; song.Aufwecken = _song.Aufwecken; song.BewertungMine = _song.BewertungMine; song.Genre = _song.Genre; song.Laufzeit = _song.Laufzeit; } }
/// <summary> /// Ermittelt für die Playlist die entsprechenden Songs und schreibt die M3U /// </summary> /// <param name="music">Alle Songs</param> /// <param name="savepath">Speicherpfad für die M3U</param> /// <param name="bw">Wenn mit einem Backourndworker gearbeitet werden soll, dann dieser</param> /// <param name="BWStartvalue">Start Wert des Backgroundworkers</param> /// <param name="ChangeMusicPath">Wenn ein anderer Pfad für den Song in einer Playlist genommen werden soll /// Folgender Aufbau: OldValue|NewValue </param> /// <param name="clearPlaylistPath">Soll der Playlistordner gelerrt werden?</param> public Playlistwriter(List <String> music, string savepath, BackgroundWorker bw = null, int BWStartvalue = 0, String ChangeMusicPath = null, Boolean clearPlaylistPath = false) { if (BWStartvalue > 80) { return; } int reportvalue = 0; if (bw != null) { bw.ReportProgress(BWStartvalue, "Wiedergabelisten werden in den Speicher geladen"); } //Liste für die MP3Files pro liste vorbereiten List <List <MP3File.MP3File> > plnames = new List <List <MP3File.MP3File> >(); plnames.Clear(); for (int i = 0; i < Playlists.GetPlaylistNames.Count; i++) { plnames.Add(new List <MP3File.MP3File>()); } int counter = 0; //Wenn der Song existiert wird er ausgelesen und geprüft foreach (string path in music) { if (bw != null) { reportvalue = BWStartvalue + ((counter * (100 - BWStartvalue - 10)) / music.Count); bw.ReportProgress(reportvalue, path + " wird geprüft"); counter++; } if (File.Exists(path)) { var file = MP3ReadWrite.ReadMetaData(path); if (file.VerarbeitungsFehler && bw != null) { bw.ReportProgress(100, "Fehler beim Song:" + path); return; } int playlistcounter = 0; foreach (PlaylistClass playlist in Playlists.GetPlaylists) { bool resval = true; bool[] groupconditioner = new bool[playlist.PlaylistConditionGroups.Count]; int gcc = 0; foreach (ConditionObjectGroup playlistConditionGroup in playlist.PlaylistConditionGroups) { //Wenn resval einmal auf false ist, dann wurde bei einer Gruppe False gesetzt und dann wird weiter gemacht //Gruppen sind mit AND verbunden. if (resval == false) { continue; } resval = ConditionCecker.Ceck(playlistConditionGroup, file); groupconditioner[gcc] = resval; gcc++; } bool resvalgc = true; foreach (var b in groupconditioner) { if (b == false) { resvalgc = false; break; } } //song der Liste zufügen, weil er passt. if (resvalgc) { plnames[playlistcounter].Add(file); } playlistcounter++; }//Ende der GetPlaylists schleife } } if (clearPlaylistPath) { var files = Directory.GetFiles(savepath); foreach (var pltoKill in files) { try { if (File.Exists(pltoKill)) { File.Delete(pltoKill); } } catch { // ignored } } } //hier die Playlist schreiben lassen. if (plnames.Count > 0) { if (bw != null) { reportvalue = 90; bw.ReportProgress(reportvalue, "Wiedergabelisten fertig ermittelt und werden nun geschrieben."); } for (int i = 0; i < plnames.Count; i++) { if (bw != null) { if (plnames.Count > 1) { reportvalue = reportvalue + ((i * (10)) / plnames.Count); } else { reportvalue = 100; } bw.ReportProgress(reportvalue, "Wiedergabeliste " + Playlists.GetPlaylistNames[i] + " wird geschrieben."); } if (plnames[i].Count > 0) { PlaylistSortOrder sortorder = Playlists.GetPlaylists[i].Sort; if (sortorder != PlaylistSortOrder.NotSet) { if (sortorder == PlaylistSortOrder.Title) { plnames[i] = plnames[i].OrderBy(x => x.Titel).ToList(); } if (sortorder == PlaylistSortOrder.Artist) { plnames[i] = plnames[i].OrderBy(x => x.Artist).ToList(); } if (sortorder == PlaylistSortOrder.Random) { Random rng = new Random(); List <MP3File.MP3File> list = plnames[i]; int n = list.Count; while (n > 1) { n--; int k = rng.Next(n + 1); MP3File.MP3File value = list[k]; list[k] = list[n]; list[n] = value; } } if (sortorder == PlaylistSortOrder.Rating) { plnames[i] = plnames[i].OrderBy(x => x.Bewertung).ToList();//todo: Prüfen warum nicht in reihenfolge.... } if (sortorder == PlaylistSortOrder.RatingMine) { plnames[i] = plnames[i].OrderBy(x => x.BewertungMine).ToList(); } } if (!MP3ReadWrite.WritePlaylist(plnames[i], Playlists.GetPlaylistNames[i], savepath, ChangeMusicPath)) { //Fehler } } else { //Prüfen, ob Datei schon vorhanden obwohl null, dann löschen var dir = Directory.CreateDirectory(savepath); string m3uname = Playlists.GetPlaylistNames[i] + ".m3u"; string file = dir.FullName + "\\" + m3uname; if (File.Exists(file)) { File.Delete(file); } } } } }
/// <summary> /// Liest aus dem Übergebenen Pfad die Metadaten des Songs aus /// </summary> /// <param name="pfad">Ort wo die Datei liegt</param> /// <returns>Das entsprechende MP3File Objekt</returns> public static MP3File ReadMetaData(string pfad) { MP3File lied = new MP3File(); try { lied.Pfad = pfad; //Taglib Objekt erstellen //Wenn die Datei existiert verarbeiten. if (File.Exists(lied.Pfad)) { TagLib.File taglibobjekt = TagLib.File.Create(lied.Pfad); if (taglibobjekt.Tag.Lyrics != null) { string dummy = Regex.Replace(taglibobjekt.Tag.Lyrics, @"[\r\n]+", "<br />"); dummy = Regex.Replace(dummy, "Deutsch:", "<b>Deutsch:</b>"); lied.Lyric = Regex.Replace(dummy, "Englisch:", "<b>Englisch:</b>"); } else { lied.Lyric = MP3Lyrics.NoLyrics.ToString(); } //Global lied.Typ = taglibobjekt.MimeType; lied.Genre = (taglibobjekt.Tag.Genres != null && taglibobjekt.Tag.Genres.Length > 0 ? taglibobjekt.Tag.Genres[0] : "leer"); lied.Laufzeit = taglibobjekt.Properties.Duration; lied.Kommentar = taglibobjekt.Tag.Comment; //Cover if (taglibobjekt.Tag.Pictures.Length == 0) { lied.HatCover = false; } if (!String.IsNullOrEmpty(taglibobjekt.Tag.Publisher)) { lied.Verlag = taglibobjekt.Tag.Publisher; } if (!String.IsNullOrEmpty(taglibobjekt.Tag.FirstComposer)) { lied.Komponist = taglibobjekt.Tag.FirstComposer; } string art = ""; switch (taglibobjekt.MimeType) { case "taglib/flac": case "taglib/m4a": lied.Album = taglibobjekt.Tag.Album; if (!String.IsNullOrEmpty(taglibobjekt.Tag.FirstPerformer)) { art = taglibobjekt.Tag.FirstPerformer; } if (!String.IsNullOrEmpty(taglibobjekt.Tag.FirstAlbumArtist)) { art = taglibobjekt.Tag.FirstAlbumArtist; } lied.Artist = art; if (taglibobjekt.Tag.Rating != null && taglibobjekt.Tag.Rating != "Not Set") { int r; int.TryParse(taglibobjekt.Tag.Rating, out r); lied.Bewertung = taglibobjekt.Tag.Rating; //Flac wird von MM eine Bome gleich 0 gesetzt Für die Verarbeitung von allen anderen Dingen wird hier das Verarbeiten //Wie bei MP3 auf -1 gesetzt. if (r == 0) { lied.Bewertung = "-1"; } } else { lied.Bewertung = "0"; } Enums.Gelegenheit lge = Enums.Gelegenheit.None; if (!string.IsNullOrEmpty(taglibobjekt.Tag.Occasion)) { Enum.TryParse(taglibobjekt.Tag.Occasion, false, out lge); } lied.Gelegenheit = lge; Enums.Geschwindigkeit lg = Enums.Geschwindigkeit.None; if (!string.IsNullOrEmpty(taglibobjekt.Tag.Tempo)) { Enum.TryParse(taglibobjekt.Tag.Tempo.Replace(" ", "_"), false, out lg); } lied.Geschwindigkeit = lg; lied.Jahr = taglibobjekt.Tag.Year.ToString(); if (string.IsNullOrEmpty(taglibobjekt.Tag.Mood)) { lied.Stimmung = Enums.Stimmung.None; } else { Enums.Stimmung ls; Enum.TryParse(taglibobjekt.Tag.Mood, false, out ls); lied.Stimmung = ls; } lied.Titel = taglibobjekt.Tag.Title; lied.Aufwecken = !String.IsNullOrEmpty(taglibobjekt.Tag.MMCustom2); lied.ArtistPlaylist = !String.IsNullOrEmpty(taglibobjekt.Tag.MMCustom3); lied.BewertungMine = taglibobjekt.Tag.MMCustom1 ?? "0"; break; case "taglib/mp3": #region mp3 TagLib.Id3v2.Tag id3v2tag = taglibobjekt.GetTag(TagLib.TagTypes.Id3v2) as TagLib.Id3v2.Tag; if (id3v2tag != null) { lied.Album = id3v2tag.Album; art = ""; if (!String.IsNullOrEmpty(id3v2tag.FirstPerformer)) { art = taglibobjekt.Tag.FirstPerformer; } if (!String.IsNullOrEmpty(id3v2tag.FirstAlbumArtist)) { art = taglibobjekt.Tag.FirstAlbumArtist; } lied.Artist = art; lied.Jahr = id3v2tag.Year.ToString(); lied.Komponist = id3v2tag.FirstComposer; lied.Titel = id3v2tag.Title; #region Rating TagLib.Id3v2.PopularimeterFrame popm = TagLib.Id3v2.PopularimeterFrame.Get(id3v2tag, "no@email", false); if (popm != null) { int songratingstring = Convert.ToInt16(popm.Rating); int resultval = -1; //Bombe if (songratingstring > 8 && songratingstring < 40) { resultval = 10; //0,5 } if ((songratingstring > 39 && songratingstring < 50) || songratingstring == 1) { resultval = 20; //1 } if (songratingstring > 49 && songratingstring < 60) { resultval = 30; //1,5 } if (songratingstring > 59 && songratingstring < 114) { resultval = 40; //2 } if (songratingstring > 113 && songratingstring < 125) { resultval = 50; //2,5 } if (songratingstring > 124 && songratingstring < 168) { resultval = 60; //3 } if (songratingstring > 167 && songratingstring < 192) { resultval = 70; //3,5 } if (songratingstring > 191 && songratingstring < 219) { resultval = 80; //4 } if (songratingstring > 218 && songratingstring < 248) { resultval = 90; //4,5 } if (songratingstring > 247) { resultval = 100; //5 } lied.Bewertung = resultval.ToString(); } else { lied.Bewertung = "0"; } #endregion Rating //Gelegenheiten und Custom MM DB auslesen auslesen. #region Gelegenheiten IEnumerable <TagLib.Id3v2.Frame> comm = id3v2tag.GetFrames("COMM"); Enums.Gelegenheit gelegenheit = Enums.Gelegenheit.None; Enums.Geschwindigkeit geschwindigkeit = Enums.Geschwindigkeit.None; Enums.Stimmung stimmung = Enums.Stimmung.None; Boolean aufwecken = false; String ratingmine = "0"; Boolean artistplaylist = false; foreach (var b in comm) { if (((TagLib.Id3v2.CommentsFrame)b).Description == "MusicMatch_Situation") { string t = ((TagLib.Id3v2.CommentsFrame)b).Text; if (!string.IsNullOrEmpty(t)) { Enum.TryParse(t, false, out gelegenheit); } } if (((TagLib.Id3v2.CommentsFrame)b).Description == "MusicMatch_Tempo") { var k = ((TagLib.Id3v2.CommentsFrame)b).Text.Replace(" ", "_"); if (!string.IsNullOrEmpty(k)) { Enum.TryParse(k, false, out geschwindigkeit); } } if (((TagLib.Id3v2.CommentsFrame)b).Description == "MusicMatch_Mood") { var x = ((TagLib.Id3v2.CommentsFrame)b).Text; if (!string.IsNullOrEmpty(x)) { Enum.TryParse(x, false, out stimmung); } } //aufwecken if (((TagLib.Id3v2.CommentsFrame)b).Description == "Songs-DB_Custom2") { aufwecken = !String.IsNullOrEmpty(((TagLib.Id3v2.CommentsFrame)b).Text); } //Rating Mine if (((TagLib.Id3v2.CommentsFrame)b).Description == "Songs-DB_Custom1") { ratingmine = String.IsNullOrEmpty(((TagLib.Id3v2.CommentsFrame)b).Text) ? "0" : ((TagLib.Id3v2.CommentsFrame)b).Text; } //ArtistPlaylist if (((TagLib.Id3v2.CommentsFrame)b).Description == "Songs-DB_Custom3") { artistplaylist = !String.IsNullOrEmpty(((TagLib.Id3v2.CommentsFrame)b).Text); } } lied.Gelegenheit = gelegenheit; lied.Geschwindigkeit = geschwindigkeit; lied.Stimmung = stimmung; lied.Aufwecken = aufwecken; lied.ArtistPlaylist = artistplaylist; #endregion Gelegenheiten lied.BewertungMine = ratingmine; } #endregion mp3 break; }//Ende Switch für die MIMETypes taglibobjekt.Dispose(); return(lied); } //Songpfad existiert nicht lied.VerarbeitungsFehler = true; return(lied); } catch { lied.VerarbeitungsFehler = true; return(lied); } }
/// <summary> /// Schreibt die Metadata des übergebenen Songs /// </summary> /// <param name="song"></param> /// <returns></returns> public static Boolean WriteMetaData(MP3File song) { String orgrating = String.Empty; try { //Taglib Objekt erstellen TagLib.File taglibobjekt = TagLib.File.Create(song.Pfad); //taglibobjekt.Tag.Genres[0] = song.Genre; switch (taglibobjekt.MimeType) { case "taglib/flac": case "taglib/m4a": if (song.Bewertung != "No") { //MM Behandelt Bomben bei FLAc anders als bei MP3 //Beim setzten wird hier nun -1 auf 0 gesetzt und 0 als nicht vorhanden. orgrating = song.Bewertung; //Für ein Catch den alten wert merken. if (song.Bewertung == "0") { song.Bewertung = ""; } if (song.Bewertung == "-1") { song.Bewertung = "0"; } taglibobjekt.Tag.Rating = song.Bewertung; } taglibobjekt.Tag.Mood = song.Stimmung.ToString(); taglibobjekt.Tag.Occasion = song.Gelegenheit.ToString(); taglibobjekt.Tag.Tempo = song.Geschwindigkeit.ToString().Replace("_", " "); taglibobjekt.Tag.MMCustom1 = song.BewertungMine; taglibobjekt.Tag.MMCustom2 = (song.Aufwecken) ? "Aufwecken" : String.Empty; taglibobjekt.Tag.MMCustom3 = (song.ArtistPlaylist) ? "true" : String.Empty; break; case "taglib/mp3": TagLib.Id3v2.Tag id3v2tag = taglibobjekt.GetTag(TagLib.TagTypes.Id3v2) as TagLib.Id3v2.Tag; #region Rating if (song.Bewertung != "No") { TagLib.Id3v2.PopularimeterFrame popm = TagLib.Id3v2.PopularimeterFrame.Get(id3v2tag, "no@email", true); //Das Rating wurde entfernt oder gesetzt if (song.Bewertung == "0") { if (id3v2tag != null) { id3v2tag.RemoveFrame(popm); } } else { int ratingval = 0; //Bombe if (song.Bewertung == "10") //0,5 { ratingval = 30; } if (song.Bewertung == "20") //1 { ratingval = 45; } if (song.Bewertung == "30") //1,5 { ratingval = 55; } if (song.Bewertung == "40") //2 { ratingval = 100; } if (song.Bewertung == "50") //2,5 { ratingval = 120; } if (song.Bewertung == "60") //3 { ratingval = 153; } if (song.Bewertung == "70") //3,5 { ratingval = 180; } if (song.Bewertung == "80") //4 { ratingval = 202; } if (song.Bewertung == "90") //4,5 { ratingval = 245; } if (song.Bewertung == "100") //5 { ratingval = 253; } popm.Rating = Convert.ToByte(ratingval); } } #endregion Rating #region Gelegenenheiten /*Ermitteln und ändern falls vorhanden. Andernfalls neu generien*/ if (id3v2tag != null) { IEnumerable <TagLib.Id3v2.Frame> comm = id3v2tag.GetFrames("COMM"); Boolean setgelegenheit = false; Boolean setgeschwindigkeit = false; Boolean setstimmung = false; Boolean aufwecken = false; Boolean artisplaylist = false; Boolean setratingMine = false; // Boolean ratingmine = false; foreach (var b in comm) { string des = ((TagLib.Id3v2.CommentsFrame)b).Description; switch (des) { case "MusicMatch_Situation": case "Songs-DB_Occasion": ((TagLib.Id3v2.CommentsFrame)b).Text = song.Gelegenheit.ToString(); setgelegenheit = true; break; case "MusicMatch_Tempo": case "Songs-DB_Tempo": ((TagLib.Id3v2.CommentsFrame)b).Text = song.Geschwindigkeit.ToString().Replace("_", " "); setgeschwindigkeit = true; break; case "MusicMatch_Mood": case "Songs-DB_Mood": ((TagLib.Id3v2.CommentsFrame)b).Text = song.Stimmung.ToString(); setstimmung = true; break; case "Songs-DB_Custom2": ((TagLib.Id3v2.CommentsFrame)b).Text = song.Aufwecken ? "Aufwecken" : ""; aufwecken = true; break; case "Songs-DB_Custom3": ((TagLib.Id3v2.CommentsFrame)b).Text = song.ArtistPlaylist ? "true" : ""; artisplaylist = true; break; case "Songs-DB_Custom1": ((TagLib.Id3v2.CommentsFrame)b).Text = song.BewertungMine; setratingMine = true; break; } } //Ende foreach if (!aufwecken && song.Aufwecken) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("Songs-DB_Custom2", "xxx") { Text = "Aufwecken" }; id3v2tag.AddFrame(mms); } if (!artisplaylist && song.ArtistPlaylist) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("Songs-DB_Custom3", "xxx") { Text = "true" }; id3v2tag.AddFrame(mms); } if (!setratingMine) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("Songs-DB_Custom1", "xxx") { Text = song.BewertungMine }; id3v2tag.AddFrame(mms); } if (!setgelegenheit) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("MusicMatch_Situation", "xxx"); TagLib.Id3v2.CommentsFrame sdo = new TagLib.Id3v2.CommentsFrame("Songs-DB_Occasion", "xxx"); mms.Text = song.Gelegenheit.ToString(); sdo.Text = song.Gelegenheit.ToString(); id3v2tag.AddFrame(mms); id3v2tag.AddFrame(sdo); } if (!setgeschwindigkeit) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("MusicMatch_Tempo", "xxx"); TagLib.Id3v2.CommentsFrame sdo = new TagLib.Id3v2.CommentsFrame("Songs-DB_Tempo", "xxx"); mms.Text = song.Geschwindigkeit.ToString().Replace("_", " "); sdo.Text = song.Geschwindigkeit.ToString().Replace("_", " "); id3v2tag.AddFrame(mms); id3v2tag.AddFrame(sdo); } if (!setstimmung) { TagLib.Id3v2.CommentsFrame mms = new TagLib.Id3v2.CommentsFrame("MusicMatch_Mood", "xxx"); TagLib.Id3v2.CommentsFrame sdo = new TagLib.Id3v2.CommentsFrame("Songs-DB_Mood", "xxx"); mms.Text = song.Stimmung.ToString(); sdo.Text = song.Stimmung.ToString(); id3v2tag.AddFrame(mms); id3v2tag.AddFrame(sdo); } } #endregion Gelegenheiten break; } taglibobjekt.Save(); taglibobjekt.Dispose(); //For Debuging /* * StringBuilder sb = new StringBuilder(); * sb.AppendLine("Update Done"); * sb.AppendLine(lied.Pfad); * sb.AppendLine(lied.Bewertung); * using (StreamWriter outfile = new StreamWriter(@"C:\done.txt")) * { * outfile.Write(sb.ToString()); * * } */ return(true); } catch { if (!String.IsNullOrEmpty(orgrating)) { song.Bewertung = orgrating; //OriginaleBewertung wieder herstellen. } return(false); } }