]> git.phdru.name Git - xsetbg.git/blobdiff - xsetbg.py
Fix(DB): Fix column encoding
[xsetbg.git] / xsetbg.py
index 98b8aaafd7599d23e9d35d19c1063c16a036bb45..825b20eb0f9c927614a5285d4c8467524b3c5380 100644 (file)
--- a/xsetbg.py
+++ b/xsetbg.py
@@ -6,12 +6,6 @@ using xli program.
 
 """
 
-__author__ = "Oleg Broytman <phd@phdru.name>"
-__copyright__ = "Copyright (C) 2000-2015 PhiloSoft Design"
-__license__ = "GNU GPL"
-
-__all__ = ['change']
-
 from fcntl import flock, LOCK_EX, LOCK_UN, LOCK_NB
 from datetime import timedelta
 import os
@@ -24,6 +18,8 @@ from time import time
 from xsetbg_conf import xsetbg_dir, xsetbg_conf
 from xsetbg_db import xsetbg_db
 
+__all__ = ['change']
+
 
 def error(error_str):
     sys.exit("%s: Error: %s\n" % (sys.argv[0], error_str))
@@ -54,11 +50,11 @@ if xsetbg_conf.has_option("xsetbg", "min_delay"):
     min_delay = xsetbg_conf.get("xsetbg", "min_delay")
 
     # Borrowed from http://stackoverflow.com/a/2765366
-    td_re = re.compile('(?:(?P<years>\d+)y)?'
-                       '(?:(?P<months>\d+)m)?'
-                       '(?:(?P<days>\d+)d)?'
-                       '(?:T(?:(?P<hours>\d+)h)?'
-                       '(?:(?P<minutes>\d+)m)?(?:(?P<seconds>\d+)s)?)?')
+    td_re = re.compile('(?:(?P<years>\\d+)y)?'
+                       '(?:(?P<months>\\d+)m)?'
+                       '(?:(?P<days>\\d+)d)?'
+                       '(?:T(?:(?P<hours>\\d+)h)?'
+                       '(?:(?P<minutes>\\d+)m)?(?:(?P<seconds>\\d+)s)?)?')
     td_dict = td_re.match(min_delay).groupdict(0)
     delta = timedelta(days=int(td_dict['days']) +
                       (int(td_dict['months']) * 30) +
@@ -76,13 +72,15 @@ else:
     min_delay = 3600*24  # 24 hours
 
 
-if xsetbg_db.select('last_shown IS NULL OR last_shown < %d' %
-                    (time() - min_delay)).count() == 0:
+if xsetbg_db.select(
+        '(is_image = 1) AND (last_shown IS NULL OR last_shown < %d)' %
+        (time() - min_delay)).count() == 0:
     error("No unshown images found. Run rescan_fs.py "
           "or decrease min_delay. Abort.")
 
 fs_encoding = xsetbg_conf.get("images", "fs_encoding")
 
+
 def change(force=False):
     # Use the program's file as the lock file:
     # lock it to prevent two processes run in parallel.
@@ -95,8 +93,9 @@ def change(force=False):
         return
 
     try:
-        timestamp = xsetbg_db.select('last_shown IS NOT NULL',
-                                     orderBy='-last_shown')[0].last_shown
+        timestamp = xsetbg_db.select(
+            '(is_image = 1) AND (last_shown IS NOT NULL)',
+            orderBy='-last_shown')[0].last_shown
         current_time = time()
 
         if not force and timestamp is not None and \
@@ -105,13 +104,15 @@ def change(force=False):
             return
 
         # Select a random image that has never been shown
-        not_shown_select = xsetbg_db.select('last_shown IS NULL')
+        not_shown_select = xsetbg_db.select(
+            '(is_image = 1) AND (last_shown IS NULL)')
         not_shown_count = not_shown_select.count()
         if not_shown_count:
             row = not_shown_select[random.randint(0, not_shown_count - 1)]
         else:
             old_shown_select = xsetbg_db.select(
-                'last_shown IS NOT NULL AND last_shown < %d' %
+                '(is_image = 1) AND '
+                '(last_shown IS NOT NULL AND last_shown < %d)' %
                 current_time - min_delay)
             old_shown_count = old_shown_select.count()
             if old_shown_count:
@@ -124,6 +125,16 @@ def change(force=False):
                            "-center", "-onroot", "-quiet", "-zoom", "auto",
                            row.full_name.encode(fs_encoding)]
 
+        ext = os.path.splitext(row.full_name)[1].lower()
+        if ext in ('tif', 'tiff'):
+            program_options[0] = 'xsetbg'
+
+        if ext == 'webp':
+            program_options = ['display', '-backdrop',
+                               '-background', random.choice(borders),
+                               '-window', 'root',
+                               row.full_name.encode(fs_encoding)]
+
         rc = subprocess.call(program_options)
         if rc:
             error("cannot execute xli!")