Beispiel #1
0
        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));
                }
            }
        }
Beispiel #2
0
        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));
                }
            }
        }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #4
0
        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);
                    }
                }
            }
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
        //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);
                }
            }
        }