app->albumDir . "/block-random.cache"); define(CACHE_EXPIRED, 86400); // Check the cache file to see if it's up to date $rebuild = 1; if (fs_file_exists(CACHE_FILE)) { $stat = fs_stat(CACHE_FILE); $mtime = $stat[9]; if (time() - $mtime < CACHE_EXPIRED) { $rebuild = 0; } } // Only select sub-albums that Everybody can access $everybody = $gallery->userDB->getEverybody(); if ($rebuild) { scanAlbums(); saveCache(); } else { readCache(); } // Parameter: size // Specify that the thumbnail image should be resized when displayed, // to fit a specific dimension in both height and width. Aspect ratio is maintained. // Intended to reduce the size of images, but if the size specified is larger than either thumbnail dimension, // the image will be enlarged (with a corresponding loss of quality.) // Note: This does not create an additional thumbnail, nor does it alter the existing thumbnail; // the image is dynamically scaled by the browser when rendered. // Example: size=75 // Default: 0, meaning no resize. if (!empty($HTTP_GET_VARS["size"])) $size = $HTTP_GET_VARS["size"]; else $size = 0; // Parameter: domain // Specify the value to which document.domain should be set. // Not needed if this page and the page calling it are on the same server. // Allows the page embedding this random photo page to resize the containing IFRAME, // when the two pages are on different servers, but within a common domain (e.g. "www.foo.com" and "gallery.foo.com"). // The value specified must be the common suffix of the two server names, cannot be simply ".com", // and the calling page must set its document.domain to the same value. // Example: domain=foo.com // Default: none. If not specified, no document.domain statement will be executed. if (!empty($HTTP_GET_VARS["domain"])) $domain = $HTTP_GET_VARS["domain"]; // Parameter: target // Specify the value to be used in the target= attribute of the A tag. // Example: target=_top // Default: _blank if (!empty($HTTP_GET_VARS["target"])) $targetAttr = "target=\"".$HTTP_GET_VARS["target"] ."\""; else $targetAttr = "target=\"_blank\""; // Parameter: album // Limit the photo block to only one album (including its sub-albums). // Example: album=nytrip // Default: none. If not specified, all visible albums will be used. if (!empty($HTTP_GET_VARS["album"])) { $album = new Album(); $album->load($HTTP_GET_VARS["album"]); } else $album = chooseAlbum(); if ($album) { $index = choosePhoto(); } if (!$GALLERY_EMBEDDED_INSIDE) { echo "" .getStyleSheetLink(); echo ""; if ($domain) { echo ""; } echo ""; } if (isset($index)) { $id = $album->getPhotoId($index); echo "
" ."fields["name"], $id) ."\" $targetAttr>" .$album->getThumbnailTag($index,$size) .""; $caption = $album->getCaption($index); echo ""; if ($caption) { echo "
$caption"; } echo "
From: " ."fields["name"]) ."\" $targetAttr>" .$album->fields["title"] ."
"; } else { // No photo chosen. Provide link to album itself, otherwise to top-level of gallery. if ($album) { echo "
" ."fields["name"]) ."\" $targetAttr>" .$album->getHighlightAsThumbnailTag($size) ."
" ."fields["name"]) ."\" $targetAttr>" .$album->fields["title"] ."
"; } else { print "
" . $gallery->app->galleryTitle . "
"; } // print "No photo chosen."; } if ($profile) { $elapsed = time() - $timer; print "
Elapsed: $elapsed secs"; } /* * -------------------------------------------------- * Support functions * -------------------------------------------------- */ function saveCache() { global $cache; if ($fd = fs_fopen(CACHE_FILE, "w")) { foreach ($cache as $key => $val) { fwrite($fd, "$key/$val\n"); } fclose($fd); } } function readCache() { global $cache; if ($fd = fs_fopen(CACHE_FILE, "r")) { while ($line = fgets($fd, 4096)) { list($key, $val) = explode("/", $line); $cache[$key] = trim($val); } fclose($fd); } } function choosePhoto() { global $cache; global $album; $count = $cache[$album->fields["name"]]; if ($count == 0) { // Shouldn't happen return null; } else if ($count == 1) { $choose = 1; } else { $choose = rand(1, (int) $count); $wrap = 0; // Skip an item in the album if it is Private (a hidden photo, or a protected sub-album) while ( isPrivate($album, $choose) ) { $choose++; if ($choose > $count) { $choose = 1; $wrap++; if ($wrap == 2) { return null; } } } } /* * If we've picked a sub-album, then * make it the chosen album, and * recursively choose a photo from *it* */ $isSubAlbum = FALSE; $subAlbumName = ''; // Backwards compatibility was lost in v1.4.3 if (method_exists($album, 'isAlbum')) { // Gallery v1.4.3 or later if ( $album->isAlbum($choose) ) { $isSubAlbum = TRUE; $subAlbumName = $album->getAlbumName($choose); } } else { // Gallery v1.4.2 or earlier if ( $album->isAlbumName($choose) ) { $isSubAlbum = TRUE; $subAlbumName = $album->isAlbumName($choose); } } if ( $isSubAlbum ) { $album->load($subAlbumName); return choosePhoto(); } return $choose; } function chooseAlbum() { global $cache; /* * The odds that an album will be selected is proportional * to the number of (visible) items in the album. */ $total = 0; foreach ($cache as $name => $count) { if (!$choose) { $choose = $name; } $total += $count; if ($total != 0 && ($total == 1 || rand(1, $total) <= $count)) { $choose = $name; } } if ($choose) { $album = new Album(); $album->load($choose); return $album; } else { return null; } } function scanAlbums() { global $cache; global $gallery; global $everybody; $cache = array(); // $everybody = $gallery->userDB->getEverybody(); $albumDB = new AlbumDB(); foreach ($albumDB->albumList as $tmpAlbum) { if ($everybody->canReadAlbum($tmpAlbum)) { $seeHidden = $everybody->canWriteToAlbum($tmpAlbum); $numPhotos = $tmpAlbum->numPhotos($seeHidden); $name = $tmpAlbum->fields["name"]; if ($numPhotos > 0) { $cache[$name] = $numPhotos; } } } } function isPrivate($alb, $idx) { global $everybody; $isSubAlbum = FALSE; $subAlbumName = ''; if (method_exists($alb, 'isAlbum')) { // Gallery v1.4.3 or later $isSubAlbum = $alb->isAlbum($idx); $subAlbumName = $alb->getAlbumName($idx); } else { // Gallery v1.4.2 or earlier $isSubAlbum = $alb->isAlbumName($idx); $subAlbumName = $alb->isAlbumName($idx); } if ( $isSubAlbum ) { $tmpAlb = new Album(); $tmpAlb->load($subAlbumName); return ! $everybody->canReadAlbum($tmpAlb); } return $alb->isHidden($idx); } ?>