lyrics-ebook 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+