/// <summary> /// 下载红心歌曲 /// </summary> public void Download() { if (Directory.Exists(Path) == false)//如果不存在就创建文件夹 { Directory.CreateDirectory(Path); } client.NewList(); client.SwitchChannel(Channel.RedHeart); int times = 0; int num = 0; while (dic.Count <= Total) { foreach (Song song in client.Playlist) { if (!dic.Keys.Contains(song.SongID)) { dic.Add(song.SongID, song); num++; currentSong = song; string fileName = Path + song.Title + ".mp3"; try { image = Image.FromStream(WebRequest.Create(song.PictureURL).GetResponse().GetResponseStream()); } catch (Exception) { image = Properties.Resources.cover; } NewSong.Invoke(num, image, song.Title, song.Artist); if (File.Exists(fileName)) { Exist++; } else { if (Downfile(song.MediaURL, fileName)) { Success++; ID3Info info = new ID3Info(fileName, true); info.Load(); info.ID3v2Info.SetMinorVersion(3); AttachedPictureFrame pic = null; try { if (!string.IsNullOrEmpty(CoverPath))//保存封面 { image.Save(CoverPath + song.Title + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg); } ms = new System.IO.MemoryStream(); image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); // 创建新封面 pic = new AttachedPictureFrame( FrameFlags.Compression, "cover.jpg", TextEncodings.UTF_16, "", AttachedPictureFrame.PictureTypes.Cover_Front, ms); info.ID3v2Info.AttachedPictureFrames.Add(pic); // 添加新封面到MP3中 } catch { } if (!string.IsNullOrEmpty(lyricPath))//下载歌词 { downloadLrc.SaveLyric(song.Artist, song.Title, lyricPath + song.Title + ".lrc"); } // 设置其它属性(ID3V1) info.ID3v1Info.Title = song.Title; info.ID3v1Info.Artist = song.Artist; info.ID3v1Info.Album = song.AlbumTitle; //jasine fixed 2015.9.23 info.ID3v1Info.Year = song.PublicationTime; //info.ID3v1Info.Year = ""; info.ID3v1Info.Comment = "*****@*****.**";//注释---------添加不上去 info.ID3v1Info.Genre = 12;//类型代码Other:12 对应于ID3V2中自定义类型RedHeart // 设置其它属性(ID3V2) info.ID3v2Info.SetTextFrame("TIT2", song.Title); info.ID3v2Info.SetTextFrame("TPE1", song.Artist); info.ID3v2Info.SetTextFrame("TALB", song.AlbumTitle); //jasine fixed 2015.9.23 info.ID3v2Info.SetTextFrame("TYER", song.PublicationTime); //info.ID3v2Info.SetTextFrame("TYER", ""); //info.ID3v2Info.SetTextFrame("COMM", "*****@*****.**");//注释---------添加不上去 info.ID3v2Info.SetTextFrame("TCON", "RedHeart");//类型 //jasine fixed 2015.9.23 //info.ID3v2Info.SetTextFrame("TPUB", song.Publisher);//发布者,发布单位 info.ID3v2Info.SetTextFrame("TPUB", "");//发布者,发布单位 // 保存到MP3中 if (ID3Version == 1) { info.ID3v1Info.Save(); } else { //info.Save(3); info.ID3v2Info.PopularimeterFrames.Add(new ID3.ID3v2Frames.TextFrames.PopularimeterFrame( FrameFlags.TagAlterPreservation, "fm.douban.com", song.Rating, 0));//豆瓣评分 info.ID3v2Info.Save(3); } } else { //下载失败 Fail++; } } if ((Success + Fail + Exist) >= Total) { Msg.Invoke(Success, Fail, Exist, "下载完成"); Stop(); } else { Msg.Invoke(Success, Fail, Exist, ""); } } } client.Skip(); times++; if (times > 10000) { Fail=Total-(Success+Exist); Msg.Invoke(Success,Fail ,Exist, "尝试次数过多,未成功下载歌曲请过几小时后再在原文件夹下载"); Stop(); } } Msg.Invoke(Success, Fail, Exist, "下载完成"); }
/// <summary> /// Add Frame information to where it must store /// </summary> /// <param name="Data">FileStream contain Frame</param> /// <param name="FrameID">FrameID of frame</param> /// <param name="Length">Maximum available length to read</param> /// <param name="Flags">Flags of frame</param> private bool AddFrame(FileStreamEx Data, string FrameID, int Length, FrameFlags Flags) { // NOTE: All FrameIDs must be capital letters if (!FramesInfo.IsValidFrameID(FrameID)) { AddError(new ID3Error("nonValid Frame found and dropped", FrameID)); return false; } int IsText = FramesInfo.IsTextFrame(FrameID, _ver.Minor); if (IsText == 1) { TextFrame TempTextFrame = new TextFrame(FrameID, Flags, Data, Length); if (TempTextFrame.IsReadableFrame) { _TextFrames.Add(TempTextFrame); return true; } return false; } if (IsText == 2) { UserTextFrame TempUserTextFrame = new UserTextFrame(FrameID, Flags, Data, Length); if (TempUserTextFrame.IsReadableFrame) { _UserTextFrames.Add(TempUserTextFrame); return true; } return false; } switch (FrameID) { case "UFID": case "PRIV": PrivateFrame TempPrivateFrame = new PrivateFrame(FrameID, Flags, Data, Length); if (TempPrivateFrame.IsReadableFrame) { _PrivateFrames.Add(TempPrivateFrame); return true; } else AddError(new ID3Error(TempPrivateFrame.ErrorMessage, FrameID)); break; case "USLT": case "COMM": TextWithLanguageFrame TempTextWithLangFrame = new TextWithLanguageFrame(FrameID, Flags, Data, Length); if (TempTextWithLangFrame.IsReadableFrame) { _TextWithLangFrames.Add(TempTextWithLangFrame); return true; } else AddError(new ID3Error(TempTextWithLangFrame.ErrorMessage, FrameID)); break; case "SYLT": SynchronisedText TempSynchronisedText = new SynchronisedText(FrameID, Flags, Data, Length); if (TempSynchronisedText.IsReadableFrame) { _SynchronisedTextFrames.Add(TempSynchronisedText); return true; } else AddError(new ID3Error(TempSynchronisedText.ErrorMessage, FrameID)); break; case "GEOB": GeneralFileFrame TempGeneralFileFrame = new GeneralFileFrame(FrameID, Flags, Data, Length); if (TempGeneralFileFrame.IsReadableFrame) { _EncapsulatedObjectFrames.Add(TempGeneralFileFrame); return true; } else AddError(new ID3Error(TempGeneralFileFrame.ErrorMessage, FrameID)); break; case "POPM": PopularimeterFrame TempPopularimeterFrame = new PopularimeterFrame(FrameID, Flags, Data, Length); if (TempPopularimeterFrame.IsReadableFrame) { _PopularimeterFrames.Add(TempPopularimeterFrame); return true; } else AddError(new ID3Error(TempPopularimeterFrame.ErrorMessage, FrameID)); break; case "AENC": AudioEncryptionFrame TempAudioEncryptionFrame = new AudioEncryptionFrame(FrameID, Flags, Data, Length); if (TempAudioEncryptionFrame.IsReadableFrame) { _AudioEncryptionFrames.Add(TempAudioEncryptionFrame); return true; } else AddError(new ID3Error(TempAudioEncryptionFrame.ErrorMessage, FrameID)); break; case "USER": TermOfUseFrame TempTermOfUseFrame = new TermOfUseFrame(FrameID, Flags, Data, Length); if (TempTermOfUseFrame.IsReadableFrame) { _TermOfUseFrames.Add(TempTermOfUseFrame); return true; } else AddError(new ID3Error(TempTermOfUseFrame.ErrorMessage, FrameID)); break; case "ENCR": case "GRID": DataWithSymbolFrame TempDataWithSymbolFrame = new DataWithSymbolFrame(FrameID, Flags, Data, Length); if (TempDataWithSymbolFrame.IsReadableFrame) { _DataWithSymbolFrames.Add(TempDataWithSymbolFrame); return true; } else AddError(new ID3Error(TempDataWithSymbolFrame.ErrorMessage, FrameID)); break; case "LINK": LinkFrame LF = new LinkFrame(FrameID, Flags, Data, Length); if (LF.IsReadableFrame) { _LinkFrames.Add(LF); if (_LoadLinkedFrames) { LoadFrameFromFile(LF.FrameIdentifier, LF.URL); return true; } } else AddError(new ID3Error(LF.ErrorMessage, FrameID)); break; case "APIC": AttachedPictureFrame TempAttachedPictureFrame = new AttachedPictureFrame(FrameID, Flags, Data, Length); if (TempAttachedPictureFrame.IsReadableFrame) { _AttachedPictureFrames.Add(TempAttachedPictureFrame); return true; } else AddError(new ID3Error(TempAttachedPictureFrame.ErrorMessage, FrameID)); break; case "MCDI": BinaryFrame MCDI = new BinaryFrame(FrameID, Flags, Data, Length); if (MCDI.IsReadableFrame) { _MCDIFrame = MCDI; return true; } else AddError(new ID3Error(MCDI.ErrorMessage, FrameID)); break; case "SYTC": SynchronisedTempoFrame SYTC = new SynchronisedTempoFrame(FrameID, Flags, Data, Length); if (SYTC.IsReadableFrame) { _SYTCFrame = SYTC; return true; } else AddError(new ID3Error(SYTC.ErrorMessage, FrameID)); break; case "PCNT": PlayCounterFrame PCNT = new PlayCounterFrame(FrameID, Flags, Data, Length); if (PCNT.IsReadableFrame) { _PCNTFrame = PCNT; return true; } else AddError(new ID3Error(PCNT.ErrorMessage, FrameID)); break; case "RBUF": RecomendedBufferSizeFrame RBUF = new RecomendedBufferSizeFrame(FrameID, Flags, Data, Length); if (RBUF.IsReadableFrame) { _RBUFFrame = RBUF; return true; } else AddError(new ID3Error(RBUF.ErrorMessage, FrameID)); break; case "OWNE": OwnershipFrame OWNE = new OwnershipFrame(FrameID, Flags, Data, Length); if (OWNE.IsReadableFrame) { _OWNEFrame = OWNE; return true; } else AddError(new ID3Error(OWNE.ErrorMessage, FrameID)); break; case "COMR": CommercialFrame COMR = new CommercialFrame(FrameID, Flags, Data, Length); if (COMR.IsReadableFrame) { _COMRFrame = COMR; return true; } else AddError(new ID3Error(COMR.ErrorMessage, FrameID)); break; case "RVRB": ReverbFrame RVRB = new ReverbFrame(FrameID, Flags, Data, Length); if (RVRB.IsReadableFrame) { _RVRBFrame = RVRB; return true; } else AddError(new ID3Error(RVRB.ErrorMessage, FrameID)); break; case "EQUA": Equalisation EQUA = new Equalisation(FrameID, Flags, Data, Length); if (EQUA.IsReadableFrame) { _EQUAFrame = EQUA; return true; } else AddError(new ID3Error(EQUA.ErrorMessage, FrameID)); break; case "RVAD": RelativeVolumeFrame RVAD = new RelativeVolumeFrame(FrameID, Flags, Data, Length); if (RVAD.IsReadableFrame) { _RVADFrame = RVAD; return true; } else AddError(new ID3Error(RVAD.ErrorMessage, FrameID)); break; case "ETCO": EventTimingCodeFrame ETCO = new EventTimingCodeFrame(FrameID, Flags, Data, Length); if (ETCO.IsReadableFrame) { _ETCOFrame = ETCO; return true; } else AddError(new ID3Error(ETCO.ErrorMessage, FrameID)); break; case "POSS": PositionSynchronisedFrame POSS = new PositionSynchronisedFrame(FrameID, Flags, Data, Length); if (POSS.IsReadableFrame) { _POSSFrame = POSS; return true; } else AddError(new ID3Error(POSS.ErrorMessage, FrameID)); break; default: BinaryFrame Temp = new BinaryFrame(FrameID, Flags, Data, Length); if (Temp.IsReadableFrame) { _UnknownFrames.Add(Temp); return true; } else AddError(new ID3Error(Temp.ErrorMessage, FrameID)); break; // TODO: Mpeg Location } return false; }