Example #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;
        }
Example #2
0
        /// <summary>
        /// Returns an action result based on the input application exception
        /// </summary>
        /// <param name="ex"></param>
        /// <returns></returns>
        public static IActionResult ToActionResult(this ApplicationException ex)
        {
            return(ex switch
            {
                BadRequestException _ => new BadRequestObjectResult(ex.Message), //400

                ServiceNotAvailableException _ => new StatusCodeResult(503),

                _ => (IActionResult) new BadRequestResult(),
            });
Example #3
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;
        }
Example #4
0
 protected override void GetLyricsInternal(Media media)
 {
     throw ServiceNotAvailableException.Create(ServiceName, media, null);
 }