Add language to book data.
[quanlib.git] / book.rb
diff --git a/book.rb b/book.rb
index 6d90c0e2947a0a243b3480758518159e075d8d85..d7135690d4d60514f4c900d59dc76698d3eb164d 100644 (file)
--- a/book.rb
+++ b/book.rb
@@ -3,24 +3,26 @@ require 'nokogiri'
 require 'rubygems'
 require 'zip'
 
-require 'author'
-require 'classification'
-require 'cover'
-require 'store'
+require_relative 'author'
+require_relative 'classification'
+require_relative 'cover'
+require_relative 'store'
 
 class Book
   @@DC_NS_URL = 'http://purl.org/dc/elements/1.1/'
 
+  attr_accessor :author
+  attr_accessor :classification_id
+  attr_accessor :cover
+  attr_accessor :description
+  attr_accessor :language
+  attr_accessor :path
+  attr_accessor :series_id
+  attr_accessor :title
+  attr_accessor :volume
+
   def initialize(store)
-    @author = nil
-    @classification_id = nil
-    @cover = nil
-    @description = nil
-    @path = nil
-    @series_id = nil
     @store = store
-    @title = nil
-    @volume = nil
   end
 
   def load_from_file!(fileName)
@@ -47,38 +49,6 @@ class Book
     return false
   end
 
-  def author
-    return @author
-  end
-
-  def author=(value)
-    @author = value
-  end
-
-  def classification_id
-    @classification_id
-  end
-
-  def classification_id=(value)
-    @classification_id = value
-  end
-
-  def cover
-    return @cover
-  end
-
-  def cover=(value)
-    @cover = value
-  end
-
-  def description
-    @description
-  end
-
-  def description=(value)
-    @description = value
-  end
-
   def heading
     result = []
 
@@ -90,7 +60,7 @@ class Book
     if nil != @author
       result.push('<i>by ' + @author.reading_order + '</i>')
     end
-    
+
     seriesInfo = []
     series = @store.load_series(@series_id)
     if nil != series and nil != series.descr
@@ -142,34 +112,10 @@ class Book
     return '(Book:' + data.join(',') + ')'
   end
 
-  def path
-    @path
-  end
-
-  def path=(value)
-    @path = value
-  end
-
-  def series_id
-    @series_id
-  end
-  
-  def series_id=(value)
-    @series_id = value
-  end
-
   def to_s
     return inspect()
   end
 
-  def title
-    @title
-  end
-
-  def title=(value)
-    @title = value
-  end
-
   def title_grouping
     if nil == @path
       return nil
@@ -178,14 +124,6 @@ class Book
     return File.basename(@path, '.*')
   end
 
-  def volume
-    @volume
-  end
-
-  def volume=(value)
-    @volume = value
-  end
-
   protected
   def isUpper?(c)
     return /[[:upper:]]/.match(c)
@@ -270,14 +208,15 @@ class Book
     if ('01_nonfic' == category) && (nil == classification_id)
       open(Store.unclassified_csv, 'a') do |fd|
         fd.puts('"' + grouping.to_s + '","' + path + '"')
-      end 
+      end
     end
   end
 
-  protected 
+  protected
   def scanEpub!(fileName)
     #puts 'Scanning "' + fileName.to_s + '"...'
     begin
+      Zip.warn_invalid_date = false
       Zip::File.open(fileName) do |zipfile|
         entry = zipfile.find_entry('META-INF/container.xml')
         if nil == entry
@@ -361,7 +300,7 @@ class Book
 
     #---------------------------------------
     # Description
-    
+
     descrNodes = opfDoc.css('dc|description', 'dc' => @@DC_NS_URL)
     if (descrNodes.length > 0)
       descrNode = descrNodes[0]
@@ -370,6 +309,17 @@ class Book
       end
     end
 
+    #---------------------------------------
+    # Language
+
+    langNodes = opfDoc.css('dc|language', 'dc' => @@DC_NS_URL)
+    if (langNodes.length > 0)
+      langNode = langNodes[0]
+      if langNode
+        @language = langNode.content
+      end
+    end
+
     #---------------------------------------
     # Other metadata:  series, volume, cover
 
@@ -412,9 +362,9 @@ class Book
         entry = zipfile.find_entry(href)
 
         if nil == entry
-          # Although the epub standard requires the path to be relative 
+          # Although the epub standard requires the path to be relative
           # to the base of the epub (zip), some books encountered in the
-          # wild have been found to use a bath relative to the location 
+          # wild have been found to use a bath relative to the location
           # of the opf file.
           parts = opfPath.split('/')
           opfBasePath = opfPath.split('/')[0..-2].join('/')
@@ -422,6 +372,14 @@ class Book
           entry = zipfile.find_entry(coverPath)
         end
 
+        unless entry
+          # Another case found in the wild:  cover image is at the root, but path is '../cover.jpeg'
+          if href.start_with? '../'
+            coverPath = href[3..-1]
+            entry = zipfile.find_entry(coverPath)
+          end
+        end
+
         if nil == entry
           puts 'WARNING!  Cover image "' + href + '" not found in file "' + @path + '".'
           return nil