1 package org.musicontroller.gui.importer;
2
3 import java.util.Collection;
4 import java.util.Date;
5 import java.util.HashSet;
6 import java.util.List;
7 import java.util.Set;
8
9 import org.apache.hivemind.util.PropertyUtils;
10 import org.apache.tapestry.IExternalPage;
11 import org.apache.tapestry.IPage;
12 import org.apache.tapestry.IRequestCycle;
13 import org.apache.tapestry.annotations.EventListener;
14 import org.apache.tapestry.annotations.InjectObject;
15 import org.apache.tapestry.engine.ExternalServiceParameter;
16 import org.apache.tapestry.engine.IEngineService;
17 import org.apache.tapestry.engine.ILink;
18 import org.apache.tapestry.event.BrowserEvent;
19 import org.apache.tapestry.event.PageBeginRenderListener;
20 import org.apache.tapestry.event.PageEvent;
21 import org.apache.tapestry.html.BasePage;
22 import org.apache.tapestry.services.ServiceMap;
23 import org.musicontroller.core.Playlist;
24 import org.musicontroller.importer.Importer;
25 import org.musicontroller.importer.ImporterException;
26 import org.musicontroller.importer.MusicArchiveBean;
27 import org.musicontroller.importer.MusicArchiveEntryBean;
28 import org.musicontroller.importer.PlaylistImportProperties;
29 import org.musicontroller.service.McService;
30 import org.varienaja.util.coverart.CoverArtSearchResult;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 public abstract class MusicArchive extends BasePage implements IExternalPage, PageBeginRenderListener {
66
67 @InjectObject("engine-service:page") public abstract IEngineService getPageService();
68 @InjectObject("engine-service:external") public abstract IEngineService getExternalService();
69
70 public abstract ServiceMap getServiceMap();
71
72 public abstract McService getMcService();
73
74
75
76
77
78 public abstract MusicArchiveBean getArchive();
79
80
81
82
83
84 public abstract void setFeedback(String message);
85
86
87
88
89
90
91 public abstract Importer getImporter();
92
93
94
95
96
97 public abstract PlaylistImportProperties getPlaylistEntry();
98
99
100
101
102
103
104
105
106 public void activateExternalPage(Object[] args, IRequestCycle cycle) {
107 CoverArtSearchResult cover = null;
108 if(args.length>1 && args[1]!=null) {
109 cover = (CoverArtSearchResult) args[1];
110 String playlistName = (String) args[2];
111 PlaylistImportProperties props = getArchive().getPlaylistProperties(playlistName);
112 if(props!=null) {
113 props.setCoverArt(cover.getURI().toString());
114 }
115 }
116 }
117
118
119
120
121
122 public void pageBeginRender(PageEvent event) {
123 for(String playlistName : getArchive().getPlaylistNames()) {
124 PlaylistImportProperties props = getArchive().getPlaylistProperties(playlistName);
125 long MillisInHour = 1000L * 3600;
126 if(!props.isCoverArtSearchDone() &&
127 (props.getTimeOfLastCoverArtSearch()==null || new Date().getTime() - props.getTimeOfLastCoverArtSearch().getTime()>MillisInHour) ) {
128 String url = guessUrl(playlistName);
129 if(url!=null && url.length()>0) {
130 props.setCoverArt(url);
131 props.setCoverArtSearchDone(true);
132 }
133 props.setTimeOfLastCoverArtSearch(new Date());
134 }
135 }
136 }
137
138
139
140
141
142
143 private String guessUrl(String playlistName) {
144
145 Set<Playlist> candidates = getMcService().guessPlaylistsInArchive(getArchive());
146 if(candidates.size()>0) {
147 Playlist takeThis = candidates.iterator().next();
148 ILink link = getServiceMap().getService("coverart").getLink(false,new Object[]{takeThis.getId(),200});
149 return "http:"+link.getURL();
150 }
151
152 String guessedBandName = getMcService().guessBandNameOfArchive(getArchive());
153 String guessedPlaylistName = playlistName;
154 if(guessedPlaylistName==null) {
155 Set<String> playlistNames = new HashSet<String>();
156 for(MusicArchiveEntryBean entry: getArchive().getEntrySet()) {
157 if(entry.getPlaylistName()!=null && entry.getPlaylistName().trim().length()>0) {
158 playlistNames.add(entry.getPlaylistName());
159 break;
160 }
161 }
162 if(playlistNames.size()>0) {
163 guessedPlaylistName = playlistNames.iterator().next();
164 }
165 }
166 Collection<CoverArtSearchResult> coverArtList = getMcService().getCoverArtList(guessedBandName, guessedPlaylistName);
167 if(coverArtList.size()>0) {
168 return coverArtList.iterator().next().getURI().toString();
169 }
170
171 return "";
172 }
173
174
175
176
177
178
179
180
181
182
183 public ILink editCoverArt(IRequestCycle cycle) {
184 IEngineService service = getExternalService();
185
186 String bandName = getMcService().guessBandNameOfArchive(getArchive());
187 String playlistName = null;
188
189 List<Playlist> candidates = getMcService().findImportedPlaylist(getArchive());
190 if(candidates.size()>0) {
191 Playlist candidate = candidates.iterator().next();
192 playlistName = candidate.getName();
193 }
194 MusicArchiveBean bean = getArchive();
195 for (MusicArchiveEntryBean entry : bean.getEntrySet()) {
196 if(playlistName==null&&(entry.getPlaylistName()!=null && entry.getPlaylistName().length()>0)) {
197 playlistName = entry.getPlaylistName();
198 }
199 }
200 if(bandName!=null && playlistName!=null) {
201 ExternalServiceParameter parameter = new ExternalServiceParameter("CoverArtEdit", new Object[]{null,"MusicArchive",bandName,playlistName});
202 ILink link = service.getLink(false, parameter);
203 return link;
204 } else {
205 IPage page = cycle.getPage("MusicArchive");
206 PropertyUtils.write(page,"archive",bean);
207 PropertyUtils.write(page,"feedback","Please set band name and playlist name before selecting cover art.");
208 ILink pageLink = getPageService().getLink(false, page);
209 return pageLink;
210 }
211 }
212
213
214
215
216
217 public boolean isExistingPlaylist() {
218 PlaylistImportProperties entry = getPlaylistEntry();
219 List<Playlist> hits = getMcService().searchPlaylistByName(entry.getPlaylistName());
220 return hits.size()>0;
221 }
222
223
224
225
226
227
228
229
230 public void importArchive(IRequestCycle cycle, MusicArchiveBean bean) {
231 try {
232 getImporter().importMusic(bean);
233
234
235
236
237 IPage page = cycle.getPage("ImportProgress");
238 PropertyUtils.write(page,"feedback","Archive "+bean.getArchiveName()+" imported without errors.");
239 cycle.activate(page);
240 } catch (ImporterException e) {
241 IPage page = cycle.getPage("MusicArchive");
242 PropertyUtils.write(page,"archive",bean);
243 PropertyUtils.write(page,"feedback","Error while importing: "+e.getLocalizedMessage());
244 cycle.activate(page);
245 }
246 }
247
248
249
250
251
252
253
254
255
256 public void fillSongIndex(IRequestCycle cycle, MusicArchiveBean bean) {
257 int index = 1;
258 for (MusicArchiveEntryBean entry : bean.getEntrySet()) {
259 if (entry.getSongIndex()<1) {
260 entry.setSongIndex(index);
261 index = index + 1;
262 } else {
263 index = entry.getSongIndex() + 1;
264 }
265 }
266 }
267
268
269
270
271
272
273
274
275
276
277 public void fillPlaylistName(IRequestCycle cycle, MusicArchiveBean bean) {
278 String fillValue = null;
279 for (MusicArchiveEntryBean entry : bean.getEntrySet()) {
280 if (fillValue==null) {
281
282 fillValue = entry.getPlaylistName()==null ? null : entry.getPlaylistName().trim();
283 } else {
284 entry.setPlaylistName(fillValue);
285 }
286 }
287 getArchive().analyseMusicArchive();
288 cycle.getResponseBuilder().updateComponent("archiveForm");
289 }
290
291
292
293
294
295
296
297
298 public void fillBandName(IRequestCycle cycle, MusicArchiveBean bean) {
299 String fillValue = null;
300 for (MusicArchiveEntryBean entry : bean.getEntrySet()) {
301 if (fillValue==null) {
302
303 fillValue = entry.getBandName()==null ? null : entry.getBandName().trim();
304 } else {
305 entry.setBandName(fillValue);
306 }
307 }
308 }
309
310
311
312
313
314
315
316
317 public void fillKeywords(IRequestCycle cycle, MusicArchiveBean bean) {
318 String fillValue = null;
319 for (MusicArchiveEntryBean entry : bean.getEntrySet()) {
320 if (fillValue==null) {
321
322 fillValue = entry.getKeywordString()==null ? null : entry.getKeywordString().trim();
323 } else {
324 entry.setKeywordString(fillValue);
325 }
326 }
327 }
328
329 @EventListener(targets="playlistNameEditBox", events="onchange", autoSubmit=true)
330
331
332
333
334 public void playlistNameChangedListener(BrowserEvent event) {
335 getArchive().analyseMusicArchive();
336 getRequestCycle().getResponseBuilder().updateComponent("archiveForm");
337 }
338
339 @EventListener(targets="addToExistingPlaylist", events="onchange", autoSubmit=true)
340
341
342
343
344 public void addToExistingPlaylistChangedListener(BrowserEvent event) {
345 getRequestCycle().getResponseBuilder().updateComponent("archiveForm");
346 }
347 }