private static async Task <List <WebSong> > SearchMp3ClanAsync(string title, string artist, int limit, bool checkAllLinks) { // mp3clan search doesn't work that well with the pound key (even encoded) var url = string.Format( Mp3ClanSearchUrl, IdentfyMatchTrack.CreateQuery(title.Contains("#") ? title.Replace("#", string.Empty) : title, artist), limit); using (var client = new HttpClient()) { using (var resp = await client.GetAsync(url).ConfigureAwait(false)) { var json = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); var parseResp = await json.DeserializeAsync <Mp3ClanRoot>().ConfigureAwait(false); if (parseResp == null || parseResp.response == null || !resp.IsSuccessStatusCode) { return(null); } return (await IdentfyMatchTrack.IdentifyMatches(parseResp.response.Select(p => new WebSong(p)).ToList(), title, artist, checkAllLinks)); } } }
private static async Task <List <WebSong> > SearchSoundCloudAsync(string title, string artist, int limit) { var url = string.Format( SoundCloudSearchUrl, ApiKeys.SoundCloudId, limit, IdentfyMatchTrack.CreateQuery(title, artist)); using (var client = new HttpClient()) { using (var resp = await client.GetAsync(url)) { var json = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); var parseResp = await json.DeserializeAsync <SoundCloudRoot>().ConfigureAwait(false); if (parseResp == null || parseResp.Collection == null || !resp.IsSuccessStatusCode) { return(null); } parseResp.Collection.RemoveAll(p => p.StreamUrl == null); foreach (var song in parseResp.Collection) { if (song.StreamUrl.Contains("soundcloud") && !song.StreamUrl.Contains("client_id")) { song.StreamUrl += "?client_id=" + ApiKeys.SoundCloudId; } if (string.IsNullOrEmpty(song.ArtworkUrl)) { song.ArtworkUrl = song.User.AvatarUrl; } if (song.ArtworkUrl.IndexOf('?') > -1) { song.ArtworkUrl = song.ArtworkUrl.Remove(song.ArtworkUrl.LastIndexOf('?')); } song.ProviderNumber = 8; song.ArtworkUrl = song.ArtworkUrl.Replace("large", "t500x500"); } return(await IdentfyMatchTrack.IdentifyMatches(parseResp.Collection.Select(p => new WebSong(p)).ToList(), title, artist, false)); } } }
private static async Task <List <WebSong> > SearchSongilyAsync(string title, string artist, int page, bool checkAllLinks) { var url = string.Format(SongilySearchUrl, WebUtility.UrlEncode(IdentfyMatchTrack.CreateQuery(title, artist, false).ToCleanQuery()), page); using (var client = new HttpClient()) { using (var resp = await client.GetAsync(url).ConfigureAwait(false)) { if (!resp.IsSuccessStatusCode) { return(null); } var html = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); var doc = new HtmlDocument(); doc.LoadHtml(html); // Get the div node with the class='actl' var songNodes = doc.DocumentNode.Descendants("li") .Where( p => p.Attributes.Contains("class") && p.Attributes["class"].Value.Contains("list-group-item")); var songs = new List <WebSong>(); foreach (var songNode in songNodes) { var song = new WebSong { Provider = Mp3Provider.Mp3Truck }; try { var detailNode = songNode.Descendants("small").FirstOrDefault(); if (detailNode != null) { var duration = detailNode.InnerText; var durIndex = duration.IndexOf(":"); if (durIndex > 0) { var seconds = int.Parse(duration.Substring(durIndex + 1, 2)); var minutes = int.Parse(duration.Substring(0, durIndex));; song.Duration = new TimeSpan(0, 0, minutes, seconds); } } } catch (Exception) { song.Duration = new TimeSpan(0, 4, 0); } var songTitle = songNode.Descendants("span") .FirstOrDefault(); if (songTitle == null) { continue; } song.Name = WebUtility.HtmlDecode(songTitle.InnerText).Trim(); var linkNode = songNode.Descendants("a") .FirstOrDefault( p => p.Attributes.Contains("title") && p.Attributes["title"].Value.Contains("Download")); if (linkNode == null) { continue; } song.AudioUrl = "http://songily.com/" + linkNode.Attributes["href"].Value; song.ProviderNumber = 2; songs.Add(song); } return(songs.Any() ? await IdentfyMatchTrack.IdentifyMatches(songs, title, artist, checkAllLinks) : null); } } }
private static async Task <List <WebSong> > SearchMp3TruckAsync(string title, string artist, bool checkAllLinks) { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Referrer = new Uri("https://mp3truck.net/"); var data = new Dictionary <string, string> { { "sort", "relevance" }, { "p", "1" }, { "q", IdentfyMatchTrack.CreateQuery(title, artist) } }; using (var content = new FormUrlEncodedContent(data)) { using (var resp = await client.PostAsync(Mp3TruckSearchUrl, content).ConfigureAwait(false)) { if (!resp.IsSuccessStatusCode) { return(null); } var html = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); var doc = new HtmlDocument(); doc.LoadHtml(html); // Get the div node with the class='actl' var songNodes = doc.DocumentNode.Descendants("div") .Where( p => p.Attributes.Contains("class") && p.Attributes["class"].Value.Contains("actl")); var songs = new List <WebSong>(); foreach (var songNode in songNodes) { var song = new WebSong { Provider = Mp3Provider.Mp3Truck }; if (songNode.Attributes.Contains("data-id")) { song.Id = songNode.Attributes["data-id"].Value; } if (songNode.Attributes.Contains("data-bitrate")) { song.BitRate = int.Parse(songNode.Attributes["data-bitrate"].Value); } if (songNode.Attributes.Contains("data-filesize")) { song.ByteSize = (int)double.Parse(songNode.Attributes["data-filesize"].Value); } if (songNode.Attributes.Contains("data-duration")) { var duration = songNode.Attributes["data-duration"].Value; if (duration.Contains(":")) { var seconds = int.Parse(duration.Substring(duration.Length - 2, 2)); var minutes = int.Parse(duration.Remove(duration.Length - 3)); song.Duration = new TimeSpan(0, 0, minutes, seconds); } else { song.Duration = new TimeSpan(0, 0, 0, int.Parse(duration)); } } var songTitle = songNode.Descendants("div") .FirstOrDefault( p => p.Attributes.Contains("id") && p.Attributes["id"].Value == "title") .InnerText; songTitle = WebUtility.HtmlDecode(songTitle.Substring(0, songTitle.Length - 4)).Trim(); // artist - title var dashIndex = songTitle.IndexOf('-'); if (dashIndex != -1) { var titlePart = songTitle.Substring(dashIndex, songTitle.Length - dashIndex); song.Artist = songTitle.Replace(titlePart, string.Empty).Trim(); songTitle = titlePart.Remove(0, 1).Trim(); } song.Name = songTitle; var linkNode = songNode.Descendants("a") .FirstOrDefault( p => p.Attributes.Contains("class") && p.Attributes["class"].Value.Contains("mp3download")); if (linkNode == null) { continue; } song.AudioUrl = linkNode.Attributes["href"].Value.Replace("/idl.php?u=", string.Empty); song.ProviderNumber = 13; songs.Add(song); } return(songs.Any() ? await IdentfyMatchTrack.IdentifyMatches(songs, title, artist, checkAllLinks) : null); } } } }
private static async Task <List <WebSong> > SearchYoutubeAsync(string title, string artist, int limit, bool includeAudioTag) { YouTubeService youtubeService; youtubeService = new YouTubeService(new BaseClientService.Initializer() { ApiKey = ApiKeys.YouTubeIdMusicus, ApplicationName = "Musicus1" //"Musicus1" }); var searchListRequest = youtubeService.Search.List("snippet"); searchListRequest.Q = IdentfyMatchTrack.CreateQuery(title, artist, false) + (includeAudioTag ? " (Audio)" : ""); searchListRequest.MaxResults = limit; searchListRequest.SafeSearch = SearchResource.ListRequest.SafeSearchEnum.None; try { SearchListResponse searchListResponse; try { // Call the search.list method to retrieve results matching the specified query term. searchListResponse = await searchListRequest.ExecuteAsync(); } catch { youtubeService = new YouTubeService(new BaseClientService.Initializer() { ApiKey = ApiKeys.YoutubeId, ApplicationName = "Airstem" //"Musicus1" }); var o = youtubeService.Search.List("snippet"); o.Q = IdentfyMatchTrack.CreateQuery(title, artist, false) + (includeAudioTag ? " (Audio)" : ""); o.MaxResults = limit; searchListResponse = await o.ExecuteAsync(); if (o != null) { o = null; } } if (searchListRequest != null) { searchListRequest = null; } List <WebSong> songs = new List <WebSong>(); foreach (var vid in from searchResult in searchListResponse.Items where searchResult.Id.Kind == "youtube#video" select new WebSong(searchResult)) { try { vid.AudioUrl = GetYoutubeUrlAsync(vid.Id); } catch { // ignored } if (string.IsNullOrEmpty(vid.AudioUrl)) { continue; } vid.ProviderNumber = 6; songs.Add(vid); } var results = await IdentfyMatchTrack.IdentifyMatches(songs, title, artist, false); // try redoing the search without "(audio)" if (!results.Any(p => p.IsMatch) && includeAudioTag) { return(await SearchYoutube(title, artist, limit, false)); } return(results); } catch { return(null); } }
//get mp3skull public async Task <List <WebSong> > SearchMp3Skull(string title, string artist, bool checkAllLinks = false) { using (var client = new HttpClient()) { var url = string.Format(Mp3SkullSearchUrl, IdentfyMatchTrack.CreateQuery(title, artist), Mp3SkullFckh); using (var resp = await client.GetAsync(url).ConfigureAwait(false)) { if (!resp.IsSuccessStatusCode) { return(null); } var html = await resp.Content.ReadAsStringAsync().ConfigureAwait(false); var doc = new HtmlDocument(); doc.LoadHtml(html); if (html.Contains("You have made too many request")) { return(null); } if (html.Contains("Your search session has expired")) { var fckhNode = doc.DocumentNode.Descendants("input") .FirstOrDefault( p => p.Attributes.Contains("name") && p.Attributes["name"].Value == "fckh"); if (fckhNode == null) { return(null); } Mp3SkullFckh = fckhNode.Attributes["value"].Value; return(await SearchMp3Skull(title, artist)); } // Get the div node var songNodes = doc.DocumentNode.Descendants("div").Where(p => p.Id == "song_html"); var songs = new List <WebSong>(); foreach (var songNode in songNodes) { var song = new WebSong(); //{ Provider = Mp3Provider.Mp3Skull }; var songUrlNode = songNode.Descendants("a").FirstOrDefault(p => p.InnerText == "Download"); if (songUrlNode == null) { continue; } song.AudioUrl = songUrlNode.Attributes["href"].Value; var songInfo = songNode.Descendants("div") .FirstOrDefault(p => p.Attributes["class"].Value == "left") .InnerText.Replace("<!-- info mp3 here -->", string.Empty) .Trim(); var bitRateIndex = songInfo.IndexOf("kbps", StringComparison.Ordinal); if (bitRateIndex > -1) { var bitrateTxt = songInfo.Substring(0, bitRateIndex); int bitrate; if (int.TryParse(bitrateTxt, out bitrate)) { song.BitRate = bitrate; } } #region Duration if (bitRateIndex > -1) { songInfo = songInfo.Remove(0, bitRateIndex + 4); } var durationIndex = songInfo.IndexOf(":", StringComparison.Ordinal); if (durationIndex > -1) { var durationText = songInfo.Substring(0, durationIndex + 3); var seconds = int.Parse(durationText.Substring(durationText.Length - 2, 2)); var minutes = int.Parse(durationText.Remove(durationText.Length - 3)); song.Duration = new TimeSpan(0, 0, minutes, seconds); } #endregion #region Size if (durationIndex > -1) { songInfo = songInfo.Remove(0, durationIndex + 3); } var sizeIndex = songInfo.IndexOf("mb", StringComparison.Ordinal); if (sizeIndex > -1) { var sizeText = songInfo.Substring(0, sizeIndex); long size; if (long.TryParse(sizeText, out size)) { song.ByteSize = (long)(size * (1024 * 1024.0)); } } #endregion var songTitle = songNode.Descendants("b").FirstOrDefault().InnerText; songTitle = songTitle.Substring(0, songTitle.Length - 4).Trim(); song.Name = songTitle; //song.ProviderNumber = 9; songs.Add(song); } return(songs.Any() ? await IdentfyMatchTrack.IdentifyMatches(songs, title, artist, checkAllLinks) : null); } } }