PageRenderTime 30ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/application/modules/admin/controllers/DiscographyController.php

https://bitbucket.org/kdeberna/akalepse
PHP | 363 lines | 320 code | 34 blank | 9 comment | 45 complexity | 33e1a1f465147b8dc324b9f7f3ec51cc MD5 | raw file
  1. <?php
  2. class Admin_DiscographyController extends Zend_Controller_Action {
  3. public function init() {
  4. $this->view->headLink()->appendStylesheet('/modules/admin/styles/formsDiscog.css');
  5. }
  6. public function indexAction() {
  7. $this->view->headLink()->appendStylesheet('/modules/admin/styles/discog.css');
  8. $this->view->headScript()->appendFile('/modules/admin/scripts/discogDelete.js');
  9. $discography = new Application_Model_DiscographyMapper();
  10. $this->view->entries = $discography->fetchAll();
  11. }
  12. public function deleteAction() {
  13. $request = $this->getRequest();
  14. $this->view->id = $this->_getParam('id');
  15. if($request->isXmlHttpRequest()){
  16. $this->_helper->layout()->disableLayout();
  17. }
  18. $discogMapper = new Application_Model_DiscographyMapper();
  19. $discog = new Application_Model_Discography();
  20. $discogMapper->find($request->getParam('id'), $discog);
  21. $this->view->title = stripslashes($discog->title);
  22. if($request->isPost()) {
  23. $discogMapper->delete($request->getParam('id'));
  24. $tracksMapper = new Application_Model_TracksMapper();
  25. $tracks = $tracksMapper->FetchByAlbum($request->getParam('id'));
  26. foreach($tracks as $track){
  27. $tracksMapper->delete($track->id);
  28. }
  29. // Open the album data folder and remove all the files
  30. $dir = new DirectoryIterator(APPLICATION_PATH . '/../html/releases/' . $discog->dir . '/');
  31. foreach($dir as $fileinfo) {
  32. if(!$fileinfo->isDot()) {
  33. unlink($fileinfo->getPathname());
  34. }
  35. }
  36. // Remove the album data folder
  37. rmdir(APPLICATION_PATH . '/../html/releases/' . $discog->dir . '/');
  38. $this->xml();
  39. header("location: /admin/discography/");
  40. }
  41. }
  42. public function addAction() {
  43. $this->view->headScript()->appendFile('/modules/admin/scripts/discogTracks.js');
  44. $request = $this->getRequest();
  45. $form = new Admin_Form_DiscographyForm();
  46. $form->setAction('/admin/discography/add/');
  47. $today = date('Y-m-d');
  48. $data['release_date'] = $today;
  49. $form->populate($data);
  50. $this->view->form = $form;
  51. if($request->isPost()) {
  52. $params = $request->getParams();
  53. //header("location: /admin/discography/add/");
  54. //echo '<pre>' . htmlentities(print_r($GLOBALS['_FILES'], true)) . '</pre>';
  55. $newFolder = str_replace(" ", "-", strtolower($params['title']));
  56. $release = $newFolder = preg_replace('/[^\w-]+/', "", $newFolder);
  57. $newFolder = APPLICATION_PATH . '/../html/releases/' . $newFolder . '/';
  58. if(isset($_FILES['album_cover']['name'])) {
  59. $albumCover = str_replace(" ", "-", strtolower($_FILES['album_cover']['name']));
  60. $albumCover = preg_replace('/[^\w-.]+/', "", $albumCover);
  61. $params['album_cover'] = $albumCover;
  62. } else {
  63. $params['album_cover'] = '';
  64. }
  65. if(isset($_FILES['album_interior']['name'])) {
  66. $albumInterior = str_replace(" ", "-", strtolower($_FILES['album_interior']['name']));
  67. $albumInterior = preg_replace('/[^\w-.]+/', "", $albumInterior);
  68. $params['album_interior'] = $albumInterior;
  69. } else {
  70. $params['album_interior'] = '';
  71. }
  72. if(isset($_FILES['album_back_cover']['name'])) {
  73. $backCover = str_replace(" ", "-", strtolower($_FILES['album_back_cover']['name']));
  74. $backCover = preg_replace('/[^\w-.]+/', "", $backCover);
  75. $params['album_back_cover'] = $backCover;
  76. } else {
  77. $params['album_back_cover'] = '';
  78. }
  79. $params['dir'] = $release;
  80. $dir = new DirectoryIterator(APPLICATION_PATH . '/../html/releases/tmp/');
  81. foreach($dir as $fileinfo) {
  82. if(pathinfo($fileinfo->getFilename(), PATHINFO_EXTENSION) == 'zip') {
  83. $adjustedZip = str_replace(" ", "-", strtolower($fileinfo->getFilename()));
  84. $adjustedZip = preg_replace('/[^\w-.]+/', "", $adjustedZip);
  85. $params['zipfile'] = $adjustedZip;
  86. }
  87. }
  88. $discogMapper = new Application_Model_DiscographyMapper();
  89. $discog = new Application_Model_Discography($params);
  90. $discogID = $discogMapper->save($discog);
  91. $tracksMapper = new Application_Model_TracksMapper();
  92. if(isset($params['track'])) {
  93. $numTracks = count($params['track']);
  94. } else {
  95. $numTracks = 0;
  96. }
  97. $i = 0;
  98. $xmlData = "<playlist>\n";
  99. while($i < $numTracks) {
  100. $data['disco_id'] = $discogID;
  101. $data['track_num'] = $i + 1;
  102. $data['title'] = $params['track'][$i];
  103. $data['artist'] = $params['artist'][$i];
  104. $replacedName = str_replace(" ", "-", strtolower($params['filename'][$i]));
  105. $replacedName = preg_replace('/[^\w-.]+/', "", $replacedName);
  106. $data['mp3'] = $replacedName;
  107. $track = new Application_Model_Tracks($data);
  108. $tracksMapper->save($track);
  109. $xmlData .= "\t<item>\n";
  110. $xmlData .= "\t\t<url>/releases/" . $release . "/" . $replacedName . "</url>\n";
  111. $xmlData .= "\t\t<title>" . stripslashes($params["track"][$i]) . "</title>\n";
  112. $xmlData .= "\t\t<artist>" . stripslashes($params["artist"][$i]) . "</artist>\n";
  113. $xmlData .= "\t\t<album>" . stripslashes($params["title"]) . "</album>\n";
  114. $xmlData .= "\t</item>\n";
  115. $i++;
  116. }
  117. $xmlData .= '</playlist>';
  118. mkdir($newFolder);
  119. foreach($dir as $fileinfo) {
  120. if(!$fileinfo->isDot()) {
  121. $filenameMod = str_replace(" ", "-", strtolower($fileinfo->getFilename()));
  122. $filenameMod = preg_replace('/[^\w-.]+/', "", $filenameMod);
  123. rename($fileinfo->getPathname(), $newFolder . $filenameMod);
  124. }
  125. }
  126. $my_file = 'playlist.xml';
  127. $handle = fopen($newFolder . $my_file, 'w') or die('Cannot open file: ' . $my_file);
  128. fwrite($handle, $xmlData);
  129. fclose($handle);
  130. $this->xml();
  131. header("location: /admin/discography/");
  132. }
  133. }
  134. public function xml() {
  135. // Move this out to a Helper something or other
  136. $this->_helper->layout()->disableLayout();
  137. $this->_helper->viewRenderer->setNoRender(true);
  138. $xmlData = "<albums>\n";
  139. $entries = new Application_Model_DiscographyMapper();
  140. $tracksMapper = new Application_Model_TracksMapper();
  141. $tracksEntry = new Application_Model_Tracks();
  142. $discography = $entries->fetchAll();
  143. foreach($discography as $album) {
  144. if($album->playable == "1") {
  145. $xmlData .= "\t<item>\n";
  146. $albumID = $album->id;
  147. $tracks = $tracksMapper->find($albumID, $tracksEntry);
  148. $count = count($tracks);
  149. $xmlData .= "\t\t<url>/releases/" . $album->dir . "/playlist.xml</url>\n";
  150. $xmlData .= "\t\t<title>" . stripslashes($album->title) . "</title>\n";
  151. $xmlData .= "\t\t<artist></artist>\n";
  152. $xmlData .= "\t\t<date>" . date("F d, Y", strtotime($album->release_date)) . "</date>\n";
  153. $xmlData .= "\t\t<trackInfo>" . $count . " tracks</trackInfo>\n";
  154. $xmlData .= "\t\t<extraInfo>" . stripslashes($album->shortdesc) . "</extraInfo>\n";
  155. $xmlData .= "\t\t<imageUrl>/releases/" . $album->dir . "/" . $album->album_cover . "</imageUrl>\n";
  156. if($album->downloadable == '1') {
  157. $xmlData .= "\t\t<downloadUrl>/releases/" . $album->dir . "/" . $album->zipfile . "</downloadUrl>\n";
  158. } else {
  159. $xmlData .= "\t\t<downloadUrl></downloadUrl>\n";
  160. }
  161. $xmlData .= "\t</item>\n";
  162. }
  163. }
  164. $xmlData .= '</albums>';
  165. // write out file
  166. $handle = fopen(APPLICATION_PATH . '/../html/xml/releases.xml', 'w') or die('Cannot open file.');
  167. fwrite($handle, $xmlData);
  168. fclose($handle);
  169. }
  170. public function editAction() {
  171. $this->view->headScript()->appendFile('/modules/admin/scripts/discogTracks.js');
  172. $this->view->headScript()->appendFile('/modules/admin/scripts/discogImages.js');
  173. $request = $this->getRequest();
  174. $this->view->id = $this->_getParam('id');
  175. $form = new Admin_Form_DiscographyForm();
  176. $form->setAction('/admin/discography/edit/');
  177. $mapper = new Application_Model_DiscographyMapper();
  178. $entry = new Application_Model_Discography();
  179. $mapper->find($request->getParam('id'), $entry);
  180. $this->view->title = stripslashes($entry->title);
  181. $form->addElement('hidden', 'id', array('value' => $request->getParam('id')));
  182. $form->addElement('hidden', 'album_cover_image', array('value' => $entry->album_cover));
  183. $form->addElement('hidden', 'album_interior_image', array('value' => $entry->album_interior));
  184. $form->addElement('hidden', 'album_back_cover_image', array('value' => $entry->album_back_cover));
  185. $data['release_date'] = date('Y-m-d', strtotime($entry->release_date));
  186. $data['shortdesc'] = stripslashes($entry->shortdesc);
  187. $data['title'] = stripslashes($entry->title);
  188. $data['description'] = stripslashes($entry->description);
  189. $data['shorttitle'] = stripslashes($entry->shorttitle);
  190. $data['downloadable'] = $entry->downloadable;
  191. $data['playable'] = $entry->playable;
  192. $data['album_cover'] = $entry->album_cover;
  193. $data['album_interior'] = $entry->album_interior;
  194. $data['album_back_cover'] = $entry->album_back_cover;
  195. $data['section'] = $entry->section;
  196. $data['dir'] = $entry->dir;
  197. $form->populate($data);
  198. $this->view->form = $form;
  199. if($request->isPost()) {
  200. $params = $request->getParams();
  201. // echo '<pre>' . htmlentities(print_r($params, true)) . '</pre>';
  202. if($_FILES['album_cover']['name'] != '') {
  203. $params['album_cover'] = $_FILES['album_cover']['name'];
  204. } else {
  205. $params['album_cover'] = $params['album_cover_image'];
  206. }
  207. if($_FILES['album_interior']['name'] != '') {
  208. $params['album_interior'] = $_FILES['album_interior']['name'];
  209. } else {
  210. $params['album_interior'] = $params['album_interior_image'];
  211. }
  212. if($_FILES['album_back_cover']['name'] != '') {
  213. $params['album_back_cover'] = $_FILES['album_back_cover']['name'];
  214. } else {
  215. $params['album_back_cover'] = $params['album_back_cover_image'];
  216. }
  217. $discog = new Application_Model_Discography($params);
  218. $mapper->save($discog);
  219. $tracksMapper = new Application_Model_TracksMapper();
  220. $tracks = $tracksMapper->FetchByAlbum($request->getParam('id'));
  221. foreach($tracks as $track){
  222. $tracksMapper->delete($track->id);
  223. }
  224. $numTracks = count($params['track']);
  225. $i = 0;
  226. $xmlData = "<playlist>\n";
  227. while($i < $numTracks) {
  228. $data['disco_id'] = $request->getParam('id');
  229. $data['track_num'] = $i + 1;
  230. $data['title'] = $params['track'][$i];
  231. $data['artist'] = $params['artist'][$i];
  232. $data['mp3'] = $params['filename'][$i];
  233. $track = new Application_Model_Tracks($data);
  234. $tracksMapper->save($track);
  235. $xmlData .= "\t<item>\n";
  236. if($params["filename"][$i] != '') {
  237. $xmlData .= "\t\t<url>/releases/" . $entry->dir . "/" . $params["filename"][$i] . "</url>\n";
  238. } else {
  239. $xmlData .= "\t\t<url></url>\n";
  240. }
  241. $xmlData .= "\t\t<title>" . stripslashes($params["track"][$i]) . "</title>\n";
  242. $xmlData .= "\t\t<artist>" . stripslashes($params["artist"][$i]) . "</artist>\n";
  243. $xmlData .= "\t\t<album>" . stripslashes($params["title"]) . "</album>\n";
  244. $xmlData .= "\t</item>\n";
  245. $i++;
  246. }
  247. $xmlData .= "</playlist>";
  248. $my_file = 'playlist.xml';
  249. $handle = fopen(APPLICATION_PATH . '/../html/releases/' . $entry->dir . '/' . $my_file, 'w') or die('Cannot open file: '.$my_file);
  250. fwrite($handle, $xmlData);
  251. fclose($handle);
  252. $this->xml();
  253. $dir = new DirectoryIterator(APPLICATION_PATH . '/../html/releases/tmp/');
  254. foreach($dir as $fileinfo) {
  255. if(!$fileinfo->isDot()) {
  256. rename($fileinfo->getPathname(), APPLICATION_PATH . '/../html/releases/' . $entry->dir . "/" . $fileinfo->getFilename());
  257. }
  258. }
  259. header("location: /admin/discography/");
  260. }
  261. }
  262. public function unzipAction() {
  263. $this->_helper->layout()->disableLayout();
  264. $this->_helper->viewRenderer->setNoRender(true);
  265. $request = $this->getRequest();
  266. $response = '';
  267. $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);
  268. if($fn) {
  269. // AJAX call
  270. file_put_contents(
  271. APPLICATION_PATH . '/../html/releases/tmp/' . $fn,
  272. file_get_contents('php://input')
  273. );
  274. }
  275. $tags = new GetID3_getid3();
  276. $zip = new ZipArchive();
  277. $format = $tags->analyze(APPLICATION_PATH . '/../html/releases/tmp/' . $fn);
  278. if($format['fileformat'] == 'mp3') {
  279. echo ':' . $fn; // Returns for a single file, the colon denotes single file with the filename following
  280. exit();
  281. }
  282. if($zip->open(APPLICATION_PATH . '/../html/releases/tmp/' . $fn)) {
  283. $title = '';
  284. for($i = 0; $i < $zip->numFiles; $i++) {
  285. if(substr($zip->getNameIndex($i), 0, 1) != '_') { // substr filters out __MACOSX folder which is auto-created
  286. $path_parts = pathinfo($zip->getNameIndex($i));
  287. $zip->extractTo(APPLICATION_PATH . '/../html/releases/tmp/', $zip->getNameIndex($i));
  288. rename(APPLICATION_PATH . '/../html/releases/tmp/' . $zip->getNameIndex($i), APPLICATION_PATH . '/../html/releases/tmp/' . $path_parts['basename']);
  289. if(is_dir(APPLICATION_PATH . '/../html/releases/tmp/' . $path_parts['basename'])) {
  290. $title = $path_parts['basename'];
  291. }
  292. $metadata = $tags->analyze(APPLICATION_PATH . '/../html/releases/tmp/' . $path_parts['basename']);
  293. if(isset($metadata['audio'])) {
  294. $response .= '<tr><td><input type="text" name="track[]" class="trackInput" value="' . $metadata['tags']['id3v2']['title']['0'] . '" /></td><td><input type="text" name="artist[]" class="artistInput" value="' . $metadata['tags']['id3v2']['artist']['0'] . '" /></td><td>' . $metadata['filename'] . '<input type="hidden" name="filename[]" value="' . $metadata['filename'] . '" /></td><td><a href="delete_track"><img src="/images/icons/delete.png" width="18" height="18" border="0" /></a></td></tr>';
  295. }
  296. }
  297. }
  298. rmdir(APPLICATION_PATH . '/../html/releases/tmp/' . $title);
  299. } else {
  300. $response = '<tr><td>Error reading archive!</td><td>k</td><td>d</td></tr>';
  301. }
  302. echo $response;
  303. }
  304. public function uploadAction() {
  305. $this->_helper->layout()->disableLayout();
  306. $this->_helper->viewRenderer->setNoRender(true);
  307. $fn = (isset($_SERVER['HTTP_X_FILENAME']) ? $_SERVER['HTTP_X_FILENAME'] : false);
  308. if($fn) {
  309. file_put_contents(
  310. APPLICATION_PATH . '/../html/releases/tmp/' . $fn,
  311. file_get_contents('php://input')
  312. );
  313. echo $fn;
  314. exit();
  315. }
  316. }
  317. public function tracksAction() {
  318. $data = '';
  319. $this->_helper->layout()->disableLayout();
  320. $this->_helper->viewRenderer->setNoRender(true);
  321. $tracksMapper = new Application_Model_TracksMapper();
  322. $tracks = $tracksMapper->FetchByAlbum($this->_getParam('id'));
  323. foreach($tracks as $track){
  324. $data .= '<tr id="track' . $track->track_num . '"><td><input type="text" name="track[]" class="trackInput" value="' . stripslashes($track->title) . '" /></td><td><input type="text" name="artist[]" class="artistInput" value="' . stripslashes($track->artist) . '" /></td><td>' . $track->mp3 . '<input type="hidden" name="filename[]" value="' . $track->mp3 . '" /></td><td><button>Upload MP3</button> <a href="delete_track"><img src="/images/icons/delete.png" width="18" height="18" border="0" /></a></td></tr>';
  325. }
  326. //echo '<pre>' . htmlentities(print_r($data, true)) . '</pre>';
  327. echo $data;
  328. }
  329. }