app->albumDir . "/block-random.cache"); // Defaulted to 86400 define(CACHE_EXPIRED, 9000); // 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; } } if ($rebuild) { scanAlbums(); saveCache(); } else { readCache(); } $album = chooseAlbum(); if ($album) { $index = choosePhoto($album); } if (isset($index)) { $id = $album->getPhotoId($index); echo "" /* ."" */ ."" /* ."" */ .$album->getThumbnailTag($index) .""; } else { echo $index ; /* $id = $album->getPhotoId(1); echo "" ."" .$album->getThumbnailTag($index) .""; */ } 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("/", trim($line)); $cache[$key] = $val; } fclose($fd); } } function choosePhoto($album) { global $cache; $count = $cache[$album->fields["name"]]; if ($count == 0) { // Shouldn't happen return null; } else if ($count == 1) { $choose = 1; } else { $choose = rand(1, $count); $wrap = 0; if ($album->isHidden($choose)) { $choose++; if ($choose > $album->numPhotos(1)) { $choose = 1; $wrap++; if ($wrap = 2) { return null; } } } } 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; $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; } } } } ?>