lyrics-ebook 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. data/LICENSE +340 -0
  2. data/README +46 -0
  3. data/bin/lyrics-ebook +47 -0
  4. data/lib/eeepub/LICENSE +20 -0
  5. data/lib/eeepub/README.md +77 -0
  6. data/lib/eeepub/Rakefile +49 -0
  7. data/lib/eeepub/VERSION +1 -0
  8. data/lib/eeepub/examples/files/bar.html +42 -0
  9. data/lib/eeepub/examples/files/foo.html +42 -0
  10. data/lib/eeepub/examples/simple_epub.rb +25 -0
  11. data/lib/eeepub/lib/eeepub.rb +17 -0
  12. data/lib/eeepub/lib/eeepub/container_item.rb +108 -0
  13. data/lib/eeepub/lib/eeepub/easy.rb +100 -0
  14. data/lib/eeepub/lib/eeepub/maker.rb +127 -0
  15. data/lib/eeepub/lib/eeepub/ncx.rb +68 -0
  16. data/lib/eeepub/lib/eeepub/ocf.rb +112 -0
  17. data/lib/eeepub/lib/eeepub/opf.rb +148 -0
  18. data/lib/eeepub/spec/eeepub/easy_spec.rb +66 -0
  19. data/lib/eeepub/spec/eeepub/maker_spec.rb +124 -0
  20. data/lib/eeepub/spec/eeepub/ncx_spec.rb +80 -0
  21. data/lib/eeepub/spec/eeepub/ocf_spec.rb +43 -0
  22. data/lib/eeepub/spec/eeepub/opf_spec.rb +262 -0
  23. data/lib/eeepub/spec/eeepub_spec.rb +4 -0
  24. data/lib/eeepub/spec/spec_helper.rb +12 -0
  25. data/lib/lyrics_ebook.rb +71 -0
  26. data/lib/lyrics_ebook/cache2html.rb +33 -0
  27. data/lib/lyrics_ebook/cache_manager.rb +77 -0
  28. data/lib/lyrics_ebook/lyric.rb +32 -0
  29. data/lib/lyrics_ebook/lyric_download.rb +50 -0
  30. data/lib/lyrics_ebook/lyrics2html.rb +106 -0
  31. data/lib/lyrics_ebook/mini_lyrics_parser.rb +26 -0
  32. data/lib/lyrics_ebook/mp3_parser.rb +37 -0
  33. data/lib/wiki_lyrics/amarok/COPYING +340 -0
  34. data/lib/wiki_lyrics/amarok/README +51 -0
  35. data/lib/wiki_lyrics/amarok/amarok.rb +355 -0
  36. data/lib/wiki_lyrics/amarok/pluginadapter.rb +113 -0
  37. data/lib/wiki_lyrics/amarok/plugins.rb +95 -0
  38. data/lib/wiki_lyrics/amarok/wikilyrics.rb +578 -0
  39. data/lib/wiki_lyrics/amarok/wikilyrics.spec +4 -0
  40. data/lib/wiki_lyrics/amarok/wikipluginadapter.rb +392 -0
  41. data/lib/wiki_lyrics/cli/optionsparser.rb +228 -0
  42. data/lib/wiki_lyrics/cli/pluginadapter.rb +56 -0
  43. data/lib/wiki_lyrics/cli/plugins.rb +79 -0
  44. data/lib/wiki_lyrics/cli/wikilyrics.rb +178 -0
  45. data/lib/wiki_lyrics/cli/wikipluginadapter.rb +140 -0
  46. data/lib/wiki_lyrics/docs/COPYING +340 -0
  47. data/lib/wiki_lyrics/docs/ChangeLog +293 -0
  48. data/lib/wiki_lyrics/docs/HOWTO.pdf +0 -0
  49. data/lib/wiki_lyrics/docs/HOWTO.tex +151 -0
  50. data/lib/wiki_lyrics/docs/HOWTO.txt +139 -0
  51. data/lib/wiki_lyrics/docs/README +45 -0
  52. data/lib/wiki_lyrics/docs/TODO +12 -0
  53. data/lib/wiki_lyrics/gui/gui-gtk.rb +945 -0
  54. data/lib/wiki_lyrics/gui/gui-qt3.rb +785 -0
  55. data/lib/wiki_lyrics/gui/gui-qt4.rb +845 -0
  56. data/lib/wiki_lyrics/gui/gui-tk.rb +1104 -0
  57. data/lib/wiki_lyrics/gui/gui.rb +268 -0
  58. data/lib/wiki_lyrics/gui/test.rb +74 -0
  59. data/lib/wiki_lyrics/i18n/README +1 -0
  60. data/lib/wiki_lyrics/i18n/en.rb +181 -0
  61. data/lib/wiki_lyrics/i18n/es.rb +181 -0
  62. data/lib/wiki_lyrics/i18n/i18n.rb +126 -0
  63. data/lib/wiki_lyrics/i18n/sk.rb +174 -0
  64. data/lib/wiki_lyrics/itrans/COPYRIGHT +31 -0
  65. data/lib/wiki_lyrics/itrans/itrans +0 -0
  66. data/lib/wiki_lyrics/itrans/itrans.txt +8 -0
  67. data/lib/wiki_lyrics/itrans/lyric.txt +23 -0
  68. data/lib/wiki_lyrics/itrans/udvng.ifm +206 -0
  69. data/lib/wiki_lyrics/lyrics.rb +567 -0
  70. data/lib/wiki_lyrics/lyrics_AZLyrics.rb +113 -0
  71. data/lib/wiki_lyrics/lyrics_DarkLyrics.rb +124 -0
  72. data/lib/wiki_lyrics/lyrics_Giitaayan.rb +124 -0
  73. data/lib/wiki_lyrics/lyrics_Jamendo.rb +166 -0
  74. data/lib/wiki_lyrics/lyrics_LeosLyrics.rb +142 -0
  75. data/lib/wiki_lyrics/lyrics_LoudSongs.rb +135 -0
  76. data/lib/wiki_lyrics/lyrics_LyricWiki.rb +329 -0
  77. data/lib/wiki_lyrics/lyrics_LyricsDownload.rb +118 -0
  78. data/lib/wiki_lyrics/lyrics_LyricsMania.rb +141 -0
  79. data/lib/wiki_lyrics/lyrics_Lyriki.rb +287 -0
  80. data/lib/wiki_lyrics/lyrics_SeekLyrics.rb +108 -0
  81. data/lib/wiki_lyrics/lyrics_Sing365.rb +103 -0
  82. data/lib/wiki_lyrics/lyrics_TerraLetras.rb +126 -0
  83. data/lib/wiki_lyrics/mediawikilyrics.rb +1464 -0
  84. data/lib/wiki_lyrics/tests/plugin_tests.rb +161 -0
  85. data/lib/wiki_lyrics/tests/tests.rb +74 -0
  86. data/lib/wiki_lyrics/utils/formdata.rb +56 -0
  87. data/lib/wiki_lyrics/utils/htmlentities.rb +291 -0
  88. data/lib/wiki_lyrics/utils/http.rb +198 -0
  89. data/lib/wiki_lyrics/utils/itrans.rb +160 -0
  90. data/lib/wiki_lyrics/utils/kde.rb +88 -0
  91. data/lib/wiki_lyrics/utils/logger.rb +123 -0
  92. data/lib/wiki_lyrics/utils/strings.rb +378 -0
  93. data/lib/wiki_lyrics/utils/xmlhash.rb +111 -0
  94. data/lib/wiki_lyrics/wikilyrics.kdevelop +152 -0
  95. data/lib/wiki_lyrics/wikilyrics.kdevses +18 -0
  96. data/lib/wiki_lyrics/win/gtk_fix.bat +3 -0
  97. data/lib/wiki_lyrics/win/tk_fix.bat +3 -0
  98. data/lib/wiki_lyrics/win/wikilyrics.bat +4 -0
  99. data/lib/wiki_lyrics/win/win_fix.rb +52 -0
  100. data/templates/art_.erb.xhtml +29 -0
  101. data/templates/artists.erb.xhtml +19 -0
  102. data/templates/cover.erb.xhtml +22 -0
  103. data/test/cache_manager_test.rb +73 -0
  104. data/test/data/artist name/title name.lyric +6 -0
  105. data/test/lyric_test.rb +41 -0
  106. metadata +194 -0
@@ -0,0 +1,4 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Epubr" do
4
+ end
@@ -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
@@ -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
+