File indexing completed on 2024-12-22 05:33:08

0001 <?php
0002 
0003 /**
0004  * ocs-fileserver
0005  *
0006  * Copyright 2016 by pling GmbH.
0007  *
0008  * This file is part of ocs-fileserver.
0009  *
0010  * ocs-fileserver is free software: you can redistribute it and/or modify
0011  * it under the terms of the GNU Affero General Public License as published by
0012  * the Free Software Foundation, either version 3 of the License, or
0013  * (at your option) any later version.
0014  *
0015  * ocs-fileserver is distributed in the hope that it will be useful,
0016  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  * GNU Affero General Public License for more details.
0019  *
0020  * You should have received a copy of the GNU Affero General Public License
0021  * along with Foobar.  If not, see <http://www.gnu.org/licenses/>.
0022  **/
0023 
0024 class table_media extends BaseModel
0025 {
0026 
0027     protected $_columns = '';
0028 
0029     protected $_join = '';
0030 
0031     public function __construct(&$db)
0032     {
0033         parent::__construct($db, $db->getTableConfig());
0034         $this->setName('media');
0035         $this->setPrimaryInsert(true);
0036 
0037         $prefix = $this->getPrefix();
0038 
0039         $this->_columns = "{$prefix}media.id AS id,"
0040             . "{$prefix}media.client_id AS client_id,"
0041             . "{$prefix}media.owner_id AS owner_id,"
0042             . "{$prefix}profiles.id AS profile_id,"
0043             . "{$prefix}profiles.name AS profile_name,"
0044             . "{$prefix}media.collection_id AS collection_id,"
0045             . "{$prefix}collections.title AS collection_title,"
0046             . "{$prefix}collections.category AS collection_category,"
0047             . "{$prefix}collections.tags AS collection_tags,"
0048             . "{$prefix}collections.version AS collection_version,"
0049             . "{$prefix}collections.content_id AS collection_content_id,"
0050             . "{$prefix}collections.content_page AS collection_content_page,"
0051             . "{$prefix}media.file_id AS file_id,"
0052             . "{$prefix}files.name AS file_name,"
0053             . "{$prefix}files.type AS file_type,"
0054             . "{$prefix}files.size AS file_size,"
0055             . "{$prefix}files.title AS file_title,"
0056             . "{$prefix}files.category AS file_category,"
0057             . "{$prefix}files.tags AS file_tags,"
0058             . "{$prefix}files.version AS file_version,"
0059             . "{$prefix}files.ocs_compatible AS file_ocs_compatible,"
0060             . "{$prefix}files.content_id AS file_content_id,"
0061             . "{$prefix}files.content_page AS file_content_page,"
0062             . "{$prefix}media.artist_id AS artist_id,"
0063             . "{$prefix}media_artists.name AS artist_name,"
0064             . "{$prefix}media.album_id AS album_id,"
0065             . "{$prefix}media_albums.name AS album_name,"
0066             . "{$prefix}media.title AS title,"
0067             . "{$prefix}media.genre AS genre,"
0068             . "{$prefix}media.track AS track,"
0069             . "{$prefix}media.creationdate AS creationdate,"
0070             . "{$prefix}media.bitrate AS bitrate,"
0071             . "{$prefix}media.playtime_seconds AS playtime_seconds,"
0072             . "{$prefix}media.playtime_string AS playtime_string,"
0073             . "{$prefix}media.played_timestamp AS played_timestamp,"
0074             . "{$prefix}media.played_count AS played_count,"
0075             . "{$prefix}media.played_count AS played_timeperiod_count";
0076 
0077         $this->_join = "LEFT OUTER JOIN {$prefix}profiles"
0078             . " ON {$prefix}profiles.client_id = {$prefix}media.client_id"
0079             . " AND {$prefix}profiles.owner_id = {$prefix}media.owner_id"
0080             . " LEFT OUTER JOIN {$prefix}collections"
0081             . " ON {$prefix}collections.id = {$prefix}media.collection_id"
0082             . " LEFT OUTER JOIN {$prefix}files"
0083             . " ON {$prefix}files.id = {$prefix}media.file_id"
0084             . " LEFT OUTER JOIN {$prefix}media_artists"
0085             . " ON {$prefix}media_artists.id = {$prefix}media.artist_id"
0086             . " LEFT OUTER JOIN {$prefix}media_albums"
0087             . " ON {$prefix}media_albums.id = {$prefix}media.album_id";
0088     }
0089 
0090     public function __set($key, $value)
0091     {
0092         $value = $this->_convertArrayToObject($value);
0093         unset($value->id);
0094         if (!isset($this->$key)) {
0095             $value->played_timestamp = $this->_getTimestamp();
0096             $value->played_ip = $this->_getIp();
0097             $value->played_count = 0;
0098         }
0099         parent::__set($key, $value);
0100     }
0101 
0102     public function getGenres($clientId = null, $ownerId = null, $collectionId = null, $collectionCategory = null, $collectionTags = null, $collectionContentId = null, $fileId = null, $fileTypes = null, $fileCategory = null, $fileTags = null, $fileOcsCompatibility = 'all', $fileContentId = null, $artistId = null, $albumId = null, $genre = null, $search = null, array $favoriteIds = null, $sort = 'name', $perpage = 20, $page = 1)
0103     {
0104         $prefix = $this->getPrefix();
0105         $columns = $this->getColumns();
0106 
0107         $_columns = "DISTINCT {$prefix}media.client_id AS client_id,"
0108             . "{$prefix}media.genre AS genre";
0109 
0110         $_join = "LEFT OUTER JOIN {$prefix}collections"
0111             . " ON {$prefix}collections.id = {$prefix}media.collection_id"
0112             . " LEFT OUTER JOIN {$prefix}files"
0113             . " ON {$prefix}files.id = {$prefix}media.file_id";
0114 
0115         $statementOption = '';
0116         $where = array();
0117         $values = array();
0118         $order = "{$prefix}media.genre ASC";
0119         $offset = 0;
0120 
0121         if ($clientId) {
0122             $where[] = "{$prefix}media.client_id = :client_id";
0123             $values[':client_id'] = $clientId;
0124         }
0125         if ($ownerId) {
0126             $where[] = "{$prefix}media.owner_id = :owner_id";
0127             $values[':owner_id'] = $ownerId;
0128         }
0129         if ($collectionId) {
0130             $where[] = "{$prefix}media.collection_id = :collection_id";
0131             $values[':collection_id'] = $collectionId;
0132         }
0133         if ($collectionCategory !== null && $collectionCategory !== '') {
0134             $where[] = "{$prefix}collections.category = :collection_category";
0135             $values[':collection_category'] = $collectionCategory;
0136         }
0137         if ($collectionTags !== null && $collectionTags !== '') {
0138             foreach (explode(',', $collectionTags) as $tag) {
0139                 $tag = trim($tag);
0140                 if ($tag) {
0141                     $where[] = "({$prefix}collections.tags = " . $this->getDb()->quote($tag)
0142                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("$tag,%")
0143                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0144                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0145                 }
0146             }
0147         }
0148         if ($collectionContentId !== null && $collectionContentId !== '') {
0149             $where[] = "{$prefix}collections.content_id = :collection_content_id";
0150             $values[':collection_content_id'] = $collectionContentId;
0151         }
0152         if ($fileId) {
0153             $where[] = "{$prefix}media.file_id = :file_id";
0154             $values[':file_id'] = $fileId;
0155         }
0156         if ($fileTypes) {
0157             $_fileTypes = array();
0158             foreach (explode(',', $fileTypes) as $fileType) {
0159                 $fileType = trim($fileType);
0160                 if ($fileType) {
0161                     $_fileTypes[] = $this->getDb()->quote($fileType);
0162                 }
0163             }
0164             if ($_fileTypes) {
0165                 $where[] = "{$prefix}files.type IN (" . implode(',', $_fileTypes) . ')';
0166             }
0167         }
0168         if ($fileCategory !== null && $fileCategory !== '') {
0169             $where[] = "{$prefix}files.category = :file_category";
0170             $values[':file_category'] = $fileCategory;
0171         }
0172         if ($fileTags !== null && $fileTags !== '') {
0173             foreach (explode(',', $fileTags) as $tag) {
0174                 $tag = trim($tag);
0175                 if ($tag) {
0176                     $where[] = "({$prefix}files.tags = " . $this->getDb()->quote($tag)
0177                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("$tag,%")
0178                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0179                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0180                 }
0181             }
0182         }
0183         if ($fileOcsCompatibility != 'all') {
0184             $fileOcsCompatible = null;
0185             if ($fileOcsCompatibility == 'compatible') {
0186                 $fileOcsCompatible = 1;
0187             }
0188             else if ($fileOcsCompatibility == 'incompatible') {
0189                 $fileOcsCompatible = 0;
0190             }
0191             if ($fileOcsCompatible !== null) {
0192                 $where[] = "{$prefix}files.ocs_compatible = :file_ocs_compatible";
0193                 $values[':file_ocs_compatible'] = $fileOcsCompatible;
0194             }
0195         }
0196         if ($fileContentId !== null && $fileContentId !== '') {
0197             $where[] = "{$prefix}files.content_id = :file_content_id";
0198             $values[':file_content_id'] = $fileContentId;
0199         }
0200         if ($artistId) {
0201             $where[] = "{$prefix}media.artist_id = :artist_id";
0202             $values[':artist_id'] = $artistId;
0203         }
0204         if ($albumId) {
0205             $where[] = "{$prefix}media.album_id = :album_id";
0206             $values[':album_id'] = $albumId;
0207         }
0208         if ($genre) {
0209             $where[] = "{$prefix}media.genre = :genre";
0210             $values[':genre'] = $genre;
0211         }
0212         if ($search) {
0213             $isSearchable = false;
0214             $_genre = array();
0215             foreach (explode(' ', $search) as $keyword) {
0216                 if ($keyword && strlen($keyword) > 2) {
0217                     $keyword = $this->getDb()->quote("%$keyword%");
0218                     $_genre[] = "{$prefix}media.genre LIKE $keyword";
0219                     $isSearchable = true;
0220                 }
0221             }
0222             if (!$isSearchable) {
0223                 return null;
0224             }
0225             $where[] = '(' . implode(' OR ', $_genre) . ')';
0226         }
0227         if (!empty($favoriteIds['ownerIds'])
0228             || !empty($favoriteIds['collectionIds'])
0229             || !empty($favoriteIds['fileIds'])
0230         ) {
0231             $where[] = $this->_convertFavoriteIdsToStatement(
0232                 $favoriteIds,
0233                 array(
0234                     'ownerId' => "{$prefix}media.owner_id",
0235                     'collectionId' => "{$prefix}media.collection_id",
0236                     'fileId' => "{$prefix}media.file_id"
0237                 )
0238             );
0239         }
0240 
0241         if ($where) {
0242             $statementOption = 'WHERE ' . implode(' AND ', $where)
0243                 . " AND {$prefix}media.genre IS NOT NULL";
0244         }
0245         else {
0246             $statementOption = "WHERE {$prefix}media.genre IS NOT NULL";
0247         }
0248 
0249         if ($sort == 'newest') {
0250             $order = "{$prefix}media.id DESC";
0251         }
0252 
0253         if ($page > 1) {
0254             $offset = ($page - 1) * $perpage;
0255         }
0256 
0257         $this->setColumns($_columns);
0258         $genres = $this->fetchRowset(
0259             $_join . ' ' . $statementOption
0260             . " ORDER BY $order LIMIT $perpage OFFSET $offset",
0261             $values
0262         );
0263         $this->setColumns($columns);
0264 
0265         if (!$genres) {
0266             return null;
0267         }
0268 
0269         $this->setColumns($_columns);
0270         $pagination = Flooer_Utility_Pagination::paginate(
0271             count((array) $this->fetchRowset($_join . ' ' . $statementOption, $values)),
0272             $perpage,
0273             $page
0274         );
0275         $this->setColumns($columns);
0276 
0277         return array(
0278             'genres' => $genres,
0279             'pagination' => $pagination
0280         );
0281     }
0282 
0283     public function getOwners($clientId = null, $ownerId = null, $collectionId = null, $collectionCategory = null, $collectionTags = null, $collectionContentId = null, $fileId = null, $fileTypes = null, $fileCategory = null, $fileTags = null, $fileOcsCompatibility = 'all', $fileContentId = null, $artistId = null, $albumId = null, $genre = null, $search = null, array $favoriteIds = null, $sort = 'name', $perpage = 20, $page = 1)
0284     {
0285         $prefix = $this->getPrefix();
0286         $columns = $this->getColumns();
0287 
0288         $_columns = "DISTINCT {$prefix}media.client_id AS client_id,"
0289             . "{$prefix}media.owner_id AS owner_id,"
0290             . "{$prefix}profiles.id AS profile_id,"
0291             . "{$prefix}profiles.name AS profile_name";
0292 
0293         $_join = "LEFT OUTER JOIN {$prefix}profiles"
0294             . " ON {$prefix}profiles.client_id = {$prefix}media.client_id"
0295             . " AND {$prefix}profiles.owner_id = {$prefix}media.owner_id"
0296             . " LEFT OUTER JOIN {$prefix}collections"
0297             . " ON {$prefix}collections.id = {$prefix}media.collection_id"
0298             . " LEFT OUTER JOIN {$prefix}files"
0299             . " ON {$prefix}files.id = {$prefix}media.file_id";
0300 
0301         $statementOption = '';
0302         $where = array();
0303         $values = array();
0304         $order = "{$prefix}profiles.name ASC";
0305         $offset = 0;
0306 
0307         if ($clientId) {
0308             $where[] = "{$prefix}media.client_id = :client_id";
0309             $values[':client_id'] = $clientId;
0310         }
0311         if ($ownerId) {
0312             $where[] = "{$prefix}media.owner_id = :owner_id";
0313             $values[':owner_id'] = $ownerId;
0314         }
0315         if ($collectionId) {
0316             $where[] = "{$prefix}media.collection_id = :collection_id";
0317             $values[':collection_id'] = $collectionId;
0318         }
0319         if ($collectionCategory !== null && $collectionCategory !== '') {
0320             $where[] = "{$prefix}collections.category = :collection_category";
0321             $values[':collection_category'] = $collectionCategory;
0322         }
0323         if ($collectionTags !== null && $collectionTags !== '') {
0324             foreach (explode(',', $collectionTags) as $tag) {
0325                 $tag = trim($tag);
0326                 if ($tag) {
0327                     $where[] = "({$prefix}collections.tags = " . $this->getDb()->quote($tag)
0328                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("$tag,%")
0329                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0330                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0331                 }
0332             }
0333         }
0334         if ($collectionContentId !== null && $collectionContentId !== '') {
0335             $where[] = "{$prefix}collections.content_id = :collection_content_id";
0336             $values[':collection_content_id'] = $collectionContentId;
0337         }
0338         if ($fileId) {
0339             $where[] = "{$prefix}media.file_id = :file_id";
0340             $values[':file_id'] = $fileId;
0341         }
0342         if ($fileTypes) {
0343             $_fileTypes = array();
0344             foreach (explode(',', $fileTypes) as $fileType) {
0345                 $fileType = trim($fileType);
0346                 if ($fileType) {
0347                     $_fileTypes[] = $this->getDb()->quote($fileType);
0348                 }
0349             }
0350             if ($_fileTypes) {
0351                 $where[] = "{$prefix}files.type IN (" . implode(',', $_fileTypes) . ')';
0352             }
0353         }
0354         if ($fileCategory !== null && $fileCategory !== '') {
0355             $where[] = "{$prefix}files.category = :file_category";
0356             $values[':file_category'] = $fileCategory;
0357         }
0358         if ($fileTags !== null && $fileTags !== '') {
0359             foreach (explode(',', $fileTags) as $tag) {
0360                 $tag = trim($tag);
0361                 if ($tag) {
0362                     $where[] = "({$prefix}files.tags = " . $this->getDb()->quote($tag)
0363                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("$tag,%")
0364                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0365                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0366                 }
0367             }
0368         }
0369         if ($fileOcsCompatibility != 'all') {
0370             $fileOcsCompatible = null;
0371             if ($fileOcsCompatibility == 'compatible') {
0372                 $fileOcsCompatible = 1;
0373             }
0374             else if ($fileOcsCompatibility == 'incompatible') {
0375                 $fileOcsCompatible = 0;
0376             }
0377             if ($fileOcsCompatible !== null) {
0378                 $where[] = "{$prefix}files.ocs_compatible = :file_ocs_compatible";
0379                 $values[':file_ocs_compatible'] = $fileOcsCompatible;
0380             }
0381         }
0382         if ($fileContentId !== null && $fileContentId !== '') {
0383             $where[] = "{$prefix}files.content_id = :file_content_id";
0384             $values[':file_content_id'] = $fileContentId;
0385         }
0386         if ($artistId) {
0387             $where[] = "{$prefix}media.artist_id = :artist_id";
0388             $values[':artist_id'] = $artistId;
0389         }
0390         if ($albumId) {
0391             $where[] = "{$prefix}media.album_id = :album_id";
0392             $values[':album_id'] = $albumId;
0393         }
0394         if ($genre) {
0395             $where[] = "{$prefix}media.genre = :genre";
0396             $values[':genre'] = $genre;
0397         }
0398         if ($search) {
0399             $isSearchable = false;
0400             $_profile = array();
0401             foreach (explode(' ', $search) as $keyword) {
0402                 if ($keyword && strlen($keyword) > 2) {
0403                     $keyword = $this->getDb()->quote("%$keyword%");
0404                     $_profile[] = "{$prefix}profiles.name LIKE $keyword";
0405                     $isSearchable = true;
0406                 }
0407             }
0408             if (!$isSearchable) {
0409                 return null;
0410             }
0411             $where[] = '(' . implode(' OR ', $_profile) . ')';
0412         }
0413         if (!empty($favoriteIds['ownerIds'])
0414             || !empty($favoriteIds['collectionIds'])
0415             || !empty($favoriteIds['fileIds'])
0416         ) {
0417             $where[] = $this->_convertFavoriteIdsToStatement(
0418                 $favoriteIds,
0419                 array(
0420                     'ownerId' => "{$prefix}media.owner_id",
0421                     'collectionId' => "{$prefix}media.collection_id",
0422                     'fileId' => "{$prefix}media.file_id"
0423                 )
0424             );
0425         }
0426 
0427         if ($where) {
0428             $statementOption = 'WHERE ' . implode(' AND ', $where);
0429         }
0430 
0431         if ($sort == 'newest') {
0432             $order = "{$prefix}media.owner_id DESC";
0433         }
0434 
0435         if ($page > 1) {
0436             $offset = ($page - 1) * $perpage;
0437         }
0438 
0439         $this->setColumns($_columns);
0440         $owners = $this->fetchRowset(
0441             $_join . ' ' . $statementOption
0442             . " ORDER BY $order LIMIT $perpage OFFSET $offset",
0443             $values
0444         );
0445         $this->setColumns($columns);
0446 
0447         if (!$owners) {
0448             return null;
0449         }
0450 
0451         $this->setColumns($_columns);
0452         $pagination = Flooer_Utility_Pagination::paginate(
0453             count((array) $this->fetchRowset($_join . ' ' . $statementOption, $values)),
0454             $perpage,
0455             $page
0456         );
0457         $this->setColumns($columns);
0458 
0459         return array(
0460             'owners' => $owners,
0461             'pagination' => $pagination
0462         );
0463     }
0464 
0465     public function getCollections($clientId = null, $ownerId = null, $collectionId = null, $collectionCategory = null, $collectionTags = null, $collectionContentId = null, $fileId = null, $fileTypes = null, $fileCategory = null, $fileTags = null, $fileOcsCompatibility = 'all', $fileContentId = null, $artistId = null, $albumId = null, $genre = null, $search = null, array $favoriteIds = null, $sort = 'name', $perpage = 20, $page = 1)
0466     {
0467         $prefix = $this->getPrefix();
0468         $columns = $this->getColumns();
0469 
0470         $_columns = "DISTINCT {$prefix}media.client_id AS client_id,"
0471             . "{$prefix}media.owner_id AS owner_id,"
0472             . "{$prefix}profiles.id AS profile_id,"
0473             . "{$prefix}profiles.name AS profile_name,"
0474             . "{$prefix}media.collection_id AS collection_id,"
0475             . "{$prefix}collections.title AS collection_title";
0476 
0477         $_join = "LEFT OUTER JOIN {$prefix}profiles"
0478             . " ON {$prefix}profiles.client_id = {$prefix}media.client_id"
0479             . " AND {$prefix}profiles.owner_id = {$prefix}media.owner_id"
0480             . " LEFT OUTER JOIN {$prefix}collections"
0481             . " ON {$prefix}collections.id = {$prefix}media.collection_id"
0482             . " LEFT OUTER JOIN {$prefix}files"
0483             . " ON {$prefix}files.id = {$prefix}media.file_id";
0484 
0485         $statementOption = '';
0486         $where = array();
0487         $values = array();
0488         $order = "{$prefix}collections.title ASC";
0489         $offset = 0;
0490 
0491         if ($clientId) {
0492             $where[] = "{$prefix}media.client_id = :client_id";
0493             $values[':client_id'] = $clientId;
0494         }
0495         if ($ownerId) {
0496             $where[] = "{$prefix}media.owner_id = :owner_id";
0497             $values[':owner_id'] = $ownerId;
0498         }
0499         if ($collectionId) {
0500             $where[] = "{$prefix}media.collection_id = :collection_id";
0501             $values[':collection_id'] = $collectionId;
0502         }
0503         if ($collectionCategory !== null && $collectionCategory !== '') {
0504             $where[] = "{$prefix}collections.category = :collection_category";
0505             $values[':collection_category'] = $collectionCategory;
0506         }
0507         if ($collectionTags !== null && $collectionTags !== '') {
0508             foreach (explode(',', $collectionTags) as $tag) {
0509                 $tag = trim($tag);
0510                 if ($tag) {
0511                     $where[] = "({$prefix}collections.tags = " . $this->getDb()->quote($tag)
0512                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("$tag,%")
0513                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0514                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0515                 }
0516             }
0517         }
0518         if ($collectionContentId !== null && $collectionContentId !== '') {
0519             $where[] = "{$prefix}collections.content_id = :collection_content_id";
0520             $values[':collection_content_id'] = $collectionContentId;
0521         }
0522         if ($fileId) {
0523             $where[] = "{$prefix}media.file_id = :file_id";
0524             $values[':file_id'] = $fileId;
0525         }
0526         if ($fileTypes) {
0527             $_fileTypes = array();
0528             foreach (explode(',', $fileTypes) as $fileType) {
0529                 $fileType = trim($fileType);
0530                 if ($fileType) {
0531                     $_fileTypes[] = $this->getDb()->quote($fileType);
0532                 }
0533             }
0534             if ($_fileTypes) {
0535                 $where[] = "{$prefix}files.type IN (" . implode(',', $_fileTypes) . ')';
0536             }
0537         }
0538         if ($fileCategory !== null && $fileCategory !== '') {
0539             $where[] = "{$prefix}files.category = :file_category";
0540             $values[':file_category'] = $fileCategory;
0541         }
0542         if ($fileTags !== null && $fileTags !== '') {
0543             foreach (explode(',', $fileTags) as $tag) {
0544                 $tag = trim($tag);
0545                 if ($tag) {
0546                     $where[] = "({$prefix}files.tags = " . $this->getDb()->quote($tag)
0547                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("$tag,%")
0548                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0549                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0550                 }
0551             }
0552         }
0553         if ($fileOcsCompatibility != 'all') {
0554             $fileOcsCompatible = null;
0555             if ($fileOcsCompatibility == 'compatible') {
0556                 $fileOcsCompatible = 1;
0557             }
0558             else if ($fileOcsCompatibility == 'incompatible') {
0559                 $fileOcsCompatible = 0;
0560             }
0561             if ($fileOcsCompatible !== null) {
0562                 $where[] = "{$prefix}files.ocs_compatible = :file_ocs_compatible";
0563                 $values[':file_ocs_compatible'] = $fileOcsCompatible;
0564             }
0565         }
0566         if ($fileContentId !== null && $fileContentId !== '') {
0567             $where[] = "{$prefix}files.content_id = :file_content_id";
0568             $values[':file_content_id'] = $fileContentId;
0569         }
0570         if ($artistId) {
0571             $where[] = "{$prefix}media.artist_id = :artist_id";
0572             $values[':artist_id'] = $artistId;
0573         }
0574         if ($albumId) {
0575             $where[] = "{$prefix}media.album_id = :album_id";
0576             $values[':album_id'] = $albumId;
0577         }
0578         if ($genre) {
0579             $where[] = "{$prefix}media.genre = :genre";
0580             $values[':genre'] = $genre;
0581         }
0582         if ($search) {
0583             $isSearchable = false;
0584             $_collection = array();
0585             foreach (explode(' ', $search) as $keyword) {
0586                 if ($keyword && strlen($keyword) > 2) {
0587                     $keyword = $this->getDb()->quote("%$keyword%");
0588                     $_collection[] = "{$prefix}collections.title LIKE $keyword";
0589                     $isSearchable = true;
0590                 }
0591             }
0592             if (!$isSearchable) {
0593                 return null;
0594             }
0595             $where[] = '(' . implode(' OR ', $_collection) . ')';
0596         }
0597         if (!empty($favoriteIds['ownerIds'])
0598             || !empty($favoriteIds['collectionIds'])
0599             || !empty($favoriteIds['fileIds'])
0600         ) {
0601             $where[] = $this->_convertFavoriteIdsToStatement(
0602                 $favoriteIds,
0603                 array(
0604                     'ownerId' => "{$prefix}media.owner_id",
0605                     'collectionId' => "{$prefix}media.collection_id",
0606                     'fileId' => "{$prefix}media.file_id"
0607                 )
0608             );
0609         }
0610 
0611         if ($where) {
0612             $statementOption = 'WHERE ' . implode(' AND ', $where);
0613         }
0614 
0615         if ($sort == 'newest') {
0616             $order = "{$prefix}media.collection_id DESC";
0617         }
0618 
0619         if ($page > 1) {
0620             $offset = ($page - 1) * $perpage;
0621         }
0622 
0623         $this->setColumns($_columns);
0624         $collections = $this->fetchRowset(
0625             $_join . ' ' . $statementOption
0626             . " ORDER BY $order LIMIT $perpage OFFSET $offset",
0627             $values
0628         );
0629         $this->setColumns($columns);
0630 
0631         if (!$collections) {
0632             return null;
0633         }
0634 
0635         $this->setColumns($_columns);
0636         $pagination = Flooer_Utility_Pagination::paginate(
0637             count((array) $this->fetchRowset($_join . ' ' . $statementOption, $values)),
0638             $perpage,
0639             $page
0640         );
0641         $this->setColumns($columns);
0642 
0643         return array(
0644             'collections' => $collections,
0645             'pagination' => $pagination
0646         );
0647     }
0648 
0649     public function getIndex($clientId = null, $ownerId = null, $collectionId = null, $collectionCategory = null, $collectionTags = null, $collectionContentId = null, $fileId = null, $fileTypes = null, $fileCategory = null, $fileTags = null, $fileOcsCompatibility = 'all', $fileContentId = null, $artistId = null, $albumId = null, $genre = null, $search = null, $ids = null, array $favoriteIds = null, $playedTimeperiodBegin = null, $playedTimeperiodEnd = null, $sort = 'name', $perpage = 20, $page = 1)
0650     {
0651         $prefix = $this->getPrefix();
0652         $name = $this->getName();
0653         $columns = $this->getColumns();
0654 
0655         $statementOption = '';
0656         $where = array();
0657         $values = array();
0658         $order = "{$prefix}media.title ASC";
0659         $offset = 0;
0660 
0661         if ($clientId) {
0662             $where[] = "{$prefix}media.client_id = :client_id";
0663             $values[':client_id'] = $clientId;
0664         }
0665         if ($ownerId) {
0666             $where[] = "{$prefix}media.owner_id = :owner_id";
0667             $values[':owner_id'] = $ownerId;
0668         }
0669         if ($collectionId) {
0670             $where[] = "{$prefix}media.collection_id = :collection_id";
0671             $values[':collection_id'] = $collectionId;
0672         }
0673         if ($collectionCategory !== null && $collectionCategory !== '') {
0674             $where[] = "{$prefix}collections.category = :collection_category";
0675             $values[':collection_category'] = $collectionCategory;
0676         }
0677         if ($collectionTags !== null && $collectionTags !== '') {
0678             foreach (explode(',', $collectionTags) as $tag) {
0679                 $tag = trim($tag);
0680                 if ($tag) {
0681                     $where[] = "({$prefix}collections.tags = " . $this->getDb()->quote($tag)
0682                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("$tag,%")
0683                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0684                         . " OR {$prefix}collections.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0685                 }
0686             }
0687         }
0688         if ($collectionContentId !== null && $collectionContentId !== '') {
0689             $where[] = "{$prefix}collections.content_id = :collection_content_id";
0690             $values[':collection_content_id'] = $collectionContentId;
0691         }
0692         if ($fileId) {
0693             $where[] = "{$prefix}media.file_id = :file_id";
0694             $values[':file_id'] = $fileId;
0695         }
0696         if ($fileTypes) {
0697             $_fileTypes = array();
0698             foreach (explode(',', $fileTypes) as $fileType) {
0699                 $fileType = trim($fileType);
0700                 if ($fileType) {
0701                     $_fileTypes[] = $this->getDb()->quote($fileType);
0702                 }
0703             }
0704             if ($_fileTypes) {
0705                 $where[] = "{$prefix}files.type IN (" . implode(',', $_fileTypes) . ')';
0706             }
0707         }
0708         if ($fileCategory !== null && $fileCategory !== '') {
0709             $where[] = "{$prefix}files.category = :file_category";
0710             $values[':file_category'] = $fileCategory;
0711         }
0712         if ($fileTags !== null && $fileTags !== '') {
0713             foreach (explode(',', $fileTags) as $tag) {
0714                 $tag = trim($tag);
0715                 if ($tag) {
0716                     $where[] = "({$prefix}files.tags = " . $this->getDb()->quote($tag)
0717                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("$tag,%")
0718                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag,%")
0719                         . " OR {$prefix}files.tags LIKE " . $this->getDb()->quote("%,$tag") . ')';
0720                 }
0721             }
0722         }
0723         if ($fileOcsCompatibility != 'all') {
0724             $fileOcsCompatible = null;
0725             if ($fileOcsCompatibility == 'compatible') {
0726                 $fileOcsCompatible = 1;
0727             }
0728             else if ($fileOcsCompatibility == 'incompatible') {
0729                 $fileOcsCompatible = 0;
0730             }
0731             if ($fileOcsCompatible !== null) {
0732                 $where[] = "{$prefix}files.ocs_compatible = :file_ocs_compatible";
0733                 $values[':file_ocs_compatible'] = $fileOcsCompatible;
0734             }
0735         }
0736         if ($fileContentId !== null && $fileContentId !== '') {
0737             $where[] = "{$prefix}files.content_id = :file_content_id";
0738             $values[':file_content_id'] = $fileContentId;
0739         }
0740         if ($artistId) {
0741             $where[] = "{$prefix}media.artist_id = :artist_id";
0742             $values[':artist_id'] = $artistId;
0743         }
0744         if ($albumId) {
0745             $where[] = "{$prefix}media.album_id = :album_id";
0746             $values[':album_id'] = $albumId;
0747         }
0748         if ($genre) {
0749             $where[] = "{$prefix}media.genre = :genre";
0750             $values[':genre'] = $genre;
0751         }
0752         if ($search) {
0753             $isSearchable = false;
0754             foreach (explode(' ', $search) as $keyword) {
0755                 if ($keyword && strlen($keyword) > 2) {
0756                     $keyword = $this->getDb()->quote("%$keyword%");
0757                     $where[] = "({$prefix}profiles.name LIKE $keyword"
0758                         . " OR {$prefix}collections.title LIKE $keyword"
0759                         . " OR {$prefix}files.name LIKE $keyword"
0760                         . " OR {$prefix}files.title LIKE $keyword"
0761                         . " OR {$prefix}media_artists.name LIKE $keyword"
0762                         . " OR {$prefix}media_albums.name LIKE $keyword"
0763                         . " OR {$prefix}media.title LIKE $keyword)";
0764                     $isSearchable = true;
0765                 }
0766             }
0767             if (!$isSearchable) {
0768                 return null;
0769             }
0770         }
0771         if ($ids) {
0772             $_ids = array();
0773             foreach (explode(',', $ids) as $id) {
0774                 $id = trim($id);
0775                 if ($id) {
0776                     $_ids[] = $this->getDb()->quote($id);
0777                 }
0778             }
0779             if ($_ids) {
0780                 $where[] = "{$prefix}media.id IN (" . implode(',', $_ids) . ')';
0781             }
0782         }
0783         if (!empty($favoriteIds['ownerIds'])
0784             || !empty($favoriteIds['collectionIds'])
0785             || !empty($favoriteIds['fileIds'])
0786         ) {
0787             $where[] = $this->_convertFavoriteIdsToStatement(
0788                 $favoriteIds,
0789                 array(
0790                     'ownerId' => "{$prefix}media.owner_id",
0791                     'collectionId' => "{$prefix}media.collection_id",
0792                     'fileId' => "{$prefix}media.file_id"
0793                 )
0794             );
0795         }
0796 
0797         if ($where) {
0798             $statementOption = 'WHERE ' . implode(' AND ', $where);
0799         }
0800 
0801         if ($sort == 'newest') {
0802             $order = "{$prefix}media.id DESC";
0803         }
0804         else if ($sort == 'track') {
0805             $order = "{$prefix}media.track ASC";
0806         }
0807         else if ($sort == 'recent') {
0808             $order = "{$prefix}media.played_timestamp DESC";
0809         }
0810         else if ($sort == 'frequent') {
0811             $order = "{$prefix}media.played_count DESC";
0812         }
0813 
0814         if ($page > 1) {
0815             $offset = ($page - 1) * $perpage;
0816         }
0817 
0818         $index = null;
0819         $pagination = null;
0820 
0821         if ($playedTimeperiodBegin || $playedTimeperiodEnd) {
0822             $_playedTimeperiodBegin = $this->_getTimestamp(0);
0823             if ($playedTimeperiodBegin) {
0824                 $_playedTimeperiodBegin = $playedTimeperiodBegin;
0825             }
0826             $_playedTimeperiodBegin = $this->getDb()->quote($_playedTimeperiodBegin);
0827 
0828             $_playedTimeperiodEnd = $this->_getTimestamp();
0829             if ($playedTimeperiodEnd) {
0830                 $_playedTimeperiodEnd = $playedTimeperiodEnd;
0831             }
0832             $_playedTimeperiodEnd = $this->getDb()->quote($_playedTimeperiodEnd);
0833 
0834             $_from = '('
0835                 . " SELECT {$prefix}media_played.media_id AS media_id,"
0836                 . " COUNT({$prefix}media_played.media_id) AS count"
0837                 . " FROM {$prefix}media_played"
0838                 . " WHERE {$prefix}media_played.played_timestamp"
0839                 . " BETWEEN {$_playedTimeperiodBegin} AND {$_playedTimeperiodEnd}"
0840                 . " GROUP BY {$prefix}media_played.media_id"
0841                 . ') AS played_timeperiod';
0842 
0843             $_join = "LEFT OUTER JOIN {$prefix}media"
0844                 . " ON {$prefix}media.id = played_timeperiod.media_id"
0845                 . ' ' . $this->_join;
0846 
0847             $_columns = str_replace(
0848                 "{$prefix}media.played_count AS played_timeperiod_count",
0849                 'played_timeperiod.count AS played_timeperiod_count',
0850                 $this->_columns
0851             );
0852 
0853             if ($sort == 'frequent') {
0854                 $order = 'played_timeperiod.count DESC';
0855             }
0856 
0857             $this->setPrefix('');
0858             $this->setName($_from);
0859             $this->setColumns($_columns);
0860 
0861             $index = $this->fetchRowset(
0862                 $_join . ' ' . $statementOption
0863                 . " ORDER BY $order LIMIT $perpage OFFSET $offset",
0864                 $values
0865             );
0866 
0867             $this->setPrefix($prefix);
0868             $this->setName($name);
0869             $this->setColumns($columns);
0870 
0871             if (!$index) {
0872                 return null;
0873             }
0874 
0875             $this->setPrefix('');
0876             $this->setName($_from);
0877             $this->setColumns($_columns);
0878 
0879             $pagination = Flooer_Utility_Pagination::paginate(
0880                 $this->count($_join . ' ' . $statementOption, $values),
0881                 $perpage,
0882                 $page
0883             );
0884 
0885             $this->setPrefix($prefix);
0886             $this->setName($name);
0887             $this->setColumns($columns);
0888         }
0889         else {
0890             $this->setColumns($this->_columns);
0891             $index = $this->fetchRowset(
0892                 $this->_join . ' ' . $statementOption
0893                 . " ORDER BY $order LIMIT $perpage OFFSET $offset",
0894                 $values
0895             );
0896             $this->setColumns($columns);
0897 
0898             if (!$index) {
0899                 return null;
0900             }
0901 
0902             $this->setColumns($this->_columns);
0903             $pagination = Flooer_Utility_Pagination::paginate(
0904                 $this->count($this->_join . ' ' . $statementOption, $values),
0905                 $perpage,
0906                 $page
0907             );
0908             $this->setColumns($columns);
0909         }
0910 
0911         return array(
0912             'index' => $index,
0913             'pagination' => $pagination
0914         );
0915     }
0916 
0917     public function getMedia($id)
0918     {
0919         $prefix = $this->getPrefix();
0920         $columns = $this->getColumns();
0921 
0922         $this->setColumns($this->_columns);
0923         $media = $this->fetchRow(
0924             $this->_join
0925             . " WHERE {$prefix}media.id = :id"
0926             . ' LIMIT 1',
0927             array(':id' => $id)
0928         );
0929         $this->setColumns($columns);
0930 
0931         if ($media) {
0932             return $media;
0933         }
0934         return null;
0935     }
0936 
0937     public function getAlbumId($clientId, $artistName, $albumName)
0938     {
0939         $prefix = $this->getPrefix();
0940         $columns = $this->getColumns();
0941 
0942         $_columns = "{$prefix}media.album_id AS album_id";
0943 
0944         $_join = "LEFT OUTER JOIN {$prefix}media_artists"
0945             . " ON {$prefix}media_artists.id = {$prefix}media.artist_id"
0946             . " LEFT OUTER JOIN {$prefix}media_albums"
0947             . " ON {$prefix}media_albums.id = {$prefix}media.album_id";
0948 
0949         $this->setColumns($_columns);
0950         $result = $this->fetchRow(
0951             $_join
0952             . " WHERE {$prefix}media.client_id = :client_id"
0953             . " AND {$prefix}media_artists.name = :artist_name"
0954             . " AND {$prefix}media_albums.name = :album_name"
0955             . " LIMIT 1",
0956             array(
0957                 ':client_id' => $clientId,
0958                 ':artist_name' => $artistName,
0959                 ':album_name' => $albumName
0960             )
0961         );
0962         $this->setColumns($columns);
0963 
0964         if ($result) {
0965             return $result->album_id;
0966         }
0967         return null;
0968     }
0969 
0970     public function updatePlayedStatus($id)
0971     {
0972         if (isset($this->$id)) {
0973             parent::__set($id, array(
0974                 'played_timestamp' => $this->_getTimestamp(),
0975                 'played_ip' => $this->_getIp(),
0976                 'played_count' => $this->$id->played_count + 1
0977             ));
0978         }
0979     }
0980 
0981     public function deleteByCollectionId($collectionId)
0982     {
0983         $primary = $this->getPrimary();
0984         $this->setPrimary('collection_id');
0985         unset($this->$collectionId);
0986         $this->setPrimary($primary);
0987     }
0988 
0989     public function deleteByFileId($fileId)
0990     {
0991         $primary = $this->getPrimary();
0992         $this->setPrimary('file_id');
0993         unset($this->$fileId);
0994         $this->setPrimary($primary);
0995     }
0996 
0997 }