Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            var folderName = "C:\\Users\\Eric\\Music\\iTunes\\iTunes Music Library.xml";

            if (args.Count() > 0)
            {
                folderName = args[0];
            }

            var options = new ProgressBarOptions
            {
                ProgressCharacter   = '─',
                ProgressBarOnBottom = true
            };

            var library = new ITunesLibrary(folderName);

            // ignore streams (http://) for tracking
            var tracks = library.Tracks.Where(t => !t.Location.Contains("http://")).ToList();

            using (var pbar = new ProgressBar(tracks.Count(), "Initial message", options))
            {
                Parallel.ForEach(tracks, (itunesTrack) =>
                {
                    // create a windows path from the itunes location
                    var fileName = WebUtility.UrlDecode(itunesTrack.Location.Replace("+", "%2b")).Replace("file://localhost/", "").Replace("/", "\\");
                    try
                    {
                        TagLib.Id3v2.Tag.DefaultVersion      = 4;
                        TagLib.Id3v2.Tag.ForceDefaultVersion = true;

                        using (var mp3File = TagLib.File.Create(fileName))
                        {
                            TagLib.Id3v2.Tag tag = (TagLib.Id3v2.Tag)mp3File.GetTag(TagLib.TagTypes.Id3v2, true);

                            // strip old popularity frames
                            foreach (var oldPopFrame in tag.GetFrames <TagLib.Id3v2.PopularimeterFrame>().ToArray())
                            {
                                tag.RemoveFrame(oldPopFrame);
                            }

                            //tag.AlbumArtists = new[] { itunesTrack.AlbumArtist };
                            //tag.Performers = new[] { itunesTrack.Artist };
                            //tag.Genres = new[] { itunesTrack.Genre };
                            //tag.IsCompilation = itunesTrack.PartOfCompilation;

                            //RemoveLyrics(mp3File);

                            var frame = TagLib.Id3v2.PopularimeterFrame.Get(tag, "Windows Media Player 9 Series", true);
                            if (itunesTrack.Rating.HasValue)
                            {
                                var stars    = itunesTrack.Rating.Value / 20; // itunes sends 20 x star value
                                frame.Rating = TransformRating(stars);
                            }
                            if (itunesTrack.PlayCount.HasValue && (ulong)itunesTrack.PlayCount.Value > frame.PlayCount)
                            {
                                frame.PlayCount = (ulong)itunesTrack.PlayCount.Value;
                            }

                            //only keep existing tags in file
                            var removeTags = mp3File.TagTypes & ~mp3File.TagTypesOnDisk;
                            mp3File.RemoveTags(removeTags);
                            mp3File.Save();
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"Error updating the playcount: {ex.Message}");
                    }

                    pbar.Tick($"updating {fileName}");
                });
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }