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,127 @@
1
+ require 'tmpdir'
2
+ require 'fileutils'
3
+
4
+ module EeePub
5
+ # The class to make ePub easily
6
+ #
7
+ # @example
8
+ # epub = EeePub.make do
9
+ # title 'sample'
10
+ # creator 'jugyo'
11
+ # publisher 'jugyo.org'
12
+ # date '2010-05-06'
13
+ # identifier 'http://example.com/book/foo', :scheme => 'URL'
14
+ # uid 'http://example.com/book/foo'
15
+ #
16
+ # files ['/path/to/foo.html', '/path/to/bar.html']
17
+ # nav [
18
+ # {:label => '1. foo', :content => 'foo.html', :nav => [
19
+ # {:label => '1.1 foo-1', :content => 'foo.html#foo-1'}
20
+ # ]},
21
+ # {:label => '1. bar', :content => 'bar.html'}
22
+ # ]
23
+ # end
24
+ # epub.save('sample.epub')
25
+ class Maker
26
+ [
27
+ :title,
28
+ :creator,
29
+ :publisher,
30
+ :date,
31
+ :language,
32
+ :subject,
33
+ :description,
34
+ :rights,
35
+ :relation
36
+ ].each do |name|
37
+ class_eval <<-DELIM
38
+ def #{name}(value)
39
+ @#{name}s ||= []
40
+ @#{name}s << value
41
+ end
42
+ DELIM
43
+ end
44
+
45
+ [
46
+ :uid,
47
+ :files,
48
+ :nav,
49
+ :ncx_file,
50
+ :opf_file,
51
+ :guide
52
+ ].each do |name|
53
+ define_method(name) do |arg|
54
+ instance_variable_set("@#{name}", arg)
55
+ end
56
+ end
57
+
58
+ def identifier(id, options)
59
+ @identifiers ||= []
60
+ @identifiers << {:value => id, :scheme => options[:scheme]}
61
+ end
62
+
63
+ # @param [Proc] block the block for initialize
64
+ def initialize(&block)
65
+ @files ||= []
66
+ @nav ||= []
67
+ @ncx_file ||= 'toc.ncx'
68
+ @opf_file ||= 'content.opf'
69
+
70
+ instance_eval(&block) if block_given?
71
+ end
72
+
73
+ # Save as ePub file
74
+ #
75
+ # @param [String] filename the ePub file name to save
76
+ def save(filename)
77
+ Dir.mktmpdir do |dir|
78
+ @files.each do |file|
79
+ case file
80
+ when String
81
+ FileUtils.cp(file, dir)
82
+ when Hash
83
+ file_path, dir_path = *file.first
84
+ dest_dir = File.join(dir, dir_path)
85
+ FileUtils.mkdir_p(dest_dir)
86
+ FileUtils.cp(file_path, dest_dir)
87
+ end
88
+ end
89
+
90
+ NCX.new(
91
+ :uid => @uid,
92
+ :title => @titles[0],
93
+ :nav => @nav
94
+ ).save(File.join(dir, @ncx_file))
95
+
96
+ OPF.new(
97
+ :title => @titles,
98
+ :identifier => @identifiers,
99
+ :creator => @creators,
100
+ :publisher => @publishers,
101
+ :date => @dates,
102
+ :language => @languages,
103
+ :subject => @subjects,
104
+ :description => @descriptions,
105
+ :rights => @rightss,
106
+ :relation => @relations,
107
+ :guide=> @guide,
108
+ :manifest => @files.map{|file|
109
+ case file
110
+ when String
111
+ File.basename(file)
112
+ when Hash
113
+ file_path, dir_path = *file.first
114
+ File.join(dir_path, File.basename(file_path))
115
+ end
116
+ },
117
+ :ncx => @ncx_file
118
+ ).save(File.join(dir, @opf_file))
119
+
120
+ OCF.new(
121
+ :dir => dir,
122
+ :container => @opf_file
123
+ ).save(filename)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,68 @@
1
+ module EeePub
2
+ class NCX < ContainerItem
3
+ attr_accessor :uid,
4
+ :depth,
5
+ :total_page_count,
6
+ :max_page_number,
7
+ :doc_title,
8
+ :nav_map
9
+
10
+ attr_alias :title, :doc_title
11
+ attr_alias :nav, :nav_map
12
+
13
+ default_value :depth, 1
14
+ default_value :total_page_count, 0
15
+ default_value :max_page_number, 0
16
+ default_value :doc_title, 'Untitled'
17
+
18
+ def build_xml(builder)
19
+ builder.declare! :DOCTYPE, :ncx, :PUBLIC, "-//NISO//DTD ncx 2005-1//EN", "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd"
20
+ builder.ncx :xmlns => "http://www.daisy.org/z3986/2005/ncx/", :version => "2005-1" do
21
+ build_head(builder)
22
+ builder.docTitle { builder.text doc_title }
23
+ build_nav_map(builder)
24
+ end
25
+ end
26
+
27
+ def build_head(builder)
28
+ builder.head do
29
+ {
30
+ :uid => uid,
31
+ :depth => depth,
32
+ :totalPageCount => total_page_count,
33
+ :maxPageNumber => max_page_number
34
+ }.each do |k, v|
35
+ builder.meta :name => "dtb:#{k}", :content => v
36
+ end
37
+ end
38
+ end
39
+
40
+ def build_nav_map(builder)
41
+ builder.navMap do
42
+ builder_nav_point(builder, nav_map)
43
+ end
44
+ end
45
+
46
+ def builder_nav_point(builder, nav_point, play_order = 1)
47
+ case nav_point
48
+ when Array
49
+ nav_point.each do |point|
50
+ play_order = builder_nav_point(builder, point, play_order)
51
+ end
52
+ when Hash
53
+ id = nav_point[:id] || "navPoint-#{play_order}"
54
+ builder.navPoint :id => id, :playOrder => play_order do
55
+ builder.navLabel { builder.text nav_point[:label] }
56
+ builder.content :src => nav_point[:content]
57
+ play_order += 1
58
+ if nav_point[:nav]
59
+ play_order = builder_nav_point(builder, nav_point[:nav], play_order)
60
+ end
61
+ end
62
+ else
63
+ raise "nav_point must be Array or Hash"
64
+ end
65
+ play_order
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,112 @@
1
+ require 'zippy'
2
+
3
+ module EeePub
4
+ # Class to create OCF
5
+ class OCF
6
+ # Class for 'container.xml' of OCF
7
+ class Container < ContainerItem
8
+ attr_accessor :rootfiles
9
+
10
+ # @param [String or Array or Hash]
11
+ #
12
+ # @example
13
+ # # with String
14
+ # EeePub::OCF::Container.new('container.opf')
15
+ #
16
+ # @example
17
+ # # with Array
18
+ # EeePub::OCF::Container.new(['container.opf', 'other.opf'])
19
+ #
20
+ # @example
21
+ # # with Hash
22
+ # EeePub::OCF::Container.new(
23
+ # :rootfiles => [
24
+ # {:full_path => 'container.opf', :media_type => 'application/oebps-package+xml'}
25
+ # ]
26
+ # )
27
+ def initialize(arg)
28
+ case arg
29
+ when String
30
+ set_values(
31
+ :rootfiles => [
32
+ {:full_path => arg, :media_type => guess_media_type(arg)}
33
+ ]
34
+ )
35
+ when Array
36
+ # TODO: spec
37
+ set_values(
38
+ :rootfiles => arg.keys.map { |k|
39
+ filename = arg[k]
40
+ {:full_path => filename, :media_type => guess_media_type(filename)}
41
+ }
42
+ )
43
+ when Hash
44
+ set_values(arg)
45
+ end
46
+
47
+ end
48
+
49
+ private
50
+
51
+ def build_xml(builder)
52
+ builder.container :xmlns => "urn:oasis:names:tc:opendocument:xmlns:container", :version => "1.0" do
53
+ builder.rootfiles do
54
+ rootfiles.each do |i|
55
+ builder.rootfile convert_to_xml_attributes(i)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+
62
+ attr_accessor :dir, :container
63
+
64
+ # @param [Hash<Symbol, Object>] values the values of symbols and objects for OCF
65
+ #
66
+ # @example
67
+ # EeePub::OCF.new(
68
+ # :dir => '/path/to/dir',
69
+ # :container => 'container.opf'
70
+ # )
71
+ def initialize(values)
72
+ values.each do |k, v|
73
+ self.send(:"#{k}=", v)
74
+ end
75
+ end
76
+
77
+ # Set container
78
+ #
79
+ # @param [EeePub::OCF::Container or args for EeePub::OCF::Container]
80
+ def container=(arg)
81
+ if arg.is_a?(EeePub::OCF::Container)
82
+ @container = arg
83
+ else
84
+ # TODO: spec
85
+ @container = EeePub::OCF::Container.new(arg)
86
+ end
87
+ end
88
+
89
+ # Save as OCF
90
+ #
91
+ # @param [String] output_path the output file path of ePub
92
+ def save(output_path)
93
+ output_path = File.expand_path(output_path)
94
+
95
+ FileUtils.chdir(dir) do
96
+
97
+ meta_inf = 'META-INF'
98
+ FileUtils.mkdir_p(meta_inf)
99
+
100
+ container.save(File.join(meta_inf, 'container.xml'))
101
+
102
+ Zippy.create output_path do |zip|
103
+ zip['mimetype'] = 'application/epub+zip'
104
+ Dir.glob('**/*').each do |filename|
105
+ zip[filename] = IO.read(filename) unless File.directory?(filename)
106
+ end
107
+ end
108
+
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,148 @@
1
+ module EeePub
2
+ class OPF < ContainerItem
3
+ attr_accessor :unique_identifier,
4
+ :title,
5
+ :language,
6
+ :identifier,
7
+ :date,
8
+ :subject,
9
+ :description,
10
+ :relation,
11
+ :creator,
12
+ :publisher,
13
+ :rights,
14
+ :manifest,
15
+ :spine,
16
+ :guide,
17
+ :ncx,
18
+ :toc
19
+
20
+ default_value :toc, 'ncx'
21
+ default_value :unique_identifier, 'BookId'
22
+ default_value :title, 'Untitled'
23
+ default_value :language, 'en'
24
+
25
+ attr_alias :files, :manifest
26
+
27
+ def identifier
28
+ case @identifier
29
+ when Array
30
+ @identifier
31
+ when String
32
+ [{:value => @identifier, :id => unique_identifier}]
33
+ when Hash
34
+ @identifier[:id] = unique_identifier
35
+ [@identifier]
36
+ else
37
+ @identifier
38
+ end
39
+ end
40
+
41
+ def spine
42
+ @spine ||
43
+ complete_manifest.
44
+ select { |i| i[:media_type] == 'application/xhtml+xml' }.
45
+ map { |i| i[:id]}
46
+ end
47
+
48
+ def build_xml(builder)
49
+ builder.package :xmlns => "http://www.idpf.org/2007/opf",
50
+ 'unique-identifier' => unique_identifier,
51
+ 'version' => "2.0" do
52
+
53
+ build_metadata(builder)
54
+ build_manifest(builder)
55
+ build_spine(builder)
56
+ build_guide(builder)
57
+ end
58
+ end
59
+
60
+ def build_metadata(builder)
61
+ builder.metadata 'xmlns:dc' => "http://purl.org/dc/elements/1.1/",
62
+ 'xmlns:dcterms' => "http://purl.org/dc/terms/",
63
+ 'xmlns:xsi' => "http://www.w3.org/2001/XMLSchema-instance",
64
+ 'xmlns:opf' => "http://www.idpf.org/2007/opf" do
65
+
66
+ identifier.each do |i|
67
+ attrs = {}
68
+ attrs['opf:scheme'] = i[:scheme] if i[:scheme]
69
+ attrs[:id] = i[:id] if i[:id]
70
+ builder.dc :identifier, i[:value], attrs
71
+ end
72
+
73
+ [:title, :language, :subject, :description, :relation, :creator, :publisher, :date, :rights].each do |i|
74
+ value = self.send(i)
75
+ next unless value
76
+
77
+ [value].flatten.each do |v|
78
+ case v
79
+ when Hash
80
+ builder.dc i, v[:value], convert_to_xml_attributes(v.reject {|k, v| k == :value})
81
+ else
82
+ builder.dc i, v
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+
89
+ def build_manifest(builder)
90
+ builder.manifest do
91
+ complete_manifest.each do |i|
92
+ builder.item :id => i[:id], :href => i[:href], 'media-type' => i[:media_type]
93
+ end
94
+ end
95
+ end
96
+
97
+ def build_spine(builder)
98
+ builder.spine :toc => toc do
99
+ spine.each do |i|
100
+ builder.itemref :idref => i
101
+ end
102
+ end
103
+ end
104
+
105
+ def build_guide(builder)
106
+ return if guide.nil? || guide.empty?
107
+
108
+ builder.guide do
109
+ guide.each do |i|
110
+ builder.reference convert_to_xml_attributes(i)
111
+ end
112
+ end
113
+ end
114
+
115
+ def complete_manifest
116
+ item_id_cache = {}
117
+
118
+ result = manifest.map do |i|
119
+ case i
120
+ when String
121
+ id = create_unique_item_id(i, item_id_cache)
122
+ href = i
123
+ media_type = guess_media_type(i)
124
+ when Hash
125
+ id = i[:id] || create_unique_item_id(i[:href], item_id_cache)
126
+ href = i[:href]
127
+ media_type = i[:media_type] || guess_media_type(i[:href])
128
+ end
129
+ {:id => id, :href => href, :media_type => media_type}
130
+ end
131
+
132
+ result += [{:id => 'ncx', :href => ncx, :media_type => 'application/x-dtbncx+xml'}] if ncx
133
+ result
134
+ end
135
+
136
+ def create_unique_item_id(filename, id_cache)
137
+ basename = File.basename(filename)
138
+ unless id_cache[basename]
139
+ id_cache[basename] = 0
140
+ name = basename
141
+ else
142
+ name = "#{basename}-#{id_cache[basename]}"
143
+ end
144
+ id_cache[basename] += 1
145
+ name
146
+ end
147
+ end
148
+ end