├── commiter.yml ├── server.rb ├── sky.js └── lyrics.rb /commiter.yml: -------------------------------------------------------------------------------- 1 | convention: symphony 2 | -------------------------------------------------------------------------------- /server.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'fileutils' 4 | require 'json' 5 | require 'webrick' 6 | 7 | require_relative 'lyrics' 8 | 9 | server = WEBrick::HTTPServer.new(Port: 3236) 10 | 11 | server.mount_proc '/search' do |req, res| 12 | lyrics = Lyrics.new.search(req.query['artist'], req.query['title']) 13 | res.body = lyrics 14 | end 15 | 16 | trap 'INT' do 17 | server.shutdown 18 | end 19 | 20 | server.start 21 | -------------------------------------------------------------------------------- /sky.js: -------------------------------------------------------------------------------- 1 | /*---------------------------------------------- 2 | Date: 2016/09/06 3 | Author: sky 4 | ----------------------------------------------*/ 5 | 6 | var xmlHttp = new ActiveXObject('Msxml2.ServerXMLHTTP.6.0'); 7 | 8 | function get_my_name() { 9 | return 'Sky'; 10 | } 11 | 12 | function get_version() { 13 | return '0.0.2'; 14 | } 15 | 16 | function get_author() { 17 | return 'sky'; 18 | } 19 | 20 | function start_search(info, callback) { 21 | var searchUrl = 'http://127.0.0.1:3236/search' + '?artist=' + info.Artist + '&title=' + info.Title; 22 | 23 | try { 24 | xmlHttp.open('GET', searchUrl, false); 25 | xmlHttp.send(); 26 | } catch (e) { 27 | return; 28 | } 29 | 30 | var lyrics = callback.CreateLyric(); 31 | 32 | if (xmlHttp.readyState === 4 && xmlHttp.status === 200) { 33 | var lyricsResponse = xmlHttp.responseText; 34 | if (lyricsResponse.length > 0) { 35 | lyrics.Title = info.Title; 36 | lyrics.Artist = info.Artist; 37 | lyrics.Source = get_my_name(); 38 | lyrics.Location = searchUrl; 39 | lyrics.LyricText = lyricsResponse; 40 | callback.AddLyric(lyrics); 41 | } 42 | } 43 | lyrics.Dispose(); 44 | } 45 | -------------------------------------------------------------------------------- /lyrics.rb: -------------------------------------------------------------------------------- 1 | # frozen_string_literal: true 2 | 3 | require 'cgi' 4 | require 'http' 5 | require 'json' 6 | require 'nokogiri' 7 | require 'logger' 8 | 9 | # Handle www.karaoke-lyrics.net 10 | class Lyrics 11 | def initialize 12 | @search_prefix = "https://www.googleapis.com/customsearch/v1/siterestrict?key=AIzaSyCreALAFA-8f3GEak7yId3qewa3E7mdpx4&cx=007107372762293807036%3Atmd12m8bx9e&q=" 13 | @parsers = ['www.karaoke-lyrics.net', 'greenmoriyama.wordpress.com', 'www.lyrical-nonsense.com', 'www.goolyrics.com'] 14 | @logger = Logger.new(STDOUT) 15 | @logger.level = Logger::INFO 16 | 17 | end 18 | 19 | def get(url) 20 | @logger.info url 21 | HTTP.get(url).to_s 22 | end 23 | 24 | def parse_lyrics(url) 25 | host = URI(url).host 26 | @logger.info url 27 | case host 28 | when 'www.karaoke-lyrics.net' 29 | print 'www.karaoke-lyrics.net', url 30 | return Nokogiri::HTML(get(url)) 31 | .at('.lyrics_cont') 32 | .xpath('//span[starts-with(@class, "para_1lyrics")]') 33 | .map(&:text).join("\n") 34 | when 'greenmoriyama.wordpress.com' 35 | return Nokogiri::HTML(get(url)) 36 | .css('.entry-content i') 37 | .map(&:text).join("\n") 38 | when 'www.lyrical-nonsense.com' 39 | return Nokogiri::HTML(get(url)) 40 | .css('#Romaji .olyrictext p') 41 | .map(&:text).join("\n") 42 | when 'www.goolyrics.com' 43 | return Nokogiri::HTML(get(url)) 44 | .css('br').each{ |br| br.replace("\n") } 45 | .css('.lyrics') 46 | .map(&:text).join("\n") 47 | else 48 | @logger.info 'Lyrics not found' 49 | return '' 50 | end 51 | end 52 | 53 | def search(artist, title) 54 | begin 55 | @logger.info "Search Lyrics for #{artist}, #{title}" 56 | api_url = @search_prefix + CGI.escape("#{artist} #{title}") 57 | @logger.info api_url 58 | source_link = JSON.parse(get(api_url))['items'].select{ |e| @parsers.include?(URI(e['link']).host)} 59 | return '' if source_link.empty? 60 | 61 | parse_lyrics(source_link.first['link']) 62 | rescue 63 | return '' 64 | end 65 | end 66 | end 67 | --------------------------------------------------------------------------------