Switch to built-in logging class
[animesorter.git] / animesorter2.py
index 9dbfea0..9585394 100755 (executable)
@@ -1,19 +1,47 @@
 #!/usr/bin/env python
+# vim: set ts=4 sts=4 sw=4 textwidth=92 expandtab:
+
+"""
+The animesorter program
+
+This will sort arbitrary files into directories by regular expression.
+"""
+
+__author__    = "Ira W. Snyder (devel@irasnyder.com)"
+__copyright__ = "Copyright (c) 2006,2007 Ira W. Snyder (devel@irasnyder.com)"
+__license__   = "GNU GPL v2 (or, at your option, any later version)"
+
+#    animesorter2.py -- a regular expression file-sorting utility
+#
+#    Copyright (C) 2006,2007  Ira W. Snyder (devel@irasnyder.com)
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-# Copyright: Ira W. Snyder (devel@irasnyder.com)
-# License: GNU General Public License v2 (or at your option, any later version)
 
 import os
 import re
 import sys
 import errno
 import shutil
+import logging
 from optparse import OptionParser
 
 ### Default Configuration Variables ###
-DICT_FILE = '~/.config/animesorter2/animesorter.dict'
-WORK_DIR =  '~/downloads/usenet'
-SORT_DIR =  '/data/Anime'
+DICT_FILE = os.path.join ('~','.config','animesorter2','animesorter.dict')
+WORK_DIR =  os.path.join ('~','downloads','usenet')
+SORT_DIR =  os.path.join ('/','data','Anime')
 TYPES_REGEX = '.*(avi|ogm|mkv|mp4|\d\d\d)$'
 
 
@@ -35,7 +63,7 @@ class AnimeSorter2:
             finally:
                 f.close()
         except IOError:
-            self.print_dict_fail (self.options.dict_file)
+            logging.critical ('Opening dictionary: %s FAILED' % self.options.dict_file)
             sys.exit()
 
         ### Get a LIST containing each line in the file
@@ -52,7 +80,8 @@ class AnimeSorter2:
         result = [(re.compile(r), d) for r, d in result]
 
         ### Give some information about the dictionary we are using
-        self.print_dict_suc (self.options.dict_file, len(result))
+        logging.info ('Successfully loaded %d records from %s\n' % \
+                (len(result), self.options.dict_file))
 
         return tuple(result)
 
@@ -67,7 +96,7 @@ class AnimeSorter2:
                 r = r.strip()
                 d = d.strip()
             except ValueError:
-                self.print_dict_bad_line (l)
+                logging.warning ('Bad line in dictionary: "%s"' % l)
                 continue
 
             result.append((r, d))
@@ -92,16 +121,16 @@ class AnimeSorter2:
         if not os.path.isdir (dirname):
 
             if self.options.pretend:
-                self.print_dir_create_pretend (dirname)
+                logging.info ('Will create directory %s' % dirname)
                 return 0
 
             if self.get_user_choice ('Make directory?: %s' % (dirname, )):
 
                 try:
                     os.makedirs (dirname)
-                    self.print_dir_create_suc (dirname)
+                    logging.info ('Created directory %s' % dirname)
                 except:
-                    self.print_dir_create_fail (dirname)
+                    logging.critical ('Failed to create directory %s' % dirname)
                     return errno.EIO
 
         return 0
@@ -114,15 +143,15 @@ class AnimeSorter2:
         dstname = os.path.join (todir, f)
 
         if self.options.pretend:
-            self.print_move_file_pretend (f, todir)
+            logging.info ('Will move %s to %s' % (f, todir))
             return 0 # success
 
         if self.get_user_choice ('Move file?: %s --> %s' % (srcname, dstname)):
             try:
                 shutil.move (srcname, dstname)
-                self.print_move_file_suc (f, todir)
+                logging.info ('Moved %s to %s' % (f, todir))
             except:
-                self.print_move_file_fail (f, todir)
+                logging.critical ('FAILED to move %s to %s' % (f, todir))
                 return errno.EIO
 
         return 0
@@ -190,7 +219,11 @@ class AnimeSorter2:
     def main(self):
 
         ## Print the program's header
-        self.print_prog_header ()
+        logging.info ('Regular Expression File Sorter (aka animesorter)')
+        logging.info ('=' * 80)
+        logging.info ('Copyright (c) 2005-2007, Ira W. Snyder (devel@irasnyder.com)')
+        logging.info ('This program is licensed under the GNU GPL v2')
+        logging.info ('')
 
         ## Parse the dictionary
         dict = self.parse_dict()
@@ -204,62 +237,13 @@ class AnimeSorter2:
                     [d for d in os.listdir(self.options.start_dir) if os.path.isdir(d)],
                     [f for f in os.listdir(self.options.start_dir) if os.path.isfile(f)])
 
-    ############################################################################
-    ### Functions for the printing system
-    ############################################################################
-
-    def print_prog_header(self):
-        if self.options.quiet:
-            return
-
-        print 'Regular Expression File Sorter (aka animesorter)'
-        print '================================================================================'
-        print 'Copyright (c) 2005,2006, Ira W. Snyder (devel@irasnyder.com)'
-        print 'All rights reserved.'
-        print 'This program is licensed under the GNU GPL v2'
-        print
-
-    def print_move_file_suc(self, f, t):
-        if self.options.quiet:
-            return
-
-        print 'Moved %s to %s' % (f, t)
-
-    def print_move_file_fail(self, f, t):
-        print 'FAILED to move %s to %s' % (f, t)
-
-    def print_move_file_pretend (self, f, t):
-        print 'Will move %s to %s' % (f, t)
-
-    def print_dir_create_suc(self, d):
-        if self.options.quiet:
-            return
-
-        print 'Created directory %s' % (d, )
-
-    def print_dir_create_fail(self, d):
-        print 'Failed to create directory %s' % (d, )
-
-    def print_dir_create_pretend (self, d):
-        print 'Will create directory %s' % (d, )
-
-    def print_dict_suc(self, dic, num):
-        if self.options.quiet:
-            return
-
-        print 'Successfully loaded %d records from %s\n' % (num, dic)
-
-    def print_dict_fail(self, dic):
-        print 'Opening dictionary: %s FAILED' % (dic, )
-
-    def print_dict_bad_line(self, dic):
-        print 'Bad line in dictionary: %s' % (dic, )
-
-
 
 ### MAIN IS HERE ###
 def main():
 
+    # Set up the logger
+    logging.basicConfig (level=logging.INFO, format='%(message)s')
+
     ### Get the program options
     parser = OptionParser()
     parser.add_option('-q', '--quiet', action='store_true', dest='quiet',
@@ -285,10 +269,13 @@ def main():
     options.start_dir = os.path.abspath(os.path.expanduser(options.start_dir))
     options.output_dir = os.path.abspath(os.path.expanduser(options.output_dir))
 
+    # Change the loglevel if we're running in quiet mode
+    if options.quiet:
+        logging.getLogger().setLevel (logging.CRITICAL)
+
     as = AnimeSorter2(options)
     as.main()
 
 if __name__ == '__main__':
     main ()
 
-# vim: set ts=4 sw=4 sts=4 expandtab: