2763fd6b633ac6514181223091e8d441c2850add
[rock.divinelegy.git] / Controllers / SimfileController.php
1 <?php
2
3 namespace Controllers;
4
5 use Controllers\IDivineController;
6 use Services\Http\IHttpResponse;
7 use Services\Uploads\IUploadManager;
8 use Services\IUserSession;
9 use Services\IZipParser;
10 use Services\ISMOMatcher;
11 use DataAccess\StepMania\ISimfileRepository;
12 use DataAccess\StepMania\IPackRepository;
13 use DataAccess\IFileRepository;
14 use Domain\Entities\StepMania\ISimfile;
15 use Domain\Entities\IFile;
16
17 class SimfileController implements IDivineController
18 {
19 private $_simfileRepository;
20 private $_packRepository;
21 private $_fileRepository;
22 private $_response;
23 private $_uploadManager;
24 private $_zipParser;
25 private $_smoMatcher;
26
27 public function __construct(
28 IHttpResponse $response,
29 IUploadManager $uploadManager,
30 ISimfileRepository $simfileRepository,
31 IPackRepository $packRepository,
32 IFileRepository $fileRepository,
33 IUserSession $userSession,
34 IZipParser $zipParser,
35 ISMOMatcher $smoMatcher
36 ) {
37 $this->_response = $response;
38 $this->_uploadManager = $uploadManager;
39 $this->_simfileRepository = $simfileRepository;
40 $this->_packRepository = $packRepository;
41 $this->_fileRepository = $fileRepository;
42 $this->_zipParser = $zipParser;
43 $this->_smoMatcher = $smoMatcher;
44 }
45
46 public function indexAction() {
47 ;
48 }
49
50 // list simfiles
51 public function listAction()
52 {
53 /* @var $simfile Domain\Entities\StepMania\ISimfile */
54 $simfiles = $this->_simfileRepository->findAll();
55 $packs = $this->_packRepository->findAll();
56 $simfileArray = array();
57 $packArray = array();
58
59 foreach($simfiles as $simfile)
60 {
61 $simfileArray[] = $this->simfileToArray($simfile);
62 }
63
64 foreach($packs as $pack)
65 {
66 $packSimfiles = array();
67 foreach($pack->getSimfiles() as $simfile)
68 {
69 $packSimfiles[] = $this->simfileToArray($simfile);
70 }
71
72 $packMirrors = array();
73
74 if($pack->getFile())
75 {
76 $packMirrors[] = array('source' => 'DivinElegy', 'uri' => 'files/pack/' . $pack->getFile()->getHash());
77 }
78
79 if($pack->getFile()->getMirrors())
80 {
81 foreach($pack->getFile()->getMirrors() as $mirror)
82 {
83 $packMirrors[] = array('source' => $mirror->getSource(), 'uri' => $mirror->getUri());
84 }
85 }
86
87 $packArray[] = array(
88 'title'=> $pack->getTitle(),
89 'contributors' => $pack->getContributors(),
90 'simfiles' => $packSimfiles,
91 'banner' => $pack->getBanner() ? 'files/banner/' . $pack->getBanner()->getHash() : 'files/banner/default',
92 'mirrors' => $packMirrors
93 );
94 }
95
96 $returnArray = array('simfiles' => $simfileArray, 'packs' => $packArray);
97
98 $this->_response->setHeader('Content-Type', 'application/json')
99 ->setBody(json_encode($returnArray))
100 ->sendResponse();
101 }
102
103 public function uploadAction()
104 {
105 //TODO: Put directory in config ?
106 $files = $this->_uploadManager->setFilesDirectory('../files')
107 ->setDestination('StepMania/')
108 ->process();
109
110 foreach($files as $file)
111 {
112 $zipParser = $this->_zipParser;
113 $zipParser->parse($file);
114
115 //save the actual zip in the db
116 $this->findAndAddSmoMirror($file);
117 $this->_fileRepository->save($file);
118
119 if($zipParser->isPack())
120 {
121 //XXX: Tricky! pack() uses packbuilder and so returns a new pack each time.
122 //I tried to be clever and call pack() multiple times thinking I was getting the same
123 //object. Should I cache it in zipparser?
124 $pack = $zipParser->pack();
125 $packBanner = $pack->getBanner() ? $this->_fileRepository->save($pack->getBanner()) : null;
126 $this->_packRepository->save($pack);
127 }
128
129 foreach($zipParser->simfiles() as $simfile)
130 {
131 $banner = $simfile->getBanner() ? $this->_fileRepository->save($simfile->getBanner()) : null;
132 $simfileZip = $simfile->getSimfile() ? $this->_fileRepository->save($simfile->getSimfile()) : null;
133
134 if(isset($pack)) $simfile->addToPack($pack);
135 $this->_simfileRepository->save($simfile);
136 }
137 }
138 }
139
140 private function findAndAddSmoMirror(IFile $file)
141 {
142 $basename = pathinfo($file->getFilename(), PATHINFO_FILENAME);
143 $match = $this->_smoMatcher->match($basename, $file->getSize());
144
145 //XXX: Direct instantiation of FileMirror bad?
146 if($match && $match['confidence'] > 90)
147 {
148 $file->addMirror(new \Domain\VOs\FileMirror($match['href'], 'Stepmania Online'));
149 }
150 }
151
152 private function simfileToArray(ISimfile $simfile)
153 {
154 $singleSteps = array();
155 $doubleSteps = array();
156
157 foreach($simfile->getSteps() as $steps)
158 {
159 $stepDetails = array(
160 'artist' => $steps->getArtist()->getTag(),
161 'difficulty' => $steps->getDifficulty()->getITGName(),
162 'rating' => $steps->getRating()
163 );
164
165 if($steps->getMode()->getPrettyName() == 'Single')
166 {
167 $singleSteps[] = $stepDetails;
168 } else {
169 $doubleSteps[] = $stepDetails;
170 }
171 }
172
173 return array(
174 'title' => $simfile->getTitle(),
175 'artist' => $simfile->getArtist()->getName(),
176 'steps' => array(
177 'single' => $singleSteps,
178 'double' => $doubleSteps
179 ),
180 'bgChanges' => $simfile->hasBgChanges() ? 'Yes' : 'No',
181 'fgChanges' => $simfile->hasFgChanges() ? 'Yes' : 'No',
182 'bpmChanges' => $simfile->hasBPMChanges() ? 'Yes' : 'No',
183 'banner' => $simfile->getBanner() ? 'files/banner/' . $simfile->getBanner()->getHash() : 'files/banner/default',
184 'download' => $simfile->getSimfile() ? 'files/simfile/' . $simfile->getSimfile()->getHash() : null
185 );
186 }
187 }