/* set application name and version information */
$this->cfg->product = "phpfspot";
- $this->cfg->version = "1.3";
+ $this->cfg->version = "1.4";
$this->sort_orders= array(
'date_asc' => 'Date ↑',
);
/* Check necessary requirements */
- if(!$this->checkRequirements()) {
+ if(!$this->check_requirements()) {
exit(1);
}
- $this->db = new PHPFSPOT_DB($this, $this->cfg->fspot_db);
+ /******* Opening F-Spot's sqlite database *********/
+
+ /* Check if database file is writeable */
if(!is_writeable($this->cfg->fspot_db)) {
print $this->cfg->fspot_db ." is not writeable for user ". $this->getuid() ."\n";
exit(1);
}
- $this->dbver = $this->getFspotDBVersion();
+ /* open the database */
+ $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 for user ". $this->getuid() ."\n";
- exit(1);
+ /* change sqlite temp directory, if requested */
+ if(isset($this->cfg->sqlite_temp_dir)) {
+ $this->db->db_exec("
+ PRAGMA
+ temp_store_directory = '". $this->cfg->sqlite_temp_dir ."'
+ ");
}
+ $this->dbver = $this->getFspotDBVersion();
+
if(!is_writeable($this->cfg->base_path ."/templates_c")) {
print $this->cfg->base_path ."/templates_c: directory is not writeable for user ". $this->getuid() ."\n";
exit(1);
}
- $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
+ if(!is_writeable($this->cfg->thumb_path)) {
+ print $this->cfg->thumb_path .": directory is not writeable for user ". $this->getuid() ."\n";
+ exit(1);
+ }
+
+ /******* Opening phpfspot's sqlite database *********/
+
+ /* Check if directory where the database file is stored is writeable */
+ if(!is_writeable(dirname($this->cfg->phpfspot_db))) {
+ print dirname($this->cfg->phpfspot_db) .": directory is not writeable for user ". $this->getuid() ."\n";
+ exit(1);
+ }
+
+ /* Check if database file is writeable */
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();
+ /* open the database */
+ $this->cfg_db = new PHPFSPOT_DB($this, $this->cfg->phpfspot_db);
- /* include Smarty template engine */
- if(!$this->check_readable($this->cfg->smarty_path .'/libs/Smarty.class.php')) {
- exit(1);
+ /* change sqlite temp directory, if requested */
+ if(isset($this->cfg->sqlite_temp_dir)) {
+ $this->cfg_db->db_exec("
+ PRAGMA
+ temp_store_directory = '". $this->cfg->sqlite_temp_dir ."'
+ ");
}
- require $this->cfg->smarty_path .'/libs/Smarty.class.php';
- /* overload Smarty class if our own template handler */
+
+ /* Check if some tables need to be created */
+ $this->check_config_table();
+
+ /* overload Smarty class with our own template handler */
require_once "phpfspot_tmpl.php";
$this->tmpl = new PHPFSPOT_TMPL($this);
$thumb_path = $this->get_thumb_path($this->cfg->photo_width, $photo);
}
- /* get f-spot database meta information */
- $meta = $this->get_meta_informations($orig_path);
+ /* get mime-type, height and width from the original photo */
+ $info = getimagesize($orig_path);
+
+ /* get EXIF information if JPEG */
+ if($info['mime'] == "image/jpeg") {
+ $meta = $this->get_meta_informations($orig_path);
+ }
/* If EXIF data are available, use them */
if(isset($meta['ExifImageWidth'])) {
$meta_res = $meta['ExifImageWidth'] ."x". $meta['ExifImageLength'];
} else {
- $info = getimagesize($orig_path);
$meta_res = $info[0] ."x". $info[1];
}
return;
}
- $info = getimagesize($thumb_path);
+ $info_thumb = getimagesize($thumb_path);
$this->tmpl->assign('description', $details['description']);
$this->tmpl->assign('image_name', $this->parse_uri($details['uri'], 'filename'));
- $this->tmpl->assign('width', $info[0]);
- $this->tmpl->assign('height', $info[1]);
+ $this->tmpl->assign('width', $info_thumb[0]);
+ $this->tmpl->assign('height', $info_thumb[1]);
$this->tmpl->assign('ExifMadeOn', $meta_date);
$this->tmpl->assign('ExifMadeWith', $meta_make);
$this->tmpl->assign('ExifOrigResolution', $meta_res);
$this->tmpl->assign('image_filename', $this->parse_uri($details['uri'], 'filename'));
$this->tmpl->assign('tags', $this->get_photo_tags($photo));
- $this->tmpl->assign('current', $current);
+ $this->tmpl->assign('current_page', $this->getCurrentPage($current, $count));
+ $this->tmpl->assign('current_img', $photo);
if($previous_img) {
$this->tmpl->assign('previous_url', "javascript:showImage(". $previous_img .");");
$this->tmpl->assign('next_img', $next_img);
}
$this->tmpl->assign('mini_width', $this->cfg->mini_width);
+ $this->tmpl->assign('photo_width', $this->cfg->photo_width);
$this->tmpl->assign('photo_number', $i);
$this->tmpl->assign('photo_count', count($all_photos));
$this->tmpl->show("single_photo.tpl");
- print "<script language=\"JavaScript\">self.location.hash = '#photo';</script>\n";
-
} // showPhoto()
/**
$max_size = 125; // max font size in %
$min_size = 75; // min font size in %
+ // color
+ $max_sat = hexdec('cc');
+ $min_sat = hexdec('44');
+
// get the largest and smallest array values
$max_qty = max(array_values($tags));
$min_qty = min(array_values($tags));
// determine the font-size increment
// this is the increase per tag quantity (times used)
$step = ($max_size - $min_size)/($spread);
+ $step_sat = ($max_sat - $min_sat)/($spread);
// loop through our tag array
foreach ($tags as $key => $value) {
// uncomment if you want sizes in whole %:
$size = ceil($size);
+ $color = $min_sat + ($value - $min_qty) * $step_sat;
+
+ $r = '44';
+ $g = dechex($color);
+ $b = '88';
+
if(isset($this->tags[$key])) {
- $output.= "<a href=\"javascript:Tags('add', ". $key .");\" class=\"tag\" style=\"font-size: ". $size ."%;\">". $this->tags[$key] ."</a>, ";
+ $output.= "<a href=\"javascript:Tags('add', ". $key .");\" class=\"tag\" style=\"font-size: ". $size ."%; color: #". $r.$g.$b .";\">". $this->tags[$key] ."</a>, ";
}
}
} // resetTags()
+ /**
+ * returns the value for the autocomplet tag-search
+ */
+ public function get_xml_tag_list()
+ {
+ if(!isset($_GET['search']) || !is_string($_GET['search']))
+ $_GET['search'] = '';
+
+ $length = 15;
+ $i = 1;
+
+ /* retrive tags from database */
+ $this->get_tags();
+
+ $matched_tags = Array();
+
+ header("Content-Type: text/xml");
+
+ $string = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
+ $string.= "<results>\n";
+
+ foreach($this->avail_tags as $tag)
+ {
+ if(!empty($_GET['search']) &&
+ preg_match("/". $_GET['search'] ."/i", $this->tags[$tag]) &&
+ count($matched_tags) < $length) {
+
+ $count = $this->get_num_photos($tag);
+
+ if($count == 1) {
+ $string.= " <rs id=\"". $i ."\" info=\"". $count ." photo\">". $this->tags[$tag] ."</rs>\n";
+ }
+ else {
+ $string.= " <rs id=\"". $i ."\" info=\"". $count ." photos\">". $this->tags[$tag] ."</rs>\n";
+
+ }
+ $i++;
+ }
+
+ /* if we have collected enough items, break out */
+ if(count($matched_tags) >= $length)
+ break;
+ }
+
+ $string.= "</results>\n";
+
+ return $string;
+
+ } // get_xml_tag_list()
+
+
/**
* reset single photo
*
public function getPhotoSelection()
{
$matched_photos = Array();
+ $additional_where_cond = "";
if(isset($_SESSION['from_date']) && isset($_SESSION['to_date'])) {
$from_date = $_SESSION['from_date'];
$to_date = $_SESSION['to_date'];
- $additional_where_cond = "
+ $additional_where_cond.= "
p.time>='". $from_date ."'
AND
p.time<='". $to_date ."'
ON pt2.tag_id=t2.id
WHERE t.name LIKE '%". $_SESSION['searchfor_tag'] ."%' ";
- if(isset($additional_where_cond))
+ if(isset($additional_where_cond) && !empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
ON pt1.photo_id=p.id
WHERE pt1.tag_id IN (". $selected .")
";
- if(isset($additional_where_cond))
+ if(isset($additional_where_cond) && !empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
AND pt". ($i+2) .".tag_id=". $_SESSION['selected_tags'][$i] ."
";
}
- if(isset($additional_where_cond))
+ if(isset($additional_where_cond) && !empty($additional_where_cond))
$query_str.= "AND ". $additional_where_cond;
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
ON pt.tag_id=t.id
";
- if(isset($additional_where_cond))
+ if(isset($additional_where_cond) && !empty($additional_where_cond))
$query_str.= "WHERE ". $additional_where_cond ." ";
if(isset($this->cfg->show_tags) && !empty($this->cfg->show_tags)) {
- if(isset($additional_where_cond))
+ if(isset($additional_where_cond) && !empty($additional_where_cond))
$query_str.= "AND t.name IN ('".implode("','",$this->cfg->show_tags). "')";
else
$query_str.= "WHERE t.name IN ('".implode("','",$this->cfg->show_tags). "')";
$count = count($photos);
- if(isset($_SESSION['begin_with']) && $_SESSION['begin_with'] != "")
- $anchor = $_SESSION['begin_with'];
-
+ /* if all thumbnails should be shown on one page */
if(!isset($this->cfg->thumbs_per_page) || $this->cfg->thumbs_per_page == 0) {
-
$begin_with = 0;
$end_with = $count;
-
}
+ /* thumbnails should be splitted up in several pages */
elseif($this->cfg->thumbs_per_page > 0) {
if(!isset($_SESSION['begin_with']) || $_SESSION['begin_with'] == 0) {
$img_width[$thumbs] = Array();
$img_id[$thumbs] = Array();
$img_name[$thumbs] = Array();
+ $img_fullname[$thumbs] = Array();
$img_title = Array();
for($i = $begin_with; $i < $end_with; $i++) {
$images[$thumbs] = $photos[$i];
$img_id[$thumbs] = $i;
$img_name[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 15));
+ $img_fullname[$thumbs] = htmlspecialchars($this->getPhotoName($photos[$i], 0));
$img_title[$thumbs] = "Click to view photo ". htmlspecialchars($this->getPhotoName($photos[$i], 0));
$thumb_path = $this->get_thumb_path($this->cfg->thumb_width, $photos[$i]);
$this->tmpl->assign('rss_link', $rss_link);
$this->tmpl->assign('count', $count);
$this->tmpl->assign('width', $this->cfg->thumb_width);
+ $this->tmpl->assign('preview_width', $this->cfg->photo_width);
$this->tmpl->assign('thumb_container_width', $this->cfg->thumb_width);
$this->tmpl->assign('thumb_container_height', $this->cfg->thumb_height+20);
$this->tmpl->assign('images', $images);
$this->tmpl->assign('img_height', $img_height);
$this->tmpl->assign('img_id', $img_id);
$this->tmpl->assign('img_name', $img_name);
+ $this->tmpl->assign('img_fullname', $img_fullname);
$this->tmpl->assign('img_title', $img_title);
$this->tmpl->assign('thumbs', $thumbs);
$this->tmpl->show("photo_index.tpl");
- if(isset($anchor))
- print "<script language=\"JavaScript\">self.location.hash = '#image". $anchor ."';</script>\n";
+ /* if we are returning to photo index from an photo-view,
+ scroll the window to the last shown photo-thumbnail.
+ after this, unset the last_photo session variable.
+ */
+ if(isset($_SESSION['last_photo'])) {
+ print "<script language=\"JavaScript\">moveToThumb(". $_SESSION['last_photo'] .");</script>\n";
+ unset($_SESSION['last_photo']);
+ }
} // showPhotoIndex()
if(!$this->checkifImageSupported($details['mime']))
return false;
- $meta = $this->get_meta_informations($orig_image);
-
- $rotate = 0;
- $flip_hori = false;
- $flip_vert = false;
-
- switch($meta['Orientation']) {
- case 1: /* top, left */
- /* nothing to do */ break;
- case 2: /* top, right */
- $rotate = 0; $flip_hori = true; break;
- case 3: /* bottom, left */
- $rotate = 180; break;
- case 4: /* bottom, right */
- $flip_vert = true; break;
- case 5: /* left side, top */
- $rotate = 90; $flip_vert = true; break;
- case 6: /* right side, top */
- $rotate = 90; break;
- case 7: /* left side, bottom */
- $rotate = 270; $flip_vert = true; break;
- case 8: /* right side, bottom */
- $rotate = 270; break;
- }
-
- $src_img = @imagecreatefromjpeg($orig_image);
+ switch($details['mime']) {
+
+ case 'image/jpeg':
+
+ $meta = $this->get_meta_informations($orig_image);
+
+ $rotate = 0;
+ $flip_hori = false;
+ $flip_vert = false;
+
+ switch($meta['Orientation']) {
+ case 1: /* top, left */
+ /* nothing to do */ break;
+ case 2: /* top, right */
+ $rotate = 0; $flip_hori = true; break;
+ case 3: /* bottom, left */
+ $rotate = 180; break;
+ case 4: /* bottom, right */
+ $flip_vert = true; break;
+ case 5: /* left side, top */
+ $rotate = 90; $flip_vert = true; break;
+ case 6: /* right side, top */
+ $rotate = 90; break;
+ case 7: /* left side, bottom */
+ $rotate = 270; $flip_vert = true; break;
+ case 8: /* right side, bottom */
+ $rotate = 270; break;
+ }
+
+ $src_img = @imagecreatefromjpeg($orig_image);
+ break;
+
+ case 'image/png':
+
+ $src_img = @imagecreatefrompng($orig_image);
+ break;
+
+ }
if(!$src_img) {
print "Can't load image from ". $orig_image ."\n";
$thumb_sub_path = substr($file_md5, 0, 2);
$thumb_path = $this->cfg->thumb_path ."/". $thumb_sub_path ."/". $resolution ."_". $file_md5;
+ /* if thumbnail-subdirectory does not exist yet, create it */
if(!file_exists(dirname($thumb_path))) {
mkdir(dirname($thumb_path), 0755);
}
* getPhotoSelection() will then only return the matching
* photos.
*/
- public function startSearch($searchfor_tag, $from = 0, $to = 0)
+ public function startSearch()
{
if(isset($_POST['from']) && $this->isValidDate($_POST['from'])) {
$from = $_POST['from'];
if(isset($_POST['for_tag']) && is_string($_POST['for_tag'])) {
$searchfor_tag = $_POST['for_tag'];
+ $_SESSION['searchfor_tag'] = $_POST['for_tag'];
}
if(isset($_POST['for_name']) && is_string($_POST['for_name'])) {
$searchfor_name = $_POST['for_name'];
+ $_SESSION['searchfor_name'] = $_POST['for_name'];
}
$this->get_tags();
- $_SESSION['searchfor_tag'] = $searchfor_tag;
- $_SESSION['searchfor_name'] = $searchfor_name;
-
- if($from != 0)
+ if(isset($from) && !empty($from))
$_SESSION['from_date'] = strtotime($from ." 00:00:00");
else
unset($_SESSION['from_date']);
- if($to != 0)
+ if(isset($to) && !empty($to))
$_SESSION['to_date'] = strtotime($to ." 23:59:59");
else
unset($_SESSION['to_date']);
- if($searchfor_tag != "") {
+ if(isset($searchfor_tag) && !empty($searchfor_tag)) {
/* new search, reset the current selected tags */
$_SESSION['selected_tags'] = Array();
foreach($this->avail_tags as $tag) {
/**
* check if all requirements are met
*/
- private function checkRequirements()
+ private function check_requirements()
{
if(!function_exists("imagecreatefromjpeg")) {
print "PHP GD library extension is missing<br />\n";
print "PEAR Console_Getopt package is missing<br />\n";
$missing = true;
}
+ @include_once $this->cfg->smarty_path .'/libs/Smarty.class.php';
+ if(isset($php_errormsg) && preg_match('/Failed opening.*for inclusion/i', $php_errormsg)) {
+ print "Smarty template engine can not be found in ". $this->cfg->smarty_path ."/libs/Smarty.class.php<br />\n";
+ $missing = true;
+ }
ini_restore('track_errors');
if(isset($missing))
return true;
- } // checkRequirements()
+ } // check_requirements()
private function _debug($text)
{
*/
public function checkifImageSupported($mime)
{
- if(in_array($mime, Array("image/jpeg")))
+ if(in_array($mime, Array("image/jpeg", "image/png")))
return true;
return false;
". $details['description']);
$orig_path = $this->translate_path($this->parse_uri($details['uri'], 'fullpath'));
- $meta = $this->get_meta_informations($orig_path);
+
+ /* get EXIF information if JPEG */
+ if($details['mime'] == "image/jpeg") {
+ $meta = $this->get_meta_informations($orig_path);
+ }
+
$meta_date = isset($meta['FileDateTime']) ? $meta['FileDateTime'] : filemtime($orig_path);
?>
{
return $this->get_web_protocol() ."://". $this->get_server_name() . $this->cfg->web_path;
} // get_phpfspot_url()
+
+ /**
+ * returns the number of photos which are tagged with $tag_id
+ */
+ public function get_num_photos($tag_id)
+ {
+ if($result = $this->db->db_fetchSingleRow("
+ SELECT count(*) as number
+ FROM photo_tags
+ WHERE
+ tag_id LIKE '". $tag_id ."'")) {
+
+ return $result['number'];
+
+ }
+
+ return 0;
+
+ } // get_num_photos()
/**
* check file exists and is readable
}
/* check for pending slash on web_path */
- if(!preg_match("/\/$/", $this->web_path))
- $this->web_path.= "/";
+ if(!preg_match("/\/$/", $this->cfg->web_path))
+ $this->cfg->web_path.= "/";
return $this->runtime_error;
} // cleanup_phpfspot_db()
+ /**
+ * return first image of the page, the $current photo
+ * lies in.
+ *
+ * this function is used to find out the first photo of the
+ * current page, in which the $current photo lies. this is
+ * used to display the correct photo, when calling showPhotoIndex()
+ * from showImage()
+ */
+ private function getCurrentPage($current, $max)
+ {
+ if(isset($this->cfg->thumbs_per_page) && !empty($this->cfg->thumbs_per_page)) {
+ for($page_start = 0; $page_start <= $max; $page_start+=$this->cfg->thumbs_per_page) {
+ if($current >= $page_start && $current < ($page_start+$this->cfg->thumbs_per_page))
+ return $page_start;
+ }
+ }
+ return 0;
+
+ } // getCurrentPage()
+
} // class PHPFSPOT
?>