Пример #1
0
        protected override void GetLyricsInternal(Media media)
        {
            var urlArtist = media.Artist.Replace(' ', '-');
            var urlSong   = media.Song.Replace(' ', '-');
            var url       = $"http://genius.com/{urlArtist}-{urlSong}-lyrics";

            media.Url = url;
            HtmlDocument doc;

            try {
                var web = new HtmlWeb();
                doc = web.Load(url);
            } catch (Exception ex) {
                throw ServiceNotAvailableException.Create(ServiceName, media, ex);
            }

            var lyricDivs = doc.DocumentNode.Descendants("div").Where(n => (n as HtmlNode).HasClass("lyrics")).ToList();

            if (!lyricDivs.Any())
            {
                throw LyricsNotFoundException.Create(ServiceName, media);
            }
            if (lyricDivs.Count > 1)
            {
                //todo: Do we need to select one in this case?
                Console.WriteLine("todo..");
            }
            var lyricNode = lyricDivs.First();
            var lyrics    = lyricNode.InnerText;

            media.Lyrics = lyrics;
        }
Пример #2
0
        protected override void GetLyricsInternal(Media media)
        {
            const string userAgent = "curl/7.9.8 (i686-pc-linux-gnu) libcurl 7.9.8 (OpenSSL 0.9.6b) (ipv6 enabled)";
            var          artist    = media.Artist.Replace(' ', '-');
            var          song      = media.Song.Replace(' ', '-');
            var          url       = $"https://www.musixmatch.com/search/{artist}-{song}/tracks";

            media.Url = url;

            string html;

            try {
                html = HttpHelpers.GetHtml(url, userAgent);
            } catch (Exception ex) {
                throw ServiceNotAvailableException.Create(ServiceName, media, ex);
            }

            var rgx = new Regex(@"""track_share_url"":""([^""]*)""");

            if (!rgx.IsMatch(html))
            {
                throw LyricsNotFoundException.Create(ServiceName, media);
            }

            var trackShareUrl = rgx.Match(html).Groups[1].Value;

            trackShareUrl = Regex.Unescape(trackShareUrl);
            media.Url     = trackShareUrl; //unsure about this one
            HtmlDocument doc = new HtmlDocument();

            try {
                html = HttpHelpers.GetHtml(trackShareUrl, userAgent);
                doc.LoadHtml(html);
            } catch (Exception ex) {
                throw ServiceNotAvailableException.Create(ServiceName, media, ex);
            }
            var notAvailable = doc.DocumentNode.Descendants("div").Any(n => (n as HtmlNode).HasClass("mxm-lyrics-not-available"));

            if (notAvailable)
            {
                throw LyricsNotFoundException.Create(ServiceName, media);
            }

            var lyrics = doc.DocumentNode.OuterHtml.Split(new[] { "\"body\":\"" }, StringSplitOptions.None)[1].Split(new[] { "\",\"language\":\"" }, StringSplitOptions.None)[0];

            lyrics       = lyrics.Replace("\\n", Environment.NewLine).Replace("\\", "");
            media.Lyrics = lyrics;
        }
Пример #3
0
        public Media GetLyrics(Media media)
        {
            if (!_lyricsCache.ContainsKey(media.Artist + media.Song))
            {
                if (_notFound.ContainsKey(media.Artist + media.Song))
                {
                    throw LyricsNotFoundException.Create(ServiceName, _notFound[media.Artist + media.Song]);
                }

                try {
                    GetLyricsInternal(media);
                } catch {
                    _notFound[media.Artist + media.Song] = media;
                    throw;
                }
                media.Lyrics = media.Lyrics.Replace("&", "&").Replace("`", "'").Trim();
                _lyricsCache.Add(media.Artist + media.Song, media);
            }
            return(_lyricsCache[media.Artist + media.Song]);
        }