2014-04-02 20:14:20 +00:00
< ? php
2016-01-26 14:31:53 +00:00
namespace Lychee\Modules ;
2014-04-02 20:14:20 +00:00
2016-01-30 22:24:08 +00:00
use ZipArchive ;
2016-01-30 20:33:31 +00:00
final class Album {
2014-04-02 20:14:20 +00:00
2016-01-30 19:22:28 +00:00
private $albumIDs = null ;
2014-04-02 20:14:20 +00:00
2016-01-24 21:14:20 +00:00
public function __construct ( $albumIDs ) {
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Init vars
$this -> albumIDs = $albumIDs ;
2014-04-02 20:14:20 +00:00
return true ;
}
2016-01-24 21:14:20 +00:00
public function add ( $title = 'Untitled' ) {
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Parse
2014-04-02 20:14:20 +00:00
if ( strlen ( $title ) > 50 ) $title = substr ( $title , 0 , 50 );
2016-01-30 20:43:57 +00:00
// Properties
$public = 0 ;
$visible = 1 ;
2016-01-24 21:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Database
$sysstamp = time ();
$query = Database :: prepare ( Database :: get (), " INSERT INTO ? (title, sysstamp, public, visible) VALUES ('?', '?', '?', '?') " , array ( LYCHEE_TABLE_ALBUMS , $title , $sysstamp , $public , $visible ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-02 20:14:20 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2016-01-24 21:14:20 +00:00
return Database :: get () -> insert_id ;
2014-04-02 20:14:20 +00:00
}
2016-01-30 00:06:21 +00:00
public static function prepareData ( array $data ) {
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
// This function requires the following album-attributes and turns them
// into a front-end friendly format: id, title, public, sysstamp, password
// Note that some attributes remain unchanged
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
// Init
2015-03-12 11:57:48 +00:00
$album = null ;
2016-01-30 20:43:57 +00:00
// Set unchanged attributes
$album [ 'id' ] = $data [ 'id' ];
$album [ 'title' ] = $data [ 'title' ];
$album [ 'public' ] = $data [ 'public' ];
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
// Additional attributes
// Only part of $album when available
if ( isset ( $data [ 'description' ])) $album [ 'description' ] = $data [ 'description' ];
if ( isset ( $data [ 'visible' ])) $album [ 'visible' ] = $data [ 'visible' ];
if ( isset ( $data [ 'downloadable' ])) $album [ 'downloadable' ] = $data [ 'downloadable' ];
2015-12-21 14:01:19 +00:00
2016-01-30 20:43:57 +00:00
// Parse date
2015-03-12 11:57:48 +00:00
$album [ 'sysdate' ] = date ( 'F Y' , $data [ 'sysstamp' ]);
2016-01-30 20:43:57 +00:00
// Parse password
2015-03-12 11:57:48 +00:00
$album [ 'password' ] = ( $data [ 'password' ] == '' ? '0' : '1' );
2016-01-30 20:43:57 +00:00
// Parse thumbs or set default value
2015-12-21 14:01:19 +00:00
$album [ 'thumbs' ] = ( isset ( $data [ 'thumbs' ]) ? explode ( ',' , $data [ 'thumbs' ]) : array ());
2015-03-12 11:57:48 +00:00
return $album ;
}
2014-04-04 17:34:12 +00:00
public function get () {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Get album information
2014-04-27 12:40:54 +00:00
switch ( $this -> albumIDs ) {
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
case 'f' :
$return [ 'public' ] = '0' ;
$query = Database :: prepare ( Database :: get (), " SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE star = 1 " . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
break ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
case 's' :
$return [ 'public' ] = '0' ;
$query = Database :: prepare ( Database :: get (), " SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE public = 1 " . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
break ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
case 'r' :
$return [ 'public' ] = '0' ;
$query = Database :: prepare ( Database :: get (), " SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) " . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
break ;
2014-06-29 13:40:06 +00:00
2016-01-30 20:43:57 +00:00
case '0' :
$return [ 'public' ] = '0' ;
$query = Database :: prepare ( Database :: get (), " SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE album = 0 " . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
break ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
default :
$query = Database :: prepare ( Database :: get (), " SELECT * FROM ? WHERE id = '?' LIMIT 1 " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$albums = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$return = $albums -> fetch_assoc ();
$return = Album :: prepareData ( $return );
$query = Database :: prepare ( Database :: get (), " SELECT id, title, tags, public, star, album, thumbUrl, takestamp, url FROM ? WHERE album = '?' " . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS , $this -> albumIDs ));
break ;
2014-04-04 17:34:12 +00:00
}
2016-01-30 20:43:57 +00:00
// Get photos
2016-01-31 17:49:31 +00:00
$photos = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$previousPhotoID = '' ;
2016-01-31 17:49:31 +00:00
if ( $photos === false ) exit ( 'Error: Could not get photos of album from database!' );
2014-04-27 12:40:54 +00:00
while ( $photo = $photos -> fetch_assoc ()) {
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Turn data from the database into a front-end friendly format
2015-03-11 23:11:16 +00:00
$photo = Photo :: prepareData ( $photo );
2016-01-30 20:43:57 +00:00
// Set previous and next photoID for navigation purposes
2015-03-11 23:11:16 +00:00
$photo [ 'previousPhoto' ] = $previousPhotoID ;
2016-01-30 20:43:57 +00:00
$photo [ 'nextPhoto' ] = '' ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Set current photoID as nextPhoto of previous photo
2014-04-04 17:34:12 +00:00
if ( $previousPhotoID !== '' ) $return [ 'content' ][ $previousPhotoID ][ 'nextPhoto' ] = $photo [ 'id' ];
$previousPhotoID = $photo [ 'id' ];
2016-01-30 20:43:57 +00:00
// Add to return
2014-04-04 17:34:12 +00:00
$return [ 'content' ][ $photo [ 'id' ]] = $photo ;
}
if ( $photos -> num_rows === 0 ) {
2016-01-30 20:43:57 +00:00
// Album empty
2014-04-04 17:34:12 +00:00
$return [ 'content' ] = false ;
} else {
2016-01-30 20:43:57 +00:00
// Enable next and previous for the first and last photo
$lastElement = end ( $return [ 'content' ]);
$lastElementId = $lastElement [ 'id' ];
$firstElement = reset ( $return [ 'content' ]);
$firstElementId = $firstElement [ 'id' ];
2014-04-04 17:34:12 +00:00
if ( $lastElementId !== $firstElementId ) {
2016-01-30 20:43:57 +00:00
$return [ 'content' ][ $lastElementId ][ 'nextPhoto' ] = $firstElementId ;
$return [ 'content' ][ $firstElementId ][ 'previousPhoto' ] = $lastElementId ;
2014-04-04 17:34:12 +00:00
}
}
2016-01-30 20:43:57 +00:00
$return [ 'id' ] = $this -> albumIDs ;
$return [ 'num' ] = $photos -> num_rows ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-04 17:34:12 +00:00
return $return ;
}
2016-01-30 20:33:31 +00:00
public function getAll ( $public = true ) {
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Initialize return var
2015-02-27 19:37:24 +00:00
$return = array (
2016-01-30 20:43:57 +00:00
'smartalbums' => null ,
'albums' => null ,
'num' => 0
2015-02-27 19:37:24 +00:00
);
2016-01-30 20:43:57 +00:00
// Get SmartAlbums
2015-02-27 19:37:24 +00:00
if ( $public === false ) $return [ 'smartalbums' ] = $this -> getSmartInfo ();
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Albums query
if ( $public === false ) $query = Database :: prepare ( Database :: get (), 'SELECT id, title, public, sysstamp, password FROM ? ' . Settings :: get ()[ 'sortingAlbums' ], array ( LYCHEE_TABLE_ALBUMS ));
else $query = Database :: prepare ( Database :: get (), 'SELECT id, title, public, sysstamp, password FROM ? WHERE public = 1 AND visible <> 0 ' . Settings :: get ()[ 'sortingAlbums' ], array ( LYCHEE_TABLE_ALBUMS ));
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
2016-01-31 17:49:31 +00:00
$albums = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-31 14:44:54 +00:00
2016-01-31 17:49:31 +00:00
if ( $albums === false ) exit ( 'Error: Could not get albums from database!' );
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// For each album
2014-04-02 20:14:20 +00:00
while ( $album = $albums -> fetch_assoc ()) {
2016-01-30 20:43:57 +00:00
// Turn data from the database into a front-end friendly format
2015-03-12 11:57:48 +00:00
$album = Album :: prepareData ( $album );
2014-04-02 20:14:20 +00:00
2016-01-30 20:43:57 +00:00
// Thumbs
2015-03-11 23:11:16 +00:00
if (( $public === true && $album [ 'password' ] === '0' ) ||
( $public === false )) {
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " SELECT thumbUrl FROM ? WHERE album = '?' ORDER BY star DESC, " . substr ( Settings :: get ()[ 'sortingPhotos' ], 9 ) . " LIMIT 3 " , array ( LYCHEE_TABLE_PHOTOS , $album [ 'id' ]));
2016-01-31 17:49:31 +00:00
$thumbs = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2015-12-21 14:09:05 +00:00
2016-01-31 17:49:31 +00:00
if ( $thumbs === false ) exit ( 'Error: Could not get thumbs of album from database!' );
2016-01-31 14:44:54 +00:00
2016-01-30 20:43:57 +00:00
// For each thumb
2015-12-29 11:06:44 +00:00
$k = 0 ;
while ( $thumb = $thumbs -> fetch_object ()) {
$album [ 'thumbs' ][ $k ] = LYCHEE_URL_UPLOADS_THUMB . $thumb -> thumbUrl ;
2015-03-11 23:11:16 +00:00
$k ++ ;
}
2014-04-02 20:14:20 +00:00
}
2016-01-30 20:43:57 +00:00
// Add to return
2015-05-14 13:42:28 +00:00
$return [ 'albums' ][] = $album ;
2014-04-02 20:14:20 +00:00
}
2016-01-30 20:43:57 +00:00
// Num of albums
2014-04-02 20:14:20 +00:00
$return [ 'num' ] = $albums -> num_rows ;
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-09-17 21:11:02 +00:00
2014-04-02 20:14:20 +00:00
return $return ;
}
2014-04-04 17:34:12 +00:00
private function getSmartInfo () {
2016-01-30 20:43:57 +00:00
// Initialize return var
2015-02-27 19:37:24 +00:00
$return = array (
2016-01-30 20:43:57 +00:00
'unsorted' => null ,
'public' => null ,
'starred' => null ,
'recent' => null
2015-02-27 19:37:24 +00:00
);
2016-01-30 20:43:57 +00:00
/**
* Unsorted
*/
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), 'SELECT thumbUrl FROM ? WHERE album = 0 ' . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
2016-01-31 17:49:31 +00:00
$unsorted = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$i = 0 ;
2015-03-12 11:57:48 +00:00
2016-01-31 17:49:31 +00:00
if ( $unsorted === false ) exit ( 'Error: Could not get unsorted photos from database!' );
2015-03-12 11:57:48 +00:00
$return [ 'unsorted' ] = array (
2016-01-30 20:43:57 +00:00
'thumbs' => array (),
'num' => $unsorted -> num_rows
2015-03-12 11:57:48 +00:00
);
2014-04-04 17:34:12 +00:00
while ( $row = $unsorted -> fetch_object ()) {
if ( $i < 3 ) {
2015-03-12 11:57:48 +00:00
$return [ 'unsorted' ][ 'thumbs' ][ $i ] = LYCHEE_URL_UPLOADS_THUMB . $row -> thumbUrl ;
2014-04-04 17:34:12 +00:00
$i ++ ;
} else break ;
}
2016-01-30 20:43:57 +00:00
/**
* Starred
*/
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), 'SELECT thumbUrl FROM ? WHERE star = 1 ' . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
2016-01-31 17:49:31 +00:00
$starred = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$i = 0 ;
2015-03-12 11:57:48 +00:00
2016-01-31 17:49:31 +00:00
if ( $starred === false ) exit ( 'Error: Could not get starred photos from database!' );
2015-03-12 11:57:48 +00:00
$return [ 'starred' ] = array (
2016-01-30 20:43:57 +00:00
'thumbs' => array (),
'num' => $starred -> num_rows
2015-03-12 11:57:48 +00:00
);
2015-02-27 19:37:24 +00:00
while ( $row3 = $starred -> fetch_object ()) {
2014-04-04 17:34:12 +00:00
if ( $i < 3 ) {
2015-03-12 11:57:48 +00:00
$return [ 'starred' ][ 'thumbs' ][ $i ] = LYCHEE_URL_UPLOADS_THUMB . $row3 -> thumbUrl ;
2014-04-04 17:34:12 +00:00
$i ++ ;
} else break ;
}
2016-01-30 20:43:57 +00:00
/**
* Public
*/
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), 'SELECT thumbUrl FROM ? WHERE public = 1 ' . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
2016-01-31 17:49:31 +00:00
$public = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$i = 0 ;
2015-03-12 11:57:48 +00:00
2016-01-31 17:49:31 +00:00
if ( $public === false ) exit ( 'Error: Could not get public photos from database!' );
2015-03-12 11:57:48 +00:00
$return [ 'public' ] = array (
2016-01-30 20:43:57 +00:00
'thumbs' => array (),
'num' => $public -> num_rows
2015-03-12 11:57:48 +00:00
);
2015-02-27 19:37:24 +00:00
while ( $row2 = $public -> fetch_object ()) {
2014-04-04 17:34:12 +00:00
if ( $i < 3 ) {
2015-03-12 11:57:48 +00:00
$return [ 'public' ][ 'thumbs' ][ $i ] = LYCHEE_URL_UPLOADS_THUMB . $row2 -> thumbUrl ;
2014-04-04 17:34:12 +00:00
$i ++ ;
} else break ;
}
2016-01-30 20:43:57 +00:00
/**
* Recent
*/
2015-03-12 11:57:48 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), 'SELECT thumbUrl FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) ' . Settings :: get ()[ 'sortingPhotos' ], array ( LYCHEE_TABLE_PHOTOS ));
2016-01-31 17:49:31 +00:00
$recent = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2016-01-30 20:43:57 +00:00
$i = 0 ;
2015-03-12 11:57:48 +00:00
2016-01-31 17:49:31 +00:00
if ( $recent === false ) exit ( 'Error: Could not get recent photos from database!' );
2015-03-12 11:57:48 +00:00
$return [ 'recent' ] = array (
2016-01-30 20:43:57 +00:00
'thumbs' => array (),
'num' => $recent -> num_rows
2015-03-12 11:57:48 +00:00
);
2014-06-29 13:40:06 +00:00
while ( $row3 = $recent -> fetch_object ()) {
if ( $i < 3 ) {
2015-03-12 11:57:48 +00:00
$return [ 'recent' ][ 'thumbs' ][ $i ] = LYCHEE_URL_UPLOADS_THUMB . $row3 -> thumbUrl ;
2014-06-29 13:40:06 +00:00
$i ++ ;
} else break ;
}
2016-01-30 20:43:57 +00:00
// Return SmartAlbums
2014-04-04 17:34:12 +00:00
return $return ;
}
public function getArchive () {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Illicit chars
2014-06-18 21:36:00 +00:00
$badChars = array_merge (
2016-01-30 20:43:57 +00:00
array_map ( 'chr' , range ( 0 , 31 )),
array ( " < " , " > " , " : " , '"' , " / " , " \\ " , " | " , " ? " , " * " )
);
2014-06-18 21:36:00 +00:00
2016-01-30 20:43:57 +00:00
// Photos query
2014-04-04 17:34:12 +00:00
switch ( $this -> albumIDs ) {
case 's' :
2016-01-30 20:43:57 +00:00
$photos = Database :: prepare ( Database :: get (), 'SELECT title, url FROM ? WHERE public = 1' , array ( LYCHEE_TABLE_PHOTOS ));
$zipTitle = 'Public' ;
2014-04-04 17:34:12 +00:00
break ;
case 'f' :
2016-01-30 20:43:57 +00:00
$photos = Database :: prepare ( Database :: get (), 'SELECT title, url FROM ? WHERE star = 1' , array ( LYCHEE_TABLE_PHOTOS ));
$zipTitle = 'Starred' ;
2014-04-04 17:34:12 +00:00
break ;
2014-06-29 13:40:06 +00:00
case 'r' :
2016-01-30 20:43:57 +00:00
$photos = Database :: prepare ( Database :: get (), 'SELECT title, url FROM ? WHERE LEFT(id, 10) >= unix_timestamp(DATE_SUB(NOW(), INTERVAL 1 DAY)) GROUP BY checksum' , array ( LYCHEE_TABLE_PHOTOS ));
$zipTitle = 'Recent' ;
2014-06-29 13:40:06 +00:00
break ;
2014-04-04 17:34:12 +00:00
default :
2016-01-30 20:43:57 +00:00
$photos = Database :: prepare ( Database :: get (), " SELECT title, url FROM ? WHERE album = '?' " , array ( LYCHEE_TABLE_PHOTOS , $this -> albumIDs ));
$zipTitle = 'Unsorted' ;
2014-04-04 17:34:12 +00:00
}
2016-01-30 20:43:57 +00:00
// Get title from database when album is not a SmartAlbum
2014-08-29 17:27:09 +00:00
if ( $this -> albumIDs != 0 && is_numeric ( $this -> albumIDs )) {
2015-04-06 16:48:52 +00:00
2016-01-24 21:14:20 +00:00
$query = Database :: prepare ( Database :: get (), " SELECT title FROM ? WHERE id = '?' LIMIT 1 " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$album = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2015-04-06 16:48:52 +00:00
2016-01-31 17:49:31 +00:00
if ( $album === false ) exit ( 'Error: Could not get album from database!' );
2015-04-06 16:48:52 +00:00
2016-01-31 17:49:31 +00:00
// Get album object
2015-04-06 16:48:52 +00:00
$album = $album -> fetch_object ();
2016-01-30 20:43:57 +00:00
// Photo not found
2015-04-06 16:48:52 +00:00
if ( $album === null ) {
2016-01-31 17:49:31 +00:00
Log :: error ( Database :: get (), __METHOD__ , __LINE__ , 'Could not find specified album' );
exit ( 'Error: Could not find specified album!' );
2015-04-06 16:48:52 +00:00
}
2016-01-30 20:43:57 +00:00
// Set title
2015-04-06 16:48:52 +00:00
$zipTitle = $album -> title ;
2014-08-29 17:27:09 +00:00
}
2014-06-18 21:36:00 +00:00
2016-01-30 20:43:57 +00:00
// Escape title
2014-06-18 21:36:00 +00:00
$zipTitle = str_replace ( $badChars , '' , $zipTitle );
2014-04-13 12:08:18 +00:00
$filename = LYCHEE_DATA . $zipTitle . '.zip' ;
2014-04-12 17:55:05 +00:00
2016-01-30 20:43:57 +00:00
// Create zip
2014-04-12 17:55:05 +00:00
$zip = new ZipArchive ();
2014-05-06 19:37:21 +00:00
if ( $zip -> open ( $filename , ZIPARCHIVE :: CREATE ) !== TRUE ) {
2016-01-31 17:49:31 +00:00
Log :: error ( Database :: get (), __METHOD__ , __LINE__ , 'Could not create ZipArchive' );
2014-05-06 19:37:21 +00:00
return false ;
}
2014-04-12 17:55:05 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
2016-01-31 17:49:31 +00:00
$photos = Database :: execute ( Database :: get (), $photos , __METHOD__ , __LINE__ );
if ( $album === null ) exit ( 'Error: Could not get photos from database!' );
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Check if album empty
2014-05-06 19:37:21 +00:00
if ( $photos -> num_rows == 0 ) {
2016-01-31 17:49:31 +00:00
Log :: error ( Database :: get (), __METHOD__ , __LINE__ , 'Could not create ZipArchive without images' );
exit ( 'Error: Could not create ZipArchive without images!' );
2014-05-06 19:37:21 +00:00
}
2014-04-12 16:00:11 +00:00
2016-01-30 20:43:57 +00:00
// Parse each path
2014-04-12 17:55:05 +00:00
$files = array ();
2014-04-04 17:34:12 +00:00
while ( $photo = $photos -> fetch_object ()) {
2016-01-30 20:43:57 +00:00
// Parse url
2014-04-13 12:08:18 +00:00
$photo -> url = LYCHEE_UPLOADS_BIG . $photo -> url ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Parse title
2014-04-12 17:55:05 +00:00
$photo -> title = str_replace ( $badChars , '' , $photo -> title );
if ( ! isset ( $photo -> title ) || $photo -> title === '' ) $photo -> title = 'Untitled' ;
2014-04-12 16:00:11 +00:00
2016-01-30 20:43:57 +00:00
// Check if readable
2014-04-12 17:55:05 +00:00
if ( !@ is_readable ( $photo -> url )) continue ;
2016-01-30 20:43:57 +00:00
// Get extension of image
2014-05-20 10:44:08 +00:00
$extension = getExtension ( $photo -> url );
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// Set title for photo
2014-06-14 21:05:45 +00:00
$zipFileName = $zipTitle . '/' . $photo -> title . $extension ;
2014-04-12 17:55:05 +00:00
2016-01-30 20:43:57 +00:00
// Check for duplicates
2014-04-12 17:55:05 +00:00
if ( ! empty ( $files )) {
$i = 1 ;
while ( in_array ( $zipFileName , $files )) {
2016-01-30 20:43:57 +00:00
// Set new title for photo
2014-05-20 10:44:08 +00:00
$zipFileName = $zipTitle . '/' . $photo -> title . '-' . $i . $extension ;
2014-04-12 17:55:05 +00:00
$i ++ ;
}
}
2014-04-12 16:00:11 +00:00
2016-01-30 20:43:57 +00:00
// Add to array
2014-04-12 17:55:05 +00:00
$files [] = $zipFileName ;
2014-04-12 16:00:11 +00:00
2016-01-30 20:43:57 +00:00
// Add photo to zip
2014-04-12 17:55:05 +00:00
$zip -> addFile ( $photo -> url , $zipFileName );
2014-04-12 16:00:11 +00:00
2014-04-04 17:34:12 +00:00
}
2016-01-30 20:43:57 +00:00
// Finish zip
2014-04-04 17:34:12 +00:00
$zip -> close ();
2016-01-30 20:43:57 +00:00
// Send zip
2014-04-04 17:34:12 +00:00
header ( " Content-Type: application/zip " );
header ( " Content-Disposition: attachment; filename= \" $zipTitle .zip \" " );
2014-04-26 17:37:02 +00:00
header ( " Content-Length: " . filesize ( $filename ));
2014-04-04 17:34:12 +00:00
readfile ( $filename );
2016-01-30 20:43:57 +00:00
// Delete zip
2014-04-04 17:34:12 +00:00
unlink ( $filename );
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-04 17:34:12 +00:00
return true ;
}
2014-04-03 16:38:58 +00:00
public function setTitle ( $title = 'Untitled' ) {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET title = '?' WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $title , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-03 16:38:58 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2014-04-03 16:38:58 +00:00
return true ;
}
public function setDescription ( $description = '' ) {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET description = '?' WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $description , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-03 16:38:58 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2014-04-03 16:38:58 +00:00
return true ;
}
2014-04-05 13:59:31 +00:00
public function getPublic () {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-05 13:59:31 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-05 13:59:31 +00:00
if ( $this -> albumIDs === '0' || $this -> albumIDs === 's' || $this -> albumIDs === 'f' ) return false ;
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " SELECT public FROM ? WHERE id = '?' LIMIT 1 " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$albums = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
if ( $albums === false ) return false ;
// Get album object
$album = $albums -> fetch_object ();
2014-04-05 13:59:31 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-05 13:59:31 +00:00
if ( $album -> public == 1 ) return true ;
return false ;
}
2014-08-17 18:22:46 +00:00
public function getDownloadable () {
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-08-17 18:22:46 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-08-17 18:22:46 +00:00
2014-08-29 17:27:09 +00:00
if ( $this -> albumIDs === '0' || $this -> albumIDs === 's' || $this -> albumIDs === 'f' || $this -> albumIDs === 'r' ) return false ;
2014-08-17 18:22:46 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " SELECT downloadable FROM ? WHERE id = '?' LIMIT 1 " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$albums = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
if ( $albums === false ) return false ;
// Get album object
$album = $albums -> fetch_object ();
2014-08-17 18:22:46 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-08-17 18:22:46 +00:00
if ( $album -> downloadable == 1 ) return true ;
return false ;
}
2015-02-28 22:42:13 +00:00
public function setPublic ( $public , $password , $visible , $downloadable ) {
2014-04-04 15:56:08 +00:00
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-04 15:56:08 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-04 15:56:08 +00:00
2016-01-30 20:43:57 +00:00
// Convert values
$public = ( $public === '1' ? 1 : 0 );
$visible = ( $visible === '1' ? 1 : 0 );
$downloadable = ( $downloadable === '1' ? 1 : 0 );
2014-07-21 20:16:30 +00:00
2016-01-30 20:43:57 +00:00
// Set public
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET public = '?', visible = '?', downloadable = '?', password = NULL WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $public , $visible , $downloadable , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
if ( $result === false ) return false ;
2014-08-09 15:57:31 +00:00
2016-01-30 20:43:57 +00:00
// Reset permissions for photos
2015-02-28 22:42:13 +00:00
if ( $public === 1 ) {
2016-01-31 17:49:31 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET public = 0 WHERE album IN (?) " , array ( LYCHEE_TABLE_PHOTOS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
if ( $result === false ) return false ;
2014-04-04 15:56:08 +00:00
}
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-04 15:56:08 +00:00
2016-01-30 20:43:57 +00:00
// Set password
2014-04-04 15:56:08 +00:00
if ( isset ( $password ) && strlen ( $password ) > 0 ) return $this -> setPassword ( $password );
return true ;
}
2014-07-21 20:38:56 +00:00
private function setPassword ( $password ) {
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-03 16:38:58 +00:00
2014-04-21 12:18:13 +00:00
if ( strlen ( $password ) > 0 ) {
2016-01-30 20:43:57 +00:00
// Get hashed password
2015-02-08 14:36:13 +00:00
$password = getHashedString ( $password );
2014-04-21 00:19:23 +00:00
2016-01-30 20:43:57 +00:00
// Set hashed password
// Do not prepare $password because it is hashed and save
// Preparing (escaping) the password would destroy the hash
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET password = ' $password ' WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2014-04-21 12:18:13 +00:00
2014-04-21 00:19:23 +00:00
} else {
2014-04-21 12:18:13 +00:00
2016-01-30 20:43:57 +00:00
// Unset password
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET password = NULL WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2014-04-21 12:18:13 +00:00
2014-04-21 00:19:23 +00:00
}
2014-04-03 16:38:58 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2015-02-08 14:36:13 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-03 16:38:58 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2014-04-03 16:38:58 +00:00
return true ;
}
2014-04-04 17:34:12 +00:00
public function checkPassword ( $password ) {
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " SELECT password FROM ? WHERE id = '?' LIMIT 1 " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$albums = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
if ( $albums === false ) return false ;
// Get album object
$album = $albums -> fetch_object ();
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-04 15:18:59 +00:00
2016-01-31 17:49:31 +00:00
// Check if password is correct
2014-04-04 17:34:12 +00:00
if ( $album -> password == '' ) return true ;
2016-01-31 17:49:31 +00:00
if ( $album -> password === crypt ( $password , $album -> password )) return true ;
2014-04-04 17:34:12 +00:00
return false ;
2014-04-04 15:18:59 +00:00
2014-04-04 17:34:12 +00:00
}
2014-04-04 15:18:59 +00:00
2015-05-05 20:06:54 +00:00
public function merge () {
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Convert to array
2015-05-05 20:06:54 +00:00
$albumIDs = explode ( ',' , $this -> albumIDs );
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Get first albumID
2015-05-09 08:16:49 +00:00
$albumID = array_splice ( $albumIDs , 0 , 1 );
$albumID = $albumID [ 0 ];
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), " UPDATE ? SET album = ? WHERE album IN (?) " , array ( LYCHEE_TABLE_PHOTOS , $albumID , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2014-04-05 13:59:31 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2014-04-04 17:34:12 +00:00
2016-01-30 20:43:57 +00:00
// $albumIDs contains all IDs without the first albumID
// Convert to string
2015-05-05 20:06:54 +00:00
$filteredIDs = implode ( ',' , $albumIDs );
2016-01-30 20:43:57 +00:00
$query = Database :: prepare ( Database :: get (), " DELETE FROM ? WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $filteredIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2014-04-04 15:18:59 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2014-04-04 15:56:08 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2014-04-04 15:18:59 +00:00
return true ;
}
2015-05-05 20:06:54 +00:00
public function delete () {
2015-05-05 10:18:27 +00:00
2016-01-30 20:43:57 +00:00
// Check dependencies
2016-01-30 20:33:31 +00:00
Validator :: required ( isset ( $this -> albumIDs ), __METHOD__ );
2015-05-05 10:18:27 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 0 , func_get_args ());
2015-05-05 10:18:27 +00:00
2016-01-30 20:43:57 +00:00
// Init vars
2016-01-31 17:49:31 +00:00
$photoIDs = array ();
2015-05-05 10:18:27 +00:00
2016-01-30 20:43:57 +00:00
// Execute query
$query = Database :: prepare ( Database :: get (), " SELECT id FROM ? WHERE album IN (?) " , array ( LYCHEE_TABLE_PHOTOS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$photos = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2015-05-05 10:18:27 +00:00
2016-01-31 17:49:31 +00:00
if ( $photos === false ) return false ;
2015-05-05 20:06:54 +00:00
2016-01-31 17:49:31 +00:00
// Only delete photos when albums contain photos
if ( $photos -> num_rows > 0 ) {
// Add each id to photoIDs
while ( $row = $photos -> fetch_object ()) $photoIDs [] = $row -> id ;
// Convert photoIDs to a string
$photoIDs = implode ( ',' , $photoIDs );
// Delete all photos
$photo = new Photo ( $photoIDs );
if ( $photo -> delete () !== true ) return false ;
2015-05-05 10:18:27 +00:00
}
2016-01-30 20:43:57 +00:00
// Delete albums
$query = Database :: prepare ( Database :: get (), " DELETE FROM ? WHERE id IN (?) " , array ( LYCHEE_TABLE_ALBUMS , $this -> albumIDs ));
2016-01-31 17:49:31 +00:00
$result = Database :: execute ( Database :: get (), $query , __METHOD__ , __LINE__ );
2015-05-05 10:18:27 +00:00
2016-01-30 20:43:57 +00:00
// Call plugins
2016-01-29 23:27:50 +00:00
Plugins :: get () -> activate ( __METHOD__ , 1 , func_get_args ());
2015-05-05 20:06:54 +00:00
2016-01-31 17:49:31 +00:00
if ( $result === false ) return false ;
2015-05-05 10:18:27 +00:00
return true ;
2015-05-05 20:06:54 +00:00
2015-05-05 10:18:27 +00:00
}
2014-04-28 08:17:26 +00:00
}
2016-01-31 14:53:44 +00:00
?>