lyrics-ebook 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +340 -0
- data/README +46 -0
- data/bin/lyrics-ebook +47 -0
- data/lib/eeepub/LICENSE +20 -0
- data/lib/eeepub/README.md +77 -0
- data/lib/eeepub/Rakefile +49 -0
- data/lib/eeepub/VERSION +1 -0
- data/lib/eeepub/examples/files/bar.html +42 -0
- data/lib/eeepub/examples/files/foo.html +42 -0
- data/lib/eeepub/examples/simple_epub.rb +25 -0
- data/lib/eeepub/lib/eeepub.rb +17 -0
- data/lib/eeepub/lib/eeepub/container_item.rb +108 -0
- data/lib/eeepub/lib/eeepub/easy.rb +100 -0
- data/lib/eeepub/lib/eeepub/maker.rb +127 -0
- data/lib/eeepub/lib/eeepub/ncx.rb +68 -0
- data/lib/eeepub/lib/eeepub/ocf.rb +112 -0
- data/lib/eeepub/lib/eeepub/opf.rb +148 -0
- data/lib/eeepub/spec/eeepub/easy_spec.rb +66 -0
- data/lib/eeepub/spec/eeepub/maker_spec.rb +124 -0
- data/lib/eeepub/spec/eeepub/ncx_spec.rb +80 -0
- data/lib/eeepub/spec/eeepub/ocf_spec.rb +43 -0
- data/lib/eeepub/spec/eeepub/opf_spec.rb +262 -0
- data/lib/eeepub/spec/eeepub_spec.rb +4 -0
- data/lib/eeepub/spec/spec_helper.rb +12 -0
- data/lib/lyrics_ebook.rb +71 -0
- data/lib/lyrics_ebook/cache2html.rb +33 -0
- data/lib/lyrics_ebook/cache_manager.rb +77 -0
- data/lib/lyrics_ebook/lyric.rb +32 -0
- data/lib/lyrics_ebook/lyric_download.rb +50 -0
- data/lib/lyrics_ebook/lyrics2html.rb +106 -0
- data/lib/lyrics_ebook/mini_lyrics_parser.rb +26 -0
- data/lib/lyrics_ebook/mp3_parser.rb +37 -0
- data/lib/wiki_lyrics/amarok/COPYING +340 -0
- data/lib/wiki_lyrics/amarok/README +51 -0
- data/lib/wiki_lyrics/amarok/amarok.rb +355 -0
- data/lib/wiki_lyrics/amarok/pluginadapter.rb +113 -0
- data/lib/wiki_lyrics/amarok/plugins.rb +95 -0
- data/lib/wiki_lyrics/amarok/wikilyrics.rb +578 -0
- data/lib/wiki_lyrics/amarok/wikilyrics.spec +4 -0
- data/lib/wiki_lyrics/amarok/wikipluginadapter.rb +392 -0
- data/lib/wiki_lyrics/cli/optionsparser.rb +228 -0
- data/lib/wiki_lyrics/cli/pluginadapter.rb +56 -0
- data/lib/wiki_lyrics/cli/plugins.rb +79 -0
- data/lib/wiki_lyrics/cli/wikilyrics.rb +178 -0
- data/lib/wiki_lyrics/cli/wikipluginadapter.rb +140 -0
- data/lib/wiki_lyrics/docs/COPYING +340 -0
- data/lib/wiki_lyrics/docs/ChangeLog +293 -0
- data/lib/wiki_lyrics/docs/HOWTO.pdf +0 -0
- data/lib/wiki_lyrics/docs/HOWTO.tex +151 -0
- data/lib/wiki_lyrics/docs/HOWTO.txt +139 -0
- data/lib/wiki_lyrics/docs/README +45 -0
- data/lib/wiki_lyrics/docs/TODO +12 -0
- data/lib/wiki_lyrics/gui/gui-gtk.rb +945 -0
- data/lib/wiki_lyrics/gui/gui-qt3.rb +785 -0
- data/lib/wiki_lyrics/gui/gui-qt4.rb +845 -0
- data/lib/wiki_lyrics/gui/gui-tk.rb +1104 -0
- data/lib/wiki_lyrics/gui/gui.rb +268 -0
- data/lib/wiki_lyrics/gui/test.rb +74 -0
- data/lib/wiki_lyrics/i18n/README +1 -0
- data/lib/wiki_lyrics/i18n/en.rb +181 -0
- data/lib/wiki_lyrics/i18n/es.rb +181 -0
- data/lib/wiki_lyrics/i18n/i18n.rb +126 -0
- data/lib/wiki_lyrics/i18n/sk.rb +174 -0
- data/lib/wiki_lyrics/itrans/COPYRIGHT +31 -0
- data/lib/wiki_lyrics/itrans/itrans +0 -0
- data/lib/wiki_lyrics/itrans/itrans.txt +8 -0
- data/lib/wiki_lyrics/itrans/lyric.txt +23 -0
- data/lib/wiki_lyrics/itrans/udvng.ifm +206 -0
- data/lib/wiki_lyrics/lyrics.rb +567 -0
- data/lib/wiki_lyrics/lyrics_AZLyrics.rb +113 -0
- data/lib/wiki_lyrics/lyrics_DarkLyrics.rb +124 -0
- data/lib/wiki_lyrics/lyrics_Giitaayan.rb +124 -0
- data/lib/wiki_lyrics/lyrics_Jamendo.rb +166 -0
- data/lib/wiki_lyrics/lyrics_LeosLyrics.rb +142 -0
- data/lib/wiki_lyrics/lyrics_LoudSongs.rb +135 -0
- data/lib/wiki_lyrics/lyrics_LyricWiki.rb +329 -0
- data/lib/wiki_lyrics/lyrics_LyricsDownload.rb +118 -0
- data/lib/wiki_lyrics/lyrics_LyricsMania.rb +141 -0
- data/lib/wiki_lyrics/lyrics_Lyriki.rb +287 -0
- data/lib/wiki_lyrics/lyrics_SeekLyrics.rb +108 -0
- data/lib/wiki_lyrics/lyrics_Sing365.rb +103 -0
- data/lib/wiki_lyrics/lyrics_TerraLetras.rb +126 -0
- data/lib/wiki_lyrics/mediawikilyrics.rb +1464 -0
- data/lib/wiki_lyrics/tests/plugin_tests.rb +161 -0
- data/lib/wiki_lyrics/tests/tests.rb +74 -0
- data/lib/wiki_lyrics/utils/formdata.rb +56 -0
- data/lib/wiki_lyrics/utils/htmlentities.rb +291 -0
- data/lib/wiki_lyrics/utils/http.rb +198 -0
- data/lib/wiki_lyrics/utils/itrans.rb +160 -0
- data/lib/wiki_lyrics/utils/kde.rb +88 -0
- data/lib/wiki_lyrics/utils/logger.rb +123 -0
- data/lib/wiki_lyrics/utils/strings.rb +378 -0
- data/lib/wiki_lyrics/utils/xmlhash.rb +111 -0
- data/lib/wiki_lyrics/wikilyrics.kdevelop +152 -0
- data/lib/wiki_lyrics/wikilyrics.kdevses +18 -0
- data/lib/wiki_lyrics/win/gtk_fix.bat +3 -0
- data/lib/wiki_lyrics/win/tk_fix.bat +3 -0
- data/lib/wiki_lyrics/win/wikilyrics.bat +4 -0
- data/lib/wiki_lyrics/win/win_fix.rb +52 -0
- data/templates/art_.erb.xhtml +29 -0
- data/templates/artists.erb.xhtml +19 -0
- data/templates/cover.erb.xhtml +22 -0
- data/test/cache_manager_test.rb +73 -0
- data/test/data/artist name/title name.lyric +6 -0
- data/test/lyric_test.rb +41 -0
- metadata +194 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'rubygems'
|
4
|
+
require 'eeepub'
|
5
|
+
require 'spec'
|
6
|
+
require 'spec/autorun'
|
7
|
+
require 'nokogiri'
|
8
|
+
require 'rr'
|
9
|
+
|
10
|
+
Spec::Runner.configure do |config|
|
11
|
+
config.mock_with :rr
|
12
|
+
end
|
data/lib/lyrics_ebook.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
|
2
|
+
require 'lyrics_ebook/lyric'
|
3
|
+
require 'lyrics_ebook/cache_manager'
|
4
|
+
require 'lyrics_ebook/lyric_download'
|
5
|
+
require 'lyrics_ebook/mp3_parser'
|
6
|
+
require 'lyrics_ebook/lyrics2html'
|
7
|
+
|
8
|
+
# The main class
|
9
|
+
#
|
10
|
+
# Song lyrics are stored in <home>/Lyrics, if exists,
|
11
|
+
# else in <home>/.lyrics_ebook/Lyrics
|
12
|
+
#
|
13
|
+
class LyricsEbook
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
find_base_lyrics_dir
|
17
|
+
@cm=CacheManager.new(@base_lyrics_dir)
|
18
|
+
@cm.alternative_dir=@alt_lyrics_dir
|
19
|
+
@dm=LyricDownload.new
|
20
|
+
@mp3_parser=Mp3Parser.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def parse_dir dir
|
24
|
+
if dir.nil?
|
25
|
+
puts "Dir not set"
|
26
|
+
return
|
27
|
+
end
|
28
|
+
@mp3_parser.parse dir
|
29
|
+
$stdout.flush
|
30
|
+
download
|
31
|
+
end
|
32
|
+
|
33
|
+
def download
|
34
|
+
puts "start downloading..."
|
35
|
+
total, new, missing=0,0,0
|
36
|
+
lyrics=@mp3_parser.lyrics
|
37
|
+
lyrics.each do |lyric|
|
38
|
+
total+=1
|
39
|
+
if lyric.text.nil? && !@cm.get(lyric)
|
40
|
+
if @dm.download(lyric)
|
41
|
+
@cm.store(lyric)
|
42
|
+
new+=1
|
43
|
+
else
|
44
|
+
missing+=1
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
puts "#{total} songs in total; #{new} just downloaded; #{missing} missing "
|
49
|
+
end
|
50
|
+
|
51
|
+
def build epub_name=nil
|
52
|
+
epub_name="lyrics-ebook.epub" if epub_name.nil?
|
53
|
+
l2h=Lyrics2Html.new
|
54
|
+
l2h.add_lyrics @cm.get_lyrics
|
55
|
+
l2h.to_epub epub_name
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def find_base_lyrics_dir
|
61
|
+
lyric_home=File.join(ENV['HOME'],'Lyrics')
|
62
|
+
lyric_ebook_home=File.join(ENV['HOME'],'.lyrics_ebook','Lyrics')
|
63
|
+
lyric_home_exists=File.exists?(lyric_home) && File.directory?(lyric_home)
|
64
|
+
@base_lyrics_dir=lyric_home_exists ? lyric_home : lyric_ebook_home
|
65
|
+
@alt_lyrics_dir=lyric_home_exists ? lyric_ebook_home : nil
|
66
|
+
puts "Using Lyrics dir :"+@base_lyrics_dir
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
|
71
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'erb'
|
2
|
+
include ERB::Util
|
3
|
+
|
4
|
+
|
5
|
+
class Cache2Html
|
6
|
+
|
7
|
+
def parse_dir(dirname, hash=nil)
|
8
|
+
parser=MiniLyricsParser.new
|
9
|
+
|
10
|
+
@hash=Hash.new{ |hash,key| hash[key]=[] } unless @hash
|
11
|
+
@cache=Hash.new{ |hash,key| hash[key]={} } unless @cache
|
12
|
+
|
13
|
+
Dir.foreach(dirname) do |filename|
|
14
|
+
file=File.join(dirname,filename)
|
15
|
+
lp=parser.parse(file)
|
16
|
+
if lp
|
17
|
+
@hash[lp.artist.upcase.strip] << lp
|
18
|
+
@cache[lp.artist][lp.title]= file
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_html
|
24
|
+
data=@hash.to_a.sort!
|
25
|
+
data.each{|r| r[1].sort! }
|
26
|
+
template=""
|
27
|
+
IO.foreach('template.erb.html') {|line| template << line }
|
28
|
+
html=ERB.new(template)
|
29
|
+
html.run(binding)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'kconv'
|
3
|
+
|
4
|
+
class CacheManager
|
5
|
+
|
6
|
+
def initialize(base_dir='data')
|
7
|
+
@base_dir=base_dir
|
8
|
+
end
|
9
|
+
|
10
|
+
def alternative_dir=(alt_dir)
|
11
|
+
@alt_dir=alt_dir
|
12
|
+
end
|
13
|
+
|
14
|
+
def get(lyric)
|
15
|
+
file=lyric2file(lyric)
|
16
|
+
if !File.exists?(file) && !@alt_dir.nil?
|
17
|
+
file=lyric2file(lyric,false,@alt_dir)
|
18
|
+
end
|
19
|
+
return false unless File.exists?(file)
|
20
|
+
read_lyric_file(file,lyric)
|
21
|
+
end
|
22
|
+
|
23
|
+
def store(lyric)
|
24
|
+
file=lyric2file(lyric,true)
|
25
|
+
File.open(file,'w') do |f|
|
26
|
+
f << "#{lyric.artist} - #{lyric.title}\n\n".toutf8
|
27
|
+
f << lyric.text.toutf8
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def get_lyrics
|
32
|
+
res=[]
|
33
|
+
Dir.foreach(@base_dir) do |artist_dir|
|
34
|
+
artist_dir_path=File.join(@base_dir,artist_dir)
|
35
|
+
if File.directory?(artist_dir_path)
|
36
|
+
Dir.foreach(artist_dir_path) do |lyric_file|
|
37
|
+
ext=File.extname(lyric_file)
|
38
|
+
if ext==".lyric"
|
39
|
+
basename=File.basename(lyric_file,ext)
|
40
|
+
lyric_file_path=File.join(artist_dir_path,lyric_file)
|
41
|
+
lyric=Lyric.new({:artist=>artist_dir, :title=>basename})
|
42
|
+
read_lyric_file(lyric_file_path,lyric)
|
43
|
+
res << lyric
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
res
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def lyric2file(lyric,create_missing_dirs=false, dir=@base_dir)
|
54
|
+
title=fix_string(lyric.title)
|
55
|
+
artist=fix_string(lyric.artist)
|
56
|
+
artist_dir=File.join(dir,artist)
|
57
|
+
FileUtils.mkdir_p(artist_dir) if (!File.exists?(artist_dir) && create_missing_dirs)
|
58
|
+
song_file=File.join(dir,artist,title+".lyric")
|
59
|
+
song_file
|
60
|
+
end
|
61
|
+
|
62
|
+
def fix_string string
|
63
|
+
@re_inv_chars=/[\x00\/\\:\*\?\"<>\|]/ unless @re_inv_chars
|
64
|
+
string.strip.downcase.gsub(@re_inv_chars,'_')
|
65
|
+
end
|
66
|
+
|
67
|
+
def read_lyric_file(file, lyric=Lyric.new)
|
68
|
+
s=[]
|
69
|
+
IO.foreach(file) do |line|
|
70
|
+
s << line
|
71
|
+
end
|
72
|
+
lyric.artist,lyric.title=s.shift.split(" - ").collect!{|el| el.strip}
|
73
|
+
s.shift if s[0]=="\n"
|
74
|
+
lyric.text=s
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class Lyric
|
2
|
+
|
3
|
+
attr_accessor :artist, :album, :title, :tracknum, :mp3_filename
|
4
|
+
|
5
|
+
def initialize(map=nil)
|
6
|
+
map.each do |k,v|
|
7
|
+
send("#{k}=",v)
|
8
|
+
end if map
|
9
|
+
end
|
10
|
+
|
11
|
+
def <=>(other)
|
12
|
+
@title<=>other.title
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"#{@artist} - #{@title}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def text=(a)
|
20
|
+
@text=a.to_a
|
21
|
+
end
|
22
|
+
|
23
|
+
def text
|
24
|
+
@text.join if @text
|
25
|
+
end
|
26
|
+
|
27
|
+
def html_text
|
28
|
+
@text.collect{|line| h(line)}.join("<br />")
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "wiki_lyrics/utils/strings"
|
2
|
+
require "wiki_lyrics/cli/plugins"
|
3
|
+
require "wiki_lyrics/cli/wikilyrics"
|
4
|
+
|
5
|
+
|
6
|
+
class Application
|
7
|
+
def process( artist, title, album, year )
|
8
|
+
if @featuring_fix
|
9
|
+
artist = Strings.cleanup_artist( artist, title )
|
10
|
+
title = Strings.cleanup_title( title )
|
11
|
+
end
|
12
|
+
|
13
|
+
puts( "searching.. #{title} - #{artist}" )
|
14
|
+
|
15
|
+
request = Lyrics::Request.new( artist, title, album, year )
|
16
|
+
response, response_plugin, shown_review_dialog = fetch_lyrics( request )
|
17
|
+
|
18
|
+
if response.lyrics
|
19
|
+
artist = response.artist ? response.artist : response.request.artist
|
20
|
+
title = response.title ? response.title : response.request.title
|
21
|
+
puts "found at #{response_plugin.site_name}"
|
22
|
+
$stdout.flush
|
23
|
+
return response.lyrics
|
24
|
+
else
|
25
|
+
puts "not found...."
|
26
|
+
$stdout.flush
|
27
|
+
return nil
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
sites = ["Lyriki", "LyricWiki"]
|
35
|
+
Plugins.load_plugins( sites )
|
36
|
+
|
37
|
+
class LyricDownload
|
38
|
+
|
39
|
+
def download(lyric)
|
40
|
+
@app = Application.new true, true, false
|
41
|
+
begin
|
42
|
+
text=@app.process(lyric.artist,lyric.title, nil, nil )
|
43
|
+
lyric.text=text if text
|
44
|
+
!text.nil?
|
45
|
+
ensure
|
46
|
+
@app.finalize()
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,106 @@
|
|
1
|
+
#require 'rubygems'
|
2
|
+
#require 'eeepub'
|
3
|
+
require 'eeepub/lib/eeepub'
|
4
|
+
require 'erb'
|
5
|
+
require 'kconv'
|
6
|
+
require 'date'
|
7
|
+
|
8
|
+
include ERB::Util
|
9
|
+
|
10
|
+
class Lyrics2Html
|
11
|
+
|
12
|
+
def add_lyrics(lyrics)
|
13
|
+
@hash=Hash.new{ |hash,key| hash[key]=[] } unless @hash
|
14
|
+
lyrics.each do |lyric|
|
15
|
+
unless lyric.text.nil?
|
16
|
+
@hash[lyric.artist.upcase.strip] << lyric
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_epub name
|
22
|
+
ext=File.extname(name)
|
23
|
+
basename=File.basename(name,ext)
|
24
|
+
@html_files=[]
|
25
|
+
Dir.mktmpdir do |base_dir|
|
26
|
+
build_pages base_dir
|
27
|
+
nav1=build_nav
|
28
|
+
files=[]
|
29
|
+
@html_files.each do |file|
|
30
|
+
files << {file=>'pages'}
|
31
|
+
end
|
32
|
+
epub = EeePub.make do
|
33
|
+
title basename
|
34
|
+
creator 'lyrics-ebook'
|
35
|
+
publisher 'maner'
|
36
|
+
date Date.today.to_s
|
37
|
+
identifier 'http://example.com/book/foo', :scheme => 'URL'
|
38
|
+
uid 'http://example.com/book/foo'
|
39
|
+
files files
|
40
|
+
nav nav1
|
41
|
+
guide [
|
42
|
+
{:type => 'toc', :title => 'Table of Contents', :href => 'pages/artists.xhtml'},
|
43
|
+
{:type => 'cover', :title => 'Cover', :href => 'pages/cover.xhtml'}
|
44
|
+
]
|
45
|
+
end
|
46
|
+
name=name+".epub" if ext==""
|
47
|
+
epub.save(name)
|
48
|
+
puts "Created "+name
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def build_pages base_dir
|
55
|
+
@data=@hash.to_a.sort!
|
56
|
+
@data.each{|r| r[1].sort! }
|
57
|
+
pages_dir=File.join(base_dir,"pages")
|
58
|
+
Dir.mkdir(pages_dir)
|
59
|
+
build_html('cover',pages_dir)
|
60
|
+
build_html('artists',pages_dir)
|
61
|
+
@data.each_with_index do |art_lyrics,index|
|
62
|
+
@art_name=art_lyrics[0]
|
63
|
+
@lyrics=art_lyrics[1]
|
64
|
+
build_html('art_'+index.to_s,pages_dir,'art_')
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def build_nav
|
69
|
+
nav=[]
|
70
|
+
@data.each_with_index do |art_lyrics,index|
|
71
|
+
art_aname="pages/art_#{index}.xhtml"
|
72
|
+
art_label=art_lyrics[0]
|
73
|
+
nav1=[]
|
74
|
+
art_lyrics[1].each_with_index do |lyric, index_song|
|
75
|
+
song_aname="pages/art_#{index}.xhtml#song_#{index_song}"
|
76
|
+
nav1 << {:label => lyric.title, :content =>song_aname}
|
77
|
+
end
|
78
|
+
nav << {:label => art_label, :content => art_aname, :nav => nav1}
|
79
|
+
end
|
80
|
+
[
|
81
|
+
{:label => "Cover", :content =>'pages/cover.xhtml'},
|
82
|
+
{:label => "Artists", :content =>'pages/artists.xhtml', :nav => nav}
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
86
|
+
def build_html name, basedir, template_name=nil
|
87
|
+
template_name=name if template_name.nil?
|
88
|
+
template=read_template(template_name)
|
89
|
+
html=ERB.new(template)
|
90
|
+
res=html.result(binding)
|
91
|
+
html_file=File.join(basedir, name+'.xhtml')
|
92
|
+
File.open(html_file,'w') do |f|
|
93
|
+
f << res.toutf8
|
94
|
+
end
|
95
|
+
@html_files << html_file
|
96
|
+
end
|
97
|
+
|
98
|
+
def read_template name
|
99
|
+
template_file=File.dirname(__FILE__)+"/../../templates/"+name+".erb.xhtml"
|
100
|
+
template=""
|
101
|
+
IO.foreach(template_file) {|line| template << line }
|
102
|
+
template
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'lyric'
|
2
|
+
|
3
|
+
class MiniLyricsParser
|
4
|
+
|
5
|
+
def parse filename
|
6
|
+
return if File.directory?(filename)
|
7
|
+
lyric=Lyric.new
|
8
|
+
basename=File.basename(filename, File.extname(filename))
|
9
|
+
lyric.artist,lyric.title=basename.split(" - ")
|
10
|
+
text_a=[]
|
11
|
+
IO.foreach(filename) do |line|
|
12
|
+
cl=clear(line).strip
|
13
|
+
text_a << h(cl) if cl.size>0
|
14
|
+
end
|
15
|
+
lyric.text=text_a.join("<br />\n")
|
16
|
+
lyric
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def self.clear(line)
|
22
|
+
line.gsub(/\[.*\]/,"")
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'mp3info'
|
3
|
+
|
4
|
+
class Mp3Parser
|
5
|
+
attr_accessor :lyrics
|
6
|
+
|
7
|
+
def initialize
|
8
|
+
@lyrics= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse filename
|
12
|
+
if File.directory?(filename)
|
13
|
+
Dir.foreach(filename) do |file2|
|
14
|
+
unless ['.','..'].include?(file2)
|
15
|
+
f= File.join(filename,file2)
|
16
|
+
parse f
|
17
|
+
end
|
18
|
+
end
|
19
|
+
return
|
20
|
+
end
|
21
|
+
|
22
|
+
ext=File.extname(filename)
|
23
|
+
if (ext=='.mp3')
|
24
|
+
Mp3Info.open(filename) do |mp3|
|
25
|
+
if mp3.tag.title
|
26
|
+
lyric=Lyric.new(:artist=>mp3.tag.artist, :album=>mp3.tag.album, :title=>mp3.tag.title,
|
27
|
+
:tracknum=>mp3.tag.tracknum, :mp3_filename=>filename)
|
28
|
+
@lyrics << lyric
|
29
|
+
puts "Added : #{lyric.to_s}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|