diff --git a/.htaccess b/.htaccess index 1812482675..34c8a23451 100644 --- a/.htaccess +++ b/.htaccess @@ -2,6 +2,7 @@ ErrorDocument 404 //owncloud/core/templates/404.php php_value upload_max_filesize 512M php_value post_max_size 512M + php_value memory_limit 128M SetEnv htaccessWorking true Options -Indexes diff --git a/apps/gallery/ajax/cover.php b/apps/gallery/ajax/cover.php new file mode 100644 index 0000000000..375905ec52 --- /dev/null +++ b/apps/gallery/ajax/cover.php @@ -0,0 +1,62 @@ + $ratio_orig) { + $new_height = $thumbnail_width/$ratio_orig; + $new_width = $thumbnail_width; + } else { + $new_width = $thumbnail_height*$ratio_orig; + $new_height = $thumbnail_height; + } + + $x_mid = $new_width/2; //horizontal middle + $y_mid = $new_height/2; //vertical middle + + $process = imagecreatetruecolor(round($new_width), round($new_height)); + + imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height); + imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); + + imagedestroy($process); + imagedestroy($myImage); + return $thumb; +} + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.'))); + exit(); +} +$box_size = 200; +$album_name = $_GET['album']; +$x = $_GET['x']; + +$stmt = OC_DB::prepare('SELECT file_path FROM *PREFIX*gallery_photos,*PREFIX*gallery_albums WHERE *PREFIX*gallery_albums.uid_owner = ? AND album_name = ? AND *PREFIX*gallery_photos.album_id == *PREFIX*gallery_albums.album_id'); +$result = $stmt->execute(array(OC_User::getUser(), $album_name)); +$x = min((int)($x/($box_size/$result->numRows())), $result->numRows()-1); // get image to display +$result->seek($x); // never throws +$path = $result->fetchRow(); +$path = $path['file_path']; +$tmp = OC::$CONFIG_DATADIRECTORY . $path; +$imagesize = getimagesize($tmp); + +header('Content-Type: image/png'); +$image = CroppedThumbnail($tmp, $box_size, $box_size); + +imagepng($image); +imagedestroy($image); +?> diff --git a/apps/gallery/ajax/createAlbum.php b/apps/gallery/ajax/createAlbum.php new file mode 100644 index 0000000000..3a490bdc3b --- /dev/null +++ b/apps/gallery/ajax/createAlbum.php @@ -0,0 +1,14 @@ + 'error', 'data' => array( 'message' => 'You need to log in.'))); + exit(); +} + +$stmt = OC_DB::prepare('INSERT INTO *PREFIX*gallery_albums ("uid_owner", "album_name") VALUES ("'.OC_User::getUser().'", "'.$_GET['album_name'].'")'); +$stmt->execute(array()); + +echo json_encode(array( 'status' => 'success', 'name' => $_GET['album_name'])); + +?> diff --git a/apps/gallery/ajax/getAlbums.php b/apps/gallery/ajax/getAlbums.php new file mode 100644 index 0000000000..6b551ac49d --- /dev/null +++ b/apps/gallery/ajax/getAlbums.php @@ -0,0 +1,22 @@ + 'error', 'message' => 'You need to log in')); + exit(); +} + +$a = array(); +$stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE uid_owner = ?'); +$result = $stmt->execute(array(OC_User::getUser())); + +while ($r = $result->fetchRow()) { + $album_name = $r['album_name']; + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE album_id = ?'); + $tmp_res = $stmt->execute(array($r['album_id'])); + $a[] = array('name' => $album_name, 'numOfItems' => min($tmp_res->numRows(), 10)); +} + +echo json_encode(array('status'=>'success', 'albums'=>$a)); + +?> diff --git a/apps/gallery/ajax/getCovers.php b/apps/gallery/ajax/getCovers.php new file mode 100644 index 0000000000..d56bf6fa4b --- /dev/null +++ b/apps/gallery/ajax/getCovers.php @@ -0,0 +1,66 @@ + $ratio_orig) { + $new_height = $thumbnail_width/$ratio_orig; + $new_width = $thumbnail_width; + } else { + $new_width = $thumbnail_height*$ratio_orig; + $new_height = $thumbnail_height; + } + + $x_mid = $new_width/2; //horizontal middle + $y_mid = $new_height/2; //vertical middle + + $process = imagecreatetruecolor(round($new_width), round($new_height)); + + imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + imagecopyresampled($tgtImg, $process, $shift, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); + + imagedestroy($process); + imagedestroy($myImage); +} + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.'))); + exit(); +} +$box_size = 200; +$album_name= $_GET['album_name']; + +$stmt = OC_DB::prepare('SELECT file_path FROM *PREFIX*gallery_photos,*PREFIX*gallery_albums WHERE *PREFIX*gallery_albums.uid_owner = ? AND album_name = ? AND *PREFIX*gallery_photos.album_id == *PREFIX*gallery_albums.album_id'); +$result = $stmt->execute(array(OC_User::getUser(), $album_name)); + +$numOfItems = min($result->numRows(),10); + +$targetImg = imagecreatetruecolor($numOfItems*$box_size, $box_size); +$counter = 0; +while (($i = $result->fetchRow()) && $counter < $numOfItems) { + $imagePath = OC::$CONFIG_DATADIRECTORY . $i['file_path']; + CroppedThumbnail($imagePath, $box_size, $box_size, $targetImg, $counter*$box_size); + $counter++; +} + +header('Content-Type: image/png'); + +imagepng($targetImg); +imagedestroy($targetImg); +?> diff --git a/apps/gallery/ajax/scanForAlbums.php b/apps/gallery/ajax/scanForAlbums.php new file mode 100644 index 0000000000..a04ad62b1b --- /dev/null +++ b/apps/gallery/ajax/scanForAlbums.php @@ -0,0 +1,14 @@ + 'error', 'message' => 'You need to log in')); + exit(); +} + +echo json_encode(array( 'status' => 'success', 'albums' => OC_GALLERY_SCANNER::scan(''))); +//echo json_encode(array('status' => 'success', 'albums' => array(array('name' => 'test', 'imagesCount' => 1, 'images' => array('dupa'))))); + +?> diff --git a/apps/gallery/ajax/thumbnail.php b/apps/gallery/ajax/thumbnail.php new file mode 100644 index 0000000000..db428eeff3 --- /dev/null +++ b/apps/gallery/ajax/thumbnail.php @@ -0,0 +1,58 @@ + $ratio_orig) { + $new_height = $thumbnail_width/$ratio_orig; + $new_width = $thumbnail_width; + } else { + $new_width = $thumbnail_height*$ratio_orig; + $new_height = $thumbnail_height; + } + + $x_mid = $new_width/2; //horizontal middle + $y_mid = $new_height/2; //vertical middle + + $process = imagecreatetruecolor(round($new_width), round($new_height)); + + imagecopyresampled($process, $myImage, 0, 0, 0, 0, $new_width, $new_height, $width_orig, $height_orig); + $thumb = imagecreatetruecolor($thumbnail_width, $thumbnail_height); + imagecopyresampled($thumb, $process, 0, 0, ($x_mid-($thumbnail_width/2)), ($y_mid-($thumbnail_height/2)), $thumbnail_width, $thumbnail_height, $thumbnail_width, $thumbnail_height); + + imagedestroy($process); + imagedestroy($myImage); + return $thumb; +} + +// Check if we are a user +if( !OC_User::isLoggedIn()){ + echo json_encode( array( 'status' => 'error', 'data' => array( 'message' => 'You need to log in.'))); + exit(); +} +$box_size = 200; +$img = $_GET['img']; + +$tmp = OC::$CONFIG_DATADIRECTORY . $img; + +header('Content-Type: image/png'); +$image = CroppedThumbnail($tmp, $box_size, $box_size); + +imagepng($image); +imagedestroy($image); +?> diff --git a/apps/gallery/appinfo/app.php b/apps/gallery/appinfo/app.php new file mode 100644 index 0000000000..2d5d2ce215 --- /dev/null +++ b/apps/gallery/appinfo/app.php @@ -0,0 +1,13 @@ + 20, + 'id' => 'gallery', + 'name' => 'Gallery')); + +OC_App::addNavigationEntry( array( + 'id' => 'gallery_index', + 'order' => 20, + 'href' => OC_Helper::linkTo('gallery', 'index.php'), + 'icon' => '', + 'name' => 'Gallery')); +?> diff --git a/apps/gallery/css/styles.css b/apps/gallery/css/styles.css new file mode 100644 index 0000000000..03b179138e --- /dev/null +++ b/apps/gallery/css/styles.css @@ -0,0 +1,23 @@ +div#gallery_list { + margin: 90pt 20pt; +} + +div#gallery_album_box { + width: 200px; + text-align: center; + border: 0; + float: left; + margin: 5pt; +} + +div#gallery_album_box h1 { + font-size: 12pt; + font-family: Arial; +} + +div#gallery_album_cover { + width: 199px; + height: 199px; + border: solid 1px black; +} + diff --git a/apps/gallery/index.php b/apps/gallery/index.php new file mode 100644 index 0000000000..c8d5892e55 --- /dev/null +++ b/apps/gallery/index.php @@ -0,0 +1,33 @@ +execute(array(OC_User::getUser())); + + $r = array(); + while ($row = $result->fetchRow()) + $r[] = $row; + + $tmpl = new OC_Template( 'gallery', 'index', 'user' ); + $tmpl->assign('r', $r); + $tmpl->printPage(); +} else { + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos, *PREFIX*gallery_albums WHERE uid_owner = ? AND album_name = ? AND *PREFIX*gallery_albums.album_id = *PREFIX*gallery_photos.album_id'); + + $result = $stmt->execute(array(OC_User::getUser(), $_GET['view'])); + + $photos = array(); + while ($p = $result->fetchRow()) + $photos[] = $p['file_path']; + + $tmpl = new OC_Template( 'gallery', 'view_album', 'user' ); + $tmpl->assign('photos', $photos); + $tmpl->assign('albumName', $_GET['view']); + $tmpl->printPage(); +} +?> diff --git a/apps/gallery/js/album_cover.js b/apps/gallery/js/album_cover.js new file mode 100644 index 0000000000..776feae32c --- /dev/null +++ b/apps/gallery/js/album_cover.js @@ -0,0 +1,41 @@ +var actual_cover; +$(document).ready(function() { + $.getJSON('ajax/getAlbums.php', function(r) { + if (r.status == 'success') { + for (var i in r.albums) { + var a = r.albums[i]; + Albums.add(a.name, a.numOfItems); + } + var targetDiv = document.getElementById('gallery_list'); + if (targetDiv) { + Albums.display(targetDiv); + } else { + alert('Error occured: no such layer `gallery_list`'); + } + } else { + alert('Error occured: ' + r.message); + } + }); +}); + +function createNewAlbum() { + var name = prompt("album name", ""); + if (name != null && name != "") { + $.getJSON("ajax/createAlbum.php", {album_name: name}, function(r) { + if (r.status == "success") { + var v = ''; + $('div#gallery_list').append(v); + } + }); + } +} + +function scanForAlbums() { + $.getJSON('ajax/scanForAlbums.php', function(r) { + if (r.status == 'success') { + window.location.reload(true); + } else { + alert('Error occured: ' + r.message); + } + }); +} diff --git a/apps/gallery/js/albums.js b/apps/gallery/js/albums.js new file mode 100644 index 0000000000..7ab243eded --- /dev/null +++ b/apps/gallery/js/albums.js @@ -0,0 +1,80 @@ +Albums={ + // album item in this array should look as follow + // {name: string, + // numOfCovers: int} + // + // previews array should be an array of base64 decoded images + // to display to user as preview picture when scrolling throught + // the album cover + albums:new Array(), + // add simply adds new album to internal structure + // however albums names must be unique so other + // album with the same name wont be insered, + // and false will be returned + // true on success + add: function(album_name, num) { + for (var a in Albums.albums) { + if (a.name == album_name) { + return false; + } + } + Albums.albums.push({name: album_name, numOfCovers: num}); + return true; + }, + // remove element with given name + // returns remove element or undefined if no such element was present + remove: function(name) { + var i = -1, tmp = 0; + for (var a in Albums.albums) { + if (a.name == name) { + i = tmp; + break; + } + tmp++; + } + if (i != -1) { + return Albums.albums.splice(i,1); + } + return undefined; + }, + // return element which match given name + // of undefined if such element do not exist + find: function(name) { + var i = -1, tmp = 0; + for (var k in Albums.albums) { + var a = Albums.albums[k]; + if (a.name == name) { + i = tmp; + break; + } + tmp++; + } + if (i != -1) { + return Albums.albums[i]; + } + return undefined; + }, + // displays gallery in linear representation + // on given element, and apply default styles for gallery + display: function(element) { + var displayTemplate = ''; + for (var i in Albums.albums) { + var a = Albums.albums[i]; + var local = $(displayTemplate.replace(/\*NAME\*/g, a.name)); + local.css('background-repeat', 'no-repeat'); + local.css('background-position', '0 0'); + local.css('background-image','url("ajax/getCovers.php?album_name='+a.name+'")'); + local.mousemove(function(e) { + var albumMetadata = Albums.find(this.title); + if (albumMetadata == undefined) { + return; + } + var x = Math.min(Math.floor((e.clientX - this.offsetLeft)/(this.offsetWidth/albumMetadata.numOfCovers)), albumMetadata.numOfCovers-1); + x *= this.offsetWidth; + $(this).css('background-position', -x+'px 0'); + }); + $(element).append(local); + } + } + +} diff --git a/apps/gallery/lib_scanner.php b/apps/gallery/lib_scanner.php new file mode 100644 index 0000000000..fe14b68add --- /dev/null +++ b/apps/gallery/lib_scanner.php @@ -0,0 +1,57 @@ + $path, 'imagesCount' => 0, 'images' => array()); + $current_album['name'] = str_replace('/', '.', str_replace(OC::$CONFIG_DATADIRECTORY, '', $current_album['name'])); + $current_album['name'] = ($current_album['name']==='')?'main':$current_album['name']; + + if ($dh = OC_Filesystem::opendir($path)) { + while (($filename = readdir($dh)) !== false) { + $filepath = $path.'/'.$filename; + if (substr($filename, 0, 1) == '.') continue; + if (OC_Filesystem::is_dir($filepath)) { + self::scanDir($filepath, $albums); + } elseif (self::isPhoto($path.'/'.$filename)) { + $current_album['images'][] = $filepath; + } + } + } + $current_album['imagesCount'] = count($current_album['images']); + $albums[] = $current_album; + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE "uid_owner" = ? AND "album_name" = ?'); + $result = $stmt->execute(array(OC_User::getUser(), $current_album['name'])); + if ($result->numRows() == 0 && count($current_album['images'])) { + $stmt = OC_DB::prepare('INSERT OR REPLACE INTO *PREFIX*gallery_albums ("uid_owner", "album_name") VALUES (?, ?)'); + $stmt->execute(array(OC_User::getUser(), $current_album['name'])); + } + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_albums WHERE "uid_owner" = ? AND "album_name" = ?'); + $result = $stmt->execute(array(OC_User::getUser(), $current_album['name'])); + $albumId = $result->fetchRow(); + $albumId = $albumId['album_id']; + foreach ($current_album['images'] as $img) { + $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*gallery_photos WHERE "album_id" = ? AND "file_path" = ?'); + $result = $stmt->execute(array($albumId, $img)); + if ($result->numRows() == 0) { + $stmt = OC_DB::prepare('INSERT OR REPLACE INTO *PREFIX*gallery_photos ("album_id", "file_path") VALUES (?, ?)'); + $stmt->execute(array($albumId, $img)); + } + } + } + + public static function isPhoto($filename) { + if (substr(OC_Filesystem::getMimeType($filename), 0, 6) == "image/") + return 1; + return 0; + } +} +?> diff --git a/apps/gallery/templates/index.php b/apps/gallery/templates/index.php new file mode 100644 index 0000000000..0e89e44876 --- /dev/null +++ b/apps/gallery/templates/index.php @@ -0,0 +1,12 @@ + + +
+ +
+
+ diff --git a/apps/gallery/templates/view_album.php b/apps/gallery/templates/view_album.php new file mode 100644 index 0000000000..ea2969e011 --- /dev/null +++ b/apps/gallery/templates/view_album.php @@ -0,0 +1,20 @@ + + +
+
+
+