public static Tuple <LyricPage, LyricState> SearchLyricFromNcma(long musicId) { var api = new Ncma(); LyricResult result; try { result = api.Lyric(musicId); } catch (Exception ex) { Console.WriteLine(ex); return(new Tuple <LyricPage, LyricState>(null, LyricState.NotFound)); } Console.WriteLine($"> lyric response code: {result.Code}, No lyric: {result.Nolyric}, lrc: {result.Lrc?.Lyric?.Length ?? 0}"); if (result.Code == 200) { if (result.Nolyric) { return(new Tuple <LyricPage, LyricState>(null, LyricState.NoLyric)); } var lp = LyricPage.ParseLyricPage(result.Lrc?.Lyric ?? ""); if (lp != null && lp.Lines.Count > 0) { return(new Tuple <LyricPage, LyricState>(lp, LyricState.Found)); } } return(new Tuple <LyricPage, LyricState>(null, LyricState.NotFound)); }
public static Song SearchMusicFromNcma(Metadata metadata) { var api = new Ncma(); // search song foreach (var keyword in GetSearchKeywords(metadata)) { Console.WriteLine($">>>>>>>>>>>>>>>>>>>>>>\n> search song keyword: {keyword}"); SearchResult searchSongResult; try { searchSongResult = api.Search(keyword, Ncma.SearchType.Song); } catch (Exception ex) { Console.WriteLine(ex.Message); continue; // ex } Console.WriteLine($"> search result code: {searchSongResult.Code}"); if (searchSongResult.Code == 200) { var result = FilterSongInSearchResult(searchSongResult, metadata, Ncma.SearchType.Song); if (result != null) { return(result); } } } // search album Console.WriteLine($">>>>>>>>>>>>>>>>>>>>>>\n> Search album keyword: {metadata.Album}"); SearchResult searchAlbumResult; try { searchAlbumResult = api.Search(metadata.Album, Ncma.SearchType.Album); } catch (Exception ex) { Console.WriteLine(ex.Message); return(null); // ex } if (searchAlbumResult.Code == 200) { var result = FilterSongInSearchResult(searchAlbumResult, metadata, Ncma.SearchType.Album); if (result != null) { return(result); } } return(null); // not found }
private static Song FilterSongInSearchResult(SearchResult sr, Metadata metadata, Ncma.SearchType type) { var api = new Ncma(); var artists = metadata.Artist.Split(new string[] { "/", "|", "," }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()); bool CheckCorrectSong(Song s) { // check album Console.WriteLine($"> check album: {s.Al.Name} | {metadata.Album}"); if (s.Al.Name.Trim() != metadata.Album.Trim()) { return(false); } // check artists var ars = s.Ar.Select(a => a.Name.Trim()); Console.WriteLine($"> check artists: {string.Join(",", ars)} | {string.Join(",", artists)}"); if (artists.Any(a => !ars.Contains(a))) { return(false); } // check song title Console.WriteLine($"> check title: {s.Name} | {metadata.Title}"); if (s.Name.Trim() == metadata.Title.Trim()) { return(true); } var titles1 = metadata.Title.Split(new string[] { "(", ")" }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()).ToList(); var titles2 = s.Name.Split(new string[] { "(", ")" }, StringSplitOptions.RemoveEmptyEntries).Select(a => a.Trim()).ToList(); if (titles1.Count > 1 && titles2.Count > 1) { return(titles1[0] == titles2[0] && titles1[1] == titles2[1]); } return(titles1[0] == titles2[0]); } bool CheckCorrectAlbum(Album al) { // check album name if (al.Name.Trim() != metadata.Title.Trim()) { return(false); } // check artists var ars = al.Artists.Select(a => a.Name.Trim()); return(artists.All(a => ars.Contains(a))); } if (type == Ncma.SearchType.Song) { if ((sr?.Result?.Songs?.Count ?? 0) == 0) { return(null); } foreach (var song in sr.Result.Songs) // for each songs { if (CheckCorrectSong(song)) { return(song); } } } else if (type == Ncma.SearchType.Album) { if ((sr?.Result?.Albums?.Count ?? 0) == 0) { return(null); } foreach (var album in sr.Result.Albums) // for each albums { if (CheckCorrectAlbum(album)) { AlbumResult albumResult; try { albumResult = api.Album(album.Id); } catch (Exception ex) { Console.WriteLine(ex); continue; } if (albumResult.Code == 200 && albumResult.Songs != null) { foreach (var song in albumResult.Songs) // for each songs in album { if (CheckCorrectSong(song)) { return(song); } } } } } } return(null); }