From: <sa...@us...> - 2007-04-14 14:28:18
|
Revision: 328 http://mp-plugins.svn.sourceforge.net/mp-plugins/?rev=328&view=rev Author: saamand Date: 2007-04-14 07:28:15 -0700 (Sat, 14 Apr 2007) Log Message: ----------- Modified Paths: -------------- trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj trunk/plugins/MyLyrics/MyLyrics.suo Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs 2007-04-14 04:44:03 UTC (rev 327) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics.cs 2007-04-14 14:28:15 UTC (rev 328) @@ -7,6 +7,8 @@ using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using System.Text; +using System.Collections.Generic; +using System.Timers; using LyricsEngine; using LyricsEngineConfig; @@ -18,6 +20,8 @@ using MediaPortal.Music.Database; using MediaPortal.Playlists; using MediaPortal.Util; +using MediaPortal.GUI.Music; + using System.Collections; namespace MyLyrics @@ -40,6 +44,19 @@ bool newTrack = false; bool alreadyValidLRC = false; + private string CurrentThumbFileName = string.Empty; + private MusicTag PreviousTrackTag = null; + private MusicTag CurrentTrackTag = null; + private MusicTag NextTrackTag = null; + private bool UseID3 = false; + private List<String> ImagePathContainer = null; + private System.Timers.Timer ImageChangeTimer = null; + private object _imageMutex = null; + private string CurrentTrackFileName = string.Empty; + private string NextTrackFileName = string.Empty; + private PlayListPlayer PlaylistPlayer = null; + + // worker thread Thread m_LyricControllerThread; LyricsController lc; @@ -99,6 +116,12 @@ CONTROL_VIEW_LINE = 400, CONTROL_VIEW_LINE_DONE = 500 } + + [SkinControlAttribute((int)GUI_LRC_Controls.CONTROL_ART_ALBUMART)] + protected GUIImage GUIelement_ImgCoverArt = null; + [SkinControlAttribute((int)GUI_LRC_Controls.CONTROL_ART_PROGRESS)] + protected GUIProgressControl GUIelement_ProgTrack = null; + #endregion #region Fields related to LRC mode @@ -110,6 +133,7 @@ Stopwatch stopwatch; string nextTimeToShow; string nextLineToShow; + bool shiftPageNextTime = false; #endregion @@ -132,6 +156,10 @@ { m_EventStopThread = new ManualResetEvent(false); + ImagePathContainer = new List<string>(); + _imageMutex = new Object(); + PlaylistPlayer = PlayListPlayer.SingletonPlayer; + GetID = (int)GUIMyLyrics.WINDOW_MYLYRICS; } @@ -175,22 +203,23 @@ { alreadyValidLRC = false; + CurrentTrackTag = new MusicTag(); + CurrentTrackTag.Artist = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Artist")); + CurrentTrackTag.Title = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Title")); + if (selectedScreen == (int)MyLyricsSettings.Screen.LRC_BASIC || selectedScreen == (int)MyLyricsSettings.Screen.LRC_WIDE) { lyricsFound = false; StopThread(); newTrack = false; - MusicTag tag = new MusicTag(); - tag.Artist = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Artist")); - tag.Title = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Title")); - m_artist = tag.Artist; - m_title = tag.Title; + m_artist = CurrentTrackTag.Artist; + m_title = CurrentTrackTag.Title; // Get lyric - if (!tag.Artist.Equals("")) + if (!CurrentTrackTag.Artist.Equals("")) { - findLyric(tag); + findLyric(); } else { @@ -202,6 +231,8 @@ m_LyricText = ""; GUIControl.SetControlLabel(GetID, (int)GUI_Lyrics_Controls.CONTROL_Lyric, m_LyricText); } + + getAlbumArt(); } else if (selectedScreen == (int)MyLyricsSettings.Screen.LRC_EDITOR) { @@ -223,23 +254,60 @@ } else if (!exitingMyLyrics) { + getAlbumArt(); startSearch(); } } base.Process(); } + public void getAlbumArt() + { + ImagePathContainer.Clear(); + CurrentTrackFileName = g_Player.CurrentFile; + GetTrackTags(); + + CurrentThumbFileName = GUIMusicFiles.GetCoverArt(false, CurrentTrackFileName, CurrentTrackTag); + if (CurrentThumbFileName.Length > 0) + { + // let us test if there is a larger cover art image + string strLarge = MediaPortal.Util.Utils.ConvertToLargeCoverArt(CurrentThumbFileName); + if (System.IO.File.Exists(strLarge)) + CurrentThumbFileName = strLarge; + AddImageToImagePathContainer(CurrentThumbFileName); + } + + CurrentThumbFileName = GUIMusicFiles.GetArtistCoverArtName(CurrentTrackTag.Artist); + if (CurrentThumbFileName.Length > 0) + { + // let us test if there is a larger cover art image + string strLarge = MediaPortal.Util.Utils.ConvertToLargeCoverArt(CurrentThumbFileName); + if (System.IO.File.Exists(strLarge)) + CurrentThumbFileName = strLarge; + AddImageToImagePathContainer(CurrentThumbFileName); + } + + UpdateImagePathContainer(); + } + + private void UpdateTrackPosition() + { + double trackDuration = g_Player.Duration; + double curTrackPostion = g_Player.CurrentPosition; + + int progPrecent = (int)(curTrackPostion / trackDuration * 100d); + + this.GUIelement_ProgTrack.Percentage = progPrecent; + GUIelement_ProgTrack.Visible = GUIelement_ProgTrack.Percentage > 0; + } + private void startSearch() { lyricsFound = false; StopThread(); newTrack = false; - MusicTag tag = new MusicTag(); - tag.Artist = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Artist")); - tag.Title = LyricUtil.capatalizeString(GUIPropertyManager.GetProperty("#Play.Current.Title")); - - if (!tag.Artist.Equals("")) findLyric(tag); + if (!CurrentTrackTag.Artist.Equals("")) findLyric(); else { m_artist = ""; @@ -287,6 +355,7 @@ using (MediaPortal.Profile.Settings xmlreader = new MediaPortal.Profile.Settings("MediaPortal.xml")) { + UseID3 = xmlreader.GetValueAsBool("musicfiles", "showid3", true); useLyricWiki = ((string)xmlreader.GetValueAsString("myLyrics", "useLyricWiki", "True")).ToString().Equals("True") ? true : false; useEvilLabs = ((string)xmlreader.GetValueAsString("myLyrics", "useEvilLabs", "True")).ToString().Equals("True") ? true : false; useLyrics007 = ((string)xmlreader.GetValueAsString("myLyrics", "useLyrics007", "True")).ToString().Equals("True") ? true : false; @@ -367,7 +436,66 @@ return base.OnMessage(message); } + protected override void OnPageLoad() + { + base.OnPageLoad(); + if (ImageChangeTimer == null) + { + ImageChangeTimer = new System.Timers.Timer(); + ImageChangeTimer.Interval = 3600 * 1000; + ImageChangeTimer.Elapsed += new ElapsedEventHandler(OnImageTimerTickEvent); + ImageChangeTimer.Start(); + } + + //if (g_Player.Playing) + //{ + // g_Player_PlayBackStarted(g_Player.MediaType.Music, g_Player.CurrentFile); + + // SetVisualizationWindow(); + //} + } + + private void OnImageTimerTickEvent(object trash_, ElapsedEventArgs args_) + { + FlipPictures(); + } + + private void FlipPictures() + { + //// Check if we should let the visualization window handle image flipping + //if (_usingBassEngine && _showVisualization) + // return; + + if (GUIelement_ImgCoverArt != null) + { + GUIelement_ImgCoverArt.FreeResources(); + if (ImagePathContainer.Count > 0) + { + if (ImagePathContainer.Count > 1) + { + int currentImage = 0; + // get the next image + foreach (string image in ImagePathContainer) + { + currentImage++; + if (GUIelement_ImgCoverArt.FileName == image) + break; + } + if (currentImage < ImagePathContainer.Count) + GUIelement_ImgCoverArt.SetFileName(ImagePathContainer[currentImage]); + else + // start loop again + GUIelement_ImgCoverArt.SetFileName(ImagePathContainer[0]); + } + else + GUIelement_ImgCoverArt.SetFileName(ImagePathContainer[0]); + } + GUIelement_ImgCoverArt.AllocResources(); + } + } + + public override void OnAction(Action action) { switch (action.wID) @@ -430,8 +558,235 @@ GUIControl.SetControlLabel(GetID, (int)GUI_Lyrics_Controls.CONTROL_Lyric, m_LyricText); } } + else if (selectedScreen == (int)MyLyricsSettings.Screen.LYRICS_BASIC || selectedScreen == (int)MyLyricsSettings.Screen.LRC_BASIC) + { + UpdateTrackPosition(); + } } + private void GetTrackTags() + { + bool isCurSongCdTrack = IsCdTrack(CurrentTrackFileName); + bool isNextSongCdTrack = IsCdTrack(NextTrackFileName); + MusicDatabase dbs = new MusicDatabase(); + + if (CurrentTrackTag != null) + PreviousTrackTag = CurrentTrackTag; + + if (!isCurSongCdTrack) + CurrentTrackTag = GetTrackTag(dbs, CurrentTrackFileName, UseID3); + + if (!isNextSongCdTrack) + NextTrackTag = GetTrackTag(dbs, NextTrackFileName, UseID3); + + if (isCurSongCdTrack || isNextSongCdTrack) + { + PlayList curPlaylist = PlaylistPlayer.GetPlaylist(PlayListType.PLAYLIST_MUSIC); + + int iCurItemIndex = PlaylistPlayer.CurrentSong; + PlayListItem curPlaylistItem = curPlaylist[iCurItemIndex]; + + if (curPlaylistItem == null) + { + CurrentTrackTag = null; + NextTrackTag = null; + return; + } + + int playListItemCount = curPlaylist.Count; + int nextItemIndex = 0; + + if (iCurItemIndex < playListItemCount - 1) + nextItemIndex = iCurItemIndex + 1; + + PlayListItem nextPlaylistItem = curPlaylist[nextItemIndex]; + + if (isCurSongCdTrack) + CurrentTrackTag = (MusicTag)curPlaylistItem.MusicTag; + + if (isNextSongCdTrack && nextPlaylistItem != null) + NextTrackTag = (MusicTag)nextPlaylistItem.MusicTag; + + // There's no MusicTag info in the Playlist so check is we have a valid + // GUIMusicFiles.MusicCD object + if ((CurrentTrackTag == null || NextTrackTag == null) && GUIMusicFiles.MusicCD != null) + { + int curCDTrackNum = GetCDATrackNumber(CurrentTrackFileName); + int nextCDTrackNum = GetCDATrackNumber(NextTrackFileName); + + if (curCDTrackNum < GUIMusicFiles.MusicCD.Tracks.Length) + { + MediaPortal.Freedb.CDTrackDetail curTrack = GUIMusicFiles.MusicCD.getTrack(curCDTrackNum); + CurrentTrackTag = GetTrackTag(curTrack); + } + if (nextCDTrackNum < GUIMusicFiles.MusicCD.Tracks.Length) + { + MediaPortal.Freedb.CDTrackDetail nextTrack = GUIMusicFiles.MusicCD.getTrack(nextCDTrackNum); + NextTrackTag = GetTrackTag(nextTrack); + } + } + } + } + + private bool IsCdTrack(string fileName) + { + return System.IO.Path.GetExtension(CurrentTrackFileName).ToLower() == ".cda"; + } + + int GetCDATrackNumber(string strFile) + { + string strTrack = string.Empty; + int pos = strFile.IndexOf(".cda"); + if (pos >= 0) + { + pos--; + while (Char.IsDigit(strFile[pos]) && pos > 0) + { + strTrack = strFile[pos] + strTrack; + pos--; + } + } + + try + { + int iTrack = Convert.ToInt32(strTrack); + return iTrack; + } + catch (Exception) + { + } + + return 1; + } + + private MusicTag GetTrackTag(MediaPortal.Freedb.CDTrackDetail cdTrack) + { + if (GUIMusicFiles.MusicCD == null) + return null; + MusicTag tag = new MusicTag(); + tag.Artist = GUIMusicFiles.MusicCD.Artist; + tag.Album = GUIMusicFiles.MusicCD.Title; + tag.Genre = GUIMusicFiles.MusicCD.Genre; + tag.Year = GUIMusicFiles.MusicCD.Year; + tag.Duration = cdTrack.Duration; + tag.Title = cdTrack.Title; + return tag; + } + + private MusicTag GetTrackTag(MusicDatabase dbs, string strFile, bool useID3) + { + MusicTag tag = null; + Song song = new Song(); + bool bFound = dbs.GetSongByFileName(strFile, ref song); + if (!bFound) + { + if (useID3) + tag = TagReader.ReadTag(strFile); + } + else + { + tag = new MusicTag(); + tag = BuildMusicTagFromSong(song); + } + return tag; + } + + private MusicTag BuildMusicTagFromSong(Song Song_) + { + MusicTag tmpTag = new MusicTag(); + + tmpTag.Title = Song_.Title; + tmpTag.Album = Song_.Album; + tmpTag.Artist = Song_.Artist; + tmpTag.Duration = Song_.Duration; + tmpTag.Genre = Song_.Genre; + tmpTag.Track = Song_.Track; + tmpTag.Year = Song_.Year; + tmpTag.Rating = Song_.Rating; + + return tmpTag; + } + + + private void UpdateImagePathContainer() + { + if (ImagePathContainer.Count <= 0) + { + try + { + GUIelement_ImgCoverArt.SetFileName(GUIGraphicsContext.Skin + @"\media\missing_coverart.png"); + } + catch (Exception ex) + { + Log.Debug("GUIMusicPlayingNow: could not set default image - {0}", ex.Message); + } + } + + if (g_Player.Duration > 0 && ImagePathContainer.Count > 1) + // ImageChangeTimer.Interval = (g_Player.Duration * 1000) / (ImagePathContainer.Count * 8); // change each cover 8x + ImageChangeTimer.Interval = 15 * 1000; // change covers every 15 seconds + else + ImageChangeTimer.Interval = 3600 * 1000; + + ImageChangeTimer.Stop(); + ImageChangeTimer.Start(); + } + + private bool AddImageToImagePathContainer(string newImage) + { + lock (_imageMutex) + { + string ImagePath = Convert.ToString(newImage); + if (ImagePath.IndexOf(@"missing_coverart") > 0)// && (ImagePathContainer.Count > 0)) + { + Log.Debug("GUIMusicPlayingNow: Found placeholder - not inserting image {0}", ImagePath); + return false; + } + + bool success = false; + if (ImagePathContainer != null) + { + if (ImagePathContainer.Contains(ImagePath)) + return false; + + //// check for placeholder + //int indexDel = 0; + //bool found = false; + //foreach (string pic in ImagePathContainer) + //{ + // indexDel++; + // if (pic.IndexOf("missing_coverart.png") > 0) + // { + // found = true; + // break; + // } + //} + //if (found) + // ImagePathContainer.RemoveAt(indexDel - 1); + + if (System.IO.File.Exists(ImagePath)) + { + try + { + Log.Debug("GUIMusicPlayingNow: adding image to container - {0}", ImagePath); + ImagePathContainer.Add(ImagePath); + success = true; + } + catch (Exception ex) + { + Log.Error("GUIMusicPlayingNow: error adding image ({0}) - {1}", ImagePath, ex.Message); + } + + // display the first pic automatically + if (ImagePathContainer.Count == 1) + FlipPictures(); + } + } + + return success; + } + } + //event driven handler to detect track change private void timeHandler(string tag2, string value) { @@ -456,17 +811,17 @@ /// </summary> /// <param name="tag"></param> - private void findLyric(MusicTag tag) + private void findLyric() { m_EventStopThread.Reset(); GUIControl.ClearControl(GetID, (int)GUI_Lyrics_Controls.CONTROL_Lyric); GUIControl.SetControlLabel(GetID, (int)GUI_Lyrics_Controls.CONTROL_Lyric, ""); - if (tag != null && tag.Artist != "") + if (CurrentTrackTag != null && CurrentTrackTag.Artist != "") { - m_artist = tag.Artist.Trim(); - m_title = tag.Title.Trim(); + m_artist = CurrentTrackTag.Artist.Trim(); + m_title = CurrentTrackTag.Title.Trim(); m_TrackText = m_artist + " - " + m_title; m_StatusText = "Searching for a matching lyric..."; GUIControl.SetControlLabel(GetID, (int)GUI_General_Controls.CONTROL_LBStatus, m_StatusText); @@ -484,7 +839,7 @@ // 1) + 2) Check if LRC in music tag or Database string lyricText = MyLyrics.DatabaseUtil.LookUpLyricInDatabase(LyricsDB, m_artist, m_title); - if ((!tag.Lyrics.Equals("") && (lrc = new LRC.SimpleLRC(m_artist, m_title, tag.Lyrics)).IsValid) + if ((!CurrentTrackTag.Lyrics.Equals("") && (lrc = new LRC.SimpleLRC(m_artist, m_title, CurrentTrackTag.Lyrics)).IsValid) || (!lyricText.Equals("") && (lrc = new LRC.SimpleLRC(m_artist, m_title, lyricText)).IsValid)) { resetLrcFields(); @@ -546,9 +901,9 @@ } // 2) Lyric in music tag - else if (!tag.Lyrics.Equals("")) + else if (!CurrentTrackTag.Lyrics.Equals("")) { - ShowLyricOnScreen(tag.Lyrics, tag.FileName); + ShowLyricOnScreen(CurrentTrackTag.Lyrics, CurrentTrackTag.FileName); } // 3) if lyric in music database @@ -604,6 +959,14 @@ currentLRCLine = 0; ++tagRoundFinished; + + for (int i = 0; i < TAG_IN_ROUND; i++) + { + GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_EDIT_TIME + i, ""); + GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_EDIT_LINE + i, ""); + GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_EDIT_LINE_DONE + i, ""); + } + try { for (int i = 0; i < TAG_IN_ROUND && LRCLinesTotal + i < lines.Length; i++) @@ -619,7 +982,15 @@ } else { - MessageBox.Show("The lyric has now completely been converted into a lrc!"); + GUIDialogOK dlg = (GUIDialogOK)GUIWindowManager.GetWindow( + (int)GUIWindow.Window.WINDOW_DIALOG_OK); + dlg.SetHeading("Creating of LRC"); + dlg.SetLine(1, "The lyric has been converted"); + dlg.SetLine(2, "to a LRC!"); + dlg.SetLine(3, String.Empty); + dlg.DoModal(GUIWindowManager.ActiveWindow); + + StringBuilder lyric = new StringBuilder(); for (int i = 0; i < lines.Length; i++) { @@ -651,6 +1022,22 @@ public void OnTimerEvent(object source, EventArgs e) { + if (shiftPageNextTime) + { + try + { + resetGUI(selectedScreen); + for (int i = 0; i < TAG_IN_ROUND; i++) + { + GUIControl.ShowControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE + i); + GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE_DONE + i); + GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE + i, lines[tagRoundFinished * TAG_IN_ROUND + i]); + GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE_DONE + i, lines[tagRoundFinished * TAG_IN_ROUND + i]); + } + } + catch { ;}; + } + GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE + currentLRCLine); GUIControl.ShowControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE_DONE + currentLRCLine); @@ -663,18 +1050,7 @@ currentLRCLine = 0; ++tagRoundFinished; - try - { - resetGUI(selectedScreen); - for (int i = 0; i < TAG_IN_ROUND; i++) - { - GUIControl.ShowControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE + i); - GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE_DONE + i); - GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE + i, lines[tagRoundFinished * TAG_IN_ROUND + i]); - GUIControl.SetControlLabel(GetID, (int)GUI_LRC_Controls.CONTROL_VIEW_LINE_DONE + i, lines[tagRoundFinished * TAG_IN_ROUND + i]); - } - } - catch {;}; + shiftPageNextTime = true; } } @@ -838,6 +1214,7 @@ private void resetGUI(int screenID) { selectedScreen = screenID; + shiftPageNextTime = false; GUIPropertyManager.OnPropertyChanged -= new GUIPropertyManager.OnPropertyChangedHandler(trackChangeHandler); GUIPropertyManager.OnPropertyChanged -= new GUIPropertyManager.OnPropertyChangedHandler(timeHandler); @@ -975,7 +1352,7 @@ GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_ART_ALBUMART); GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_ART_PROGRESS); GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_ART_PROGRESSIMAGE); - + // LRC controls GUIControl.HideControl(GetID, (int)GUI_LRC_Controls.CONTROL_TAGBUTTON); @@ -1030,6 +1407,7 @@ } } + #region ILyricForm properties public Object[] UpdateString { Modified: trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj =================================================================== --- trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj 2007-04-14 04:44:03 UTC (rev 327) +++ trunk/plugins/MyLyrics/My Lyrics/MyLyrics.csproj 2007-04-14 14:28:15 UTC (rev 328) @@ -59,6 +59,10 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\..\..\..\..\..\..\..\Program Files\Team Mediaportal\MediaPortal\Utils.DLL</HintPath> </Reference> + <Reference Include="WindowPlugins, Version=0.2.2.0, Culture=neutral, processorArchitecture=x86"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\..\..\..\..\..\..\Program Files\Team Mediaportal\MediaPortal\Plugins\Windows\WindowPlugins.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="Convert\ConvertFromXMLtoLyricsDatabase.cs" /> Modified: trunk/plugins/MyLyrics/MyLyrics.suo =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |