issue76, check if thumb_path is set
[phpfspot.git] / phpfspot.class.php
index 087d82f8783d02f75586eca54b797b6a65ac668e..cc1c8736aafda15ea11ca47c34985a3e52d8181c 100644 (file)
@@ -23,7 +23,6 @@
 
 require_once "phpfspot_cfg.php";
 require_once "phpfspot_db.php";
-require_once "phpfspot_tmpl.php";
 
 class PHPFSPOT {
 
@@ -50,21 +49,27 @@ class PHPFSPOT {
 
       $this->cfg = new PHPFSPOT_CFG;
 
-      $this->db  = new PHPFSPOT_DB(&$this, $this->cfg->fspot_db);
+      $this->db  = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
       
       if(!is_writeable(dirname($this->cfg->phpfspot_db))) {
          print dirname($this->cfg->phpfspot_db) .": directory is not writeable!";
          exit(1);
       }
          
-      $this->cfg_db = new PHPFSPOT_DB(&$this, $this->cfg->phpfspot_db);
+      $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
       if(!is_writeable($this->cfg->phpfspot_db)) {
          print $this->cfg->phpfspot_db ." is not writeable for user ". $this->getuid() ."\n";
          exit(1);
       }
       $this->check_config_table();
 
-
+      /* include Smarty template engine */
+      if(!$this->check_readable($this->cfg->smarty_path .'/libs/Smarty.class.php')) {
+         exit(1);
+      }
+      require $this->cfg->smarty_path .'/libs/Smarty.class.php';
+      /* overload Smarty class if our own template handler */
+      require_once "phpfspot_tmpl.php";
       $this->tmpl = new PHPFSPOT_TMPL($this);
 
       $this->get_tags();
@@ -115,10 +120,10 @@ class PHPFSPOT {
                $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
             }
             if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
-               $_SESSION['from_date'] = strtotime($_GET['from_date']);
+               $_SESSION['from_date'] = strtotime($_GET['from_date'] ." 00:00:00");
             }
             if(isset($_GET['to_date']) && $this->isValidDate($_GET['to_date'])) {
-               $_SESSION['to_date'] = strtotime($_GET['to_date']);
+               $_SESSION['to_date'] = strtotime($_GET['to_date'] ." 23:59:59");
             }
             break;
          case 'showp':
@@ -145,6 +150,19 @@ class PHPFSPOT {
             $this->tmpl->show("slideshow.tpl");
             return;
             break;
+         case 'rss':
+            if(isset($_GET['tags'])) {
+               $_SESSION['selected_tags'] = $this->extractTags($_GET['tags']);
+            }
+            if(isset($_GET['from_date']) && $this->isValidDate($_GET['from_date'])) {
+               $_SESSION['from_date'] = strtotime($_GET['from_date'] ." 00:00:00");
+            }
+            if(isset($_GET['to_date']) && $this->isValidDate($_GET['to_date'])) {
+               $_SESSION['to_date'] = strtotime($_GET['to_date'] ." 23:59:59");
+            }
+            $this->getRSSFeed();
+            return;
+            break;
       }
 
       if(isset($_SESSION['from_date']) && isset($_SESSION['to_date']))
@@ -226,15 +244,29 @@ class PHPFSPOT {
    public function getPhotoName($idx, $limit = 0)
    {
       if($details = $this->get_photo_details($idx)) {
-         $name = $details['name'];
-         if($limit != 0 && strlen($name) > $limit) {
-            $name = substr($name, 0, $limit-5) ."...". substr($name, -($limit-5));
-         }
+         $name = $this->shrink_text($details['name'], $limit);
          return $name;
       }
 
    } // getPhotoName()
 
+   /**
+    * shrink text according provided limit
+    *
+    * If the length of the name exceeds $limit the
+    * text will be shortend and some content in between
+    * will be replaced with "..." 
+    */
+   private function shrink_text($text, $limit)
+   {
+      if($limit != 0 && strlen($text) > $limit) {
+         $text = substr($text, 0, $limit-5) ."...". substr($text, -($limit-5));
+      }
+
+      return $text;
+
+   } // shrink_text();
+
    /**
     * translate f-spoth photo path
     * 
@@ -292,7 +324,7 @@ class PHPFSPOT {
       }
 
       $orig_path = $this->translate_path($details['directory_path']) ."/". $details['name'];
-      $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->photo_width ."_". $this->getMD5($photo);
+      $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
 
       if(!file_exists($orig_path)) {
          $this->_error("Photo ". $orig_path ." does not exist!<br />\n");
@@ -305,7 +337,7 @@ class PHPFSPOT {
       /* If the thumbnail doesn't exist yet, try to create it */
       if(!file_exists($thumb_path)) {
          $this->gen_thumb($photo, true);
-         $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->photo_width ."_". $this->getMD5($photo);
+         $thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
       }
 
       /* get f-spot database meta information */
@@ -755,7 +787,7 @@ class PHPFSPOT {
          $img_name[$rows][$cols] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
          $img_title[$rows][$cols] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
 
-         $thumb_path = $this->cfg->base_path ."/thumbs/". $this->cfg->thumb_width ."_". $this->getMD5($photos[$i]);
+         $thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i]);
 
          if(file_exists($thumb_path)) {
             $info = getimagesize($thumb_path); 
@@ -871,11 +903,14 @@ class PHPFSPOT {
       
       $current_tags = $this->getCurrentTags();
       $extern_link = "index.php?mode=showpi";
+      $rss_link = "index.php?mode=rss";
       if($current_tags != "") {
          $extern_link.= "&tags=". $current_tags;
+         $rss_link.= "&tags=". $current_tags;
       }
       if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
          $extern_link.= "&from_date=". $this->ts2str($_SESSION['from_date']) ."&to_date=". $this->ts2str($_SESSION['to_date']);
+         $rss_link.= "&from_date=". $this->ts2str($_SESSION['from_date']) ."&to_date=". $this->ts2str($_SESSION['to_date']);
       }
 
       $export_link = "index.php?mode=export";
@@ -884,6 +919,7 @@ class PHPFSPOT {
       $this->tmpl->assign('extern_link', $extern_link);
       $this->tmpl->assign('slideshow_link', $slideshow_link);
       $this->tmpl->assign('export_link', $export_link);
+      $this->tmpl->assign('rss_link', $rss_link);
       $this->tmpl->assign('count', $count);
       $this->tmpl->assign('width', $this->cfg->thumb_width);
       $this->tmpl->assign('images', $images);
@@ -1125,11 +1161,16 @@ class PHPFSPOT {
 
       $file_md5 = md5_file($full_path);
 
-      $this->_debug("Image [". $idx ."] ". $details['name'] ." Thumbnails:");
+      $this->_debug("Image [". $idx ."] ". $this->shrink_text($details['name'], 20) ." Thumbnails:");
 
       foreach($resolutions as $resolution) {
 
-         $thumb_path = $this->cfg->base_path ."/thumbs/". $resolution ."_". $file_md5;
+         $thumb_sub_path = substr($file_md5, 0, 2);
+         $thumb_path = $this->cfg->thumb_path ."/". $thumb_sub_path ."/". $resolution ."_". $file_md5;
+
+         if(!file_exists(dirname($thumb_path))) {
+            mkdir(dirname($thumb_path), 0755);
+         }
 
          /* if the thumbnail file doesn't exist, create it */
          if(!file_exists($thumb_path)) {
@@ -1374,7 +1415,7 @@ class PHPFSPOT {
          $missing = true;
       }
 
-      if(!function_exists("sqlite3_open")) {
+      if($this->cfg->db_access == "native" && !function_exists("sqlite3_open")) {
          print "PHP SQLite3 library extension is missing<br />\n";
          $missing = true;
       }
@@ -1442,9 +1483,9 @@ class PHPFSPOT {
     */
    private function get_calendar($mode)
    {
-      $year = $_SESSION[$mode .'_date'] ? date("Y", strtotime($_SESSION[$mode .'_date'])) : date("Y");
-      $month = $_SESSION[$mode .'_date'] ? date("m", strtotime($_SESSION[$mode .'_date'])) : date("m");
-      $day = $_SESSION[$mode .'_date'] ? date("d", strtotime($_SESSION[$mode .'_date'])) : date("d");
+      $year = $_SESSION[$mode .'_date'] ? date("Y", $_SESSION[$mode .'_date']) : date("Y");
+      $month = $_SESSION[$mode .'_date'] ? date("m", $_SESSION[$mode .'_date']) : date("m");
+      $day = $_SESSION[$mode .'_date'] ? date("d", $_SESSION[$mode .'_date']) : date("d");
 
       $output = "<input type=\"text\" size=\"3\" id=\"". $mode ."year\" value=\"". $year ."\"";
       if(!isset($_SESSION[$mode .'_date'])) $output.= " disabled=\"disabled\"";
@@ -1545,14 +1586,9 @@ class PHPFSPOT {
       $pictures = $this->getPhotoSelection();
       $current_tags = $this->getCurrentTags();  
 
-      if(!isset($_SERVER['HTTPS'])) $protocol = "http";
-      else $protocol = "https";
-
-      $server_name = $_SERVER['SERVER_NAME'];
-
       foreach($pictures as $picture) {
 
-         $orig_url = $protocol ."://". $server_name . $this->cfg->web_path ."index.php?mode=showp&id=". $picture;
+         $orig_url = $this->get_phpfspot_url() ."index.php?mode=showp&id=". $picture;
          if($current_tags != "") {
             $orig_url.= "&tags=". $current_tags;
          } 
@@ -1560,7 +1596,7 @@ class PHPFSPOT {
             $orig_url.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
          }
 
-         $thumb_url = $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
+         $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
 
          switch($mode) {
 
@@ -1584,6 +1620,74 @@ class PHPFSPOT {
 
    } // getExport()
 
+   /**
+    * output RSS feed
+    */
+   public function getRSSFeed()
+   {
+      Header("Content-type: text/xml; charset=utf-8");
+      print "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
+?>
+<rss version="2.0"
+   xmlns:media="http://search.yahoo.com/mrss/"
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+ >
+ <channel>
+  <title>phpfspot</title>
+  <description>phpfspot RSS feed</description>
+  <link><?php print htmlspecialchars($this->get_phpfspot_url()); ?></link>
+  <pubDate><?php print strftime("%a, %d %b %Y %T %z"); ?></pubDate>
+  <generator>phpfspot</generator>
+<?php
+
+      $pictures = $this->getPhotoSelection();
+      $current_tags = $this->getCurrentTags();  
+
+      foreach($pictures as $picture) {
+
+         $orig_url = $this->get_phpfspot_url() ."index.php?mode=showp&id=". $picture;
+         if($current_tags != "") {
+            $orig_url.= "&tags=". $current_tags;
+         } 
+         if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
+            $orig_url.= "&from_date=". $_SESSION['from_date'] ."&to_date=". $_SESSION['to_date'];
+         }
+
+         $details = $this->get_photo_details($picture);
+
+         $thumb_url = $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $picture ."&width=". $this->cfg->thumb_width;
+         $thumb_html = htmlspecialchars("
+<a href=\"". $orig_url ."\"><img src=\"". $thumb_url ."\" /></a>
+<br>
+". $details['description']);
+
+         $orig_path = $this->translate_path($details['directory_path']) ."/". $details['name'];
+         $meta = $this->get_meta_informations($orig_path);
+         $meta_date = isset($meta['FileDateTime']) ? $meta['FileDateTime'] : filemtime($orig_path);
+
+?>
+  <item>
+   <title><?php print htmlspecialchars($details['name']); ?></title>
+   <link><?php print htmlspecialchars($orig_url); ?></link>
+   <guid><?php print htmlspecialchars($orig_url); ?></guid>
+   <dc:date.Taken><?php print strftime("%Y-%m-%dT%H:%M:%S+00:00", $meta_date); ?></dc:date.Taken>
+   <description>
+    <?php print $thumb_html; ?> 
+   </description>
+   <pubDate><?php print strftime("%a, %d %b %Y %T %z"); ?></pubDate>
+  </item>
+<?php
+
+      }
+?>
+ </channel>
+</rss>
+<?php
+
+
+   } // getExport()
+
    /**
     * return all selected tags as one string
     */
@@ -1704,11 +1808,7 @@ class PHPFSPOT {
       else
          $_SESSION['slideshow_img']++;
 
-      $server_name = $_SERVER['SERVER_NAME'];
-      if(!isset($_SERVER['HTTPS'])) $protocol = "http";
-      else $protocol = "https";
-
-      return $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
+      return $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
 
    } // getNextSlideShowImage()
 
@@ -1727,11 +1827,7 @@ class PHPFSPOT {
       else
          $_SESSION['slideshow_img']--;
 
-      $server_name = $_SERVER['SERVER_NAME'];
-      if(!isset($_SERVER['HTTPS'])) $protocol = "http";
-      else $protocol = "https";
-
-      return $protocol ."://". $server_name . $this->cfg->web_path ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
+      return $this->get_phpfspot_url() ."phpfspot_img.php?idx=". $all_photos[$_SESSION['slideshow_img']] ."&width=". $this->cfg->photo_width;
 
    } // getPrevSlideShowImage()
 
@@ -1808,6 +1904,75 @@ class PHPFSPOT {
    
    } // extractTags()
 
+   /**
+    * returns the full path to a thumbnail
+    */
+   public function get_thumb_path($width, $photo)
+   {
+      $sub_path = substr($this->getMD5($photo), 0, 2);
+      return $this->cfg->thumb_path
+         . "/"
+         . $sub_path
+         . "/"
+         . $width
+         . "_"
+         . $this->getMD5($photo);
+
+   } // get_thumb_path()
+
+   /**
+    * returns server's virtual host name
+    */
+   private function get_server_name()
+   {
+      return $_SERVER['SERVER_NAME'];
+   } // get_server_name()
+
+   /**
+    * returns type of webprotocol which is
+    * currently used
+    */
+   private function get_web_protocol()
+   {
+      if(!isset($_SERVER['HTTPS']))
+         return "http";
+      else
+         return "https";
+   } // get_web_protocol()
+
+   /**
+    * return url to this phpfspot installation
+    */
+   private function get_phpfspot_url()
+   {
+      return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path;
+   } // get_phpfspot_url()
+   
+   /**
+    * check file exists and is readable
+    *
+    * returns true, if everything is ok, otherwise false
+    * if $silent is not set, this function will output and
+    * error message
+    */
+   private function check_readable($file, $silent = null)
+   {
+      if(!file_exists($file)) {
+         if(!isset($silent))
+            print "File \"". $file ."\" does not exist.\n";
+         return false;
+      }
+
+      if(!is_readable($file)) {
+         if(!isset($silent))
+            print "File \"". $file ."\" is not reachable for user ". $this->getuid() ."\n";
+         return false;
+      }
+
+      return true;
+
+   } // check_readable()
+
 }
 
 ?>