Merge lp:~xnox/music-app/better-tune into lp:music-app/trusty

Proposed by Dimitri John Ledkov
Status: Merged
Merge reported by: Victor Thompson
Merged at revision: not available
Proposed branch: lp:~xnox/music-app/better-tune
Merge into: lp:music-app/trusty
Diff against target: 319 lines (+49/-65)
1 file modified
tests/autopilot/music_app/tests/test_music.py (+49/-65)
To merge this branch: bzr merge lp:~xnox/music-app/better-tune
Reviewer Review Type Date Requested Status
Victor Thompson Needs Fixing
Ubuntu Phone Apps Jenkins Bot continuous-integration Needs Fixing
Review via email: mp+210024@code.launchpad.net

Commit message

* Replace screeching, choppy digitalised song with a neutral guitar tune.
* Do not hardcode the name of test song/artist, instead use testclass properties.

Description of the change

* Replace screeching, choppy digitalised song with a neutral guitar tune.
* Do not hardcode the name of test song/artist, instead use testclass properties.

To post a comment you must log in.
Revision history for this message
Dimitri John Ledkov (xnox) wrote :

The original test song is not easy-listening enough, especially when one is re-running music-app test-suite over and over and over again.

Revision history for this message
Victor Thompson (vthompson) wrote :

I doubt this will work as you will need to modify the canned mediascanner library that the tests use.

review: Disapprove
Revision history for this message
Ubuntu Phone Apps Jenkins Bot (ubuntu-phone-apps-jenkins-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Dimitri John Ledkov (xnox) wrote :

On 7 March 2014 21:23, Victor Thompson <email address hidden> wrote:
> Review: Disapprove
>
> I doubt this will work as you will need to modify the canned mediascanner library that the tests use.

Yeah I did wonder about that, since the tests do work on touch.
Instructions must be included on how to generate that cache, ideally
via a script, as otherwise it's non-free blobs.

How do i rebuild the test mediascanner cache?

--
Regards,

Dimitri.

Revision history for this message
Victor Thompson (vthompson) wrote :

You could probably 1) remove your ~/.cache/mediascanner directory, 2) store the music files from tests/autopilot/music_app/content/ and ONLY those files in /home/autopilot-music-app/Music/ and rerun mediascanner with that directory as input. Feel free to inspect the non-free blobs to ensure the data locations are correct, etc.

You should note that this version of the mediascanner will not be used by the app for very much longer (hopefully under 1-2 months)--so your efforts might be for naught.

Revision history for this message
Dimitri John Ledkov (xnox) wrote :

On 7 March 2014 22:07, Victor Thompson <email address hidden> wrote:
> You could probably 1) remove your ~/.cache/mediascanner directory, 2) store the music files from tests/autopilot/music_app/content/ and ONLY those files in /home/autopilot-music-app/Music/ and rerun mediascanner with that directory as input. Feel free to inspect the non-free blobs to ensure the data locations are correct, etc.
>
> You should note that this version of the mediascanner will not be used by the app for very much longer (hopefully under 1-2 months)--so your efforts might be for naught.

Yeah, i've noticed that there are _two_ media scanners running with
different caches. I'll regenerate the caches.

--
Regards,

Dimitri.

Revision history for this message
Victor Thompson (vthompson) wrote :

Also, we intentionally used small files. The ogg you are including is over 3MB, whereas the previous one was 500K.

Revision history for this message
Alan Pope 🍺🐧🐱 🦄 (popey) wrote :

Can we just re-encode the new audio files at a lower bitrate and make them mono to make them smaller?

Revision history for this message
Victor Thompson (vthompson) wrote :

We could do something like that. I think we've decided that mostly the size doesn't matter *so* much, however. I think the more important thing is to try to build up a realistic structure of a few Artists and Albums comprising of multiple genres of music. The song Dimitri's proposing here will be included when we move the test suite over to mediascanner2.0's db.

I'm going to change this to Needs Fixing, since we decided size doesn't matter as much. But trying to fit another test track into the old mediascanner library might not be worth anyone's time.

review: Needs Fixing
Revision history for this message
David Planella (dpm) wrote :

I'll mark this one as Work In Progress, since it's effectively blocked until we land mediascanner2.0 support

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'tests/autopilot/music_app/content/1.ogg'
0Binary files tests/autopilot/music_app/content/1.ogg 2013-09-27 15:14:10 +0000 and tests/autopilot/music_app/content/1.ogg 2014-03-07 21:20:35 +0000 differ0Binary files tests/autopilot/music_app/content/1.ogg 2013-09-27 15:14:10 +0000 and tests/autopilot/music_app/content/1.ogg 2014-03-07 21:20:35 +0000 differ
=== modified file 'tests/autopilot/music_app/tests/test_music.py'
--- tests/autopilot/music_app/tests/test_music.py 2014-03-07 16:40:31 +0000
+++ tests/autopilot/music_app/tests/test_music.py 2014-03-07 21:20:35 +0000
@@ -29,6 +29,8 @@
29 #wait for activity indicator to stop spinning29 #wait for activity indicator to stop spinning
30 spinner = lambda: self.main_view.get_spinner().running30 spinner = lambda: self.main_view.get_spinner().running
31 self.assertThat(spinner, Eventually(Equals(False)))31 self.assertThat(spinner, Eventually(Equals(False)))
32 self.trackTitle = u"Gran Vals"
33 self.artistName = u"Francisco Tárrega"
3234
33 def test_reads_music_library(self):35 def test_reads_music_library(self):
34 """ tests if the music library is populated from our36 """ tests if the music library is populated from our
@@ -37,15 +39,14 @@
37 # populate queue39 # populate queue
38 first_genre_item = self.main_view.get_first_genre_item()40 first_genre_item = self.main_view.get_first_genre_item()
39 self.pointing_device.click_object(first_genre_item)41 self.pointing_device.click_object(first_genre_item)
40 trackTitle = "Foss Yeaaaah! (Radio Edit)"42 song = self.main_view.get_album_sheet_listview_tracktitle(
41 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)43 self.trackTitle)
42 self.pointing_device.click_object(song)44 self.pointing_device.click_object(song)
4345
44 title = lambda: self.player.currentMetaTitle46 title = lambda: self.player.currentMetaTitle
45 artist = lambda: self.player.currentMetaArtist47 artist = lambda: self.player.currentMetaArtist
46 self.assertThat(title,48 self.assertThat(title, Eventually(Equals(self.trackTitle)))
47 Eventually(Equals("Foss Yeaaaah! (Radio Edit)")))49 self.assertThat(artist, Eventually(Equals(self.artistName)))
48 self.assertThat(artist, Eventually(Equals("Benjamin Kerensa")))
4950
50 def test_play_pause_library(self):51 def test_play_pause_library(self):
51 """ Test playing and pausing a track (Music Library must exist) """52 """ Test playing and pausing a track (Music Library must exist) """
@@ -53,8 +54,8 @@
53 # populate queue54 # populate queue
54 first_genre_item = self.main_view.get_first_genre_item()55 first_genre_item = self.main_view.get_first_genre_item()
55 self.pointing_device.click_object(first_genre_item)56 self.pointing_device.click_object(first_genre_item)
56 trackTitle = "Foss Yeaaaah! (Radio Edit)"57 song = self.main_view.get_album_sheet_listview_tracktitle(
57 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)58 self.trackTitle)
58 self.pointing_device.click_object(song)59 self.pointing_device.click_object(song)
5960
60 # click back button61 # click back button
@@ -85,8 +86,8 @@
85 # populate queue86 # populate queue
86 first_genre_item = self.main_view.get_first_genre_item()87 first_genre_item = self.main_view.get_first_genre_item()
87 self.pointing_device.click_object(first_genre_item)88 self.pointing_device.click_object(first_genre_item)
88 trackTitle = "Foss Yeaaaah! (Radio Edit)"89 song = self.main_view.get_album_sheet_listview_tracktitle(
89 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)90 self.trackTitle)
90 self.pointing_device.click_object(song)91 self.pointing_device.click_object(song)
9192
92 playbutton = self.main_view.get_now_playing_play_button()93 playbutton = self.main_view.get_now_playing_play_button()
@@ -108,8 +109,8 @@
108 # populate queue109 # populate queue
109 first_genre_item = self.main_view.get_first_genre_item()110 first_genre_item = self.main_view.get_first_genre_item()
110 self.pointing_device.click_object(first_genre_item)111 self.pointing_device.click_object(first_genre_item)
111 trackTitle = "Foss Yeaaaah! (Radio Edit)"112 song = self.main_view.get_album_sheet_listview_tracktitle(
112 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)113 self.trackTitle)
113 self.pointing_device.click_object(song)114 self.pointing_device.click_object(song)
114115
115 playbutton = self.main_view.get_now_playing_play_button()116 playbutton = self.main_view.get_now_playing_play_button()
@@ -169,8 +170,8 @@
169 # populate queue170 # populate queue
170 first_genre_item = self.main_view.get_first_genre_item()171 first_genre_item = self.main_view.get_first_genre_item()
171 self.pointing_device.click_object(first_genre_item)172 self.pointing_device.click_object(first_genre_item)
172 trackTitle = "Foss Yeaaaah! (Radio Edit)"173 song = self.main_view.get_album_sheet_listview_tracktitle(
173 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)174 self.trackTitle)
174 self.pointing_device.click_object(song)175 self.pointing_device.click_object(song)
175176
176 playbutton = self.main_view.get_now_playing_play_button()177 playbutton = self.main_view.get_now_playing_play_button()
@@ -226,8 +227,8 @@
226 # populate queue227 # populate queue
227 first_genre_item = self.main_view.get_first_genre_item()228 first_genre_item = self.main_view.get_first_genre_item()
228 self.pointing_device.click_object(first_genre_item)229 self.pointing_device.click_object(first_genre_item)
229 trackTitle = "Foss Yeaaaah! (Radio Edit)"230 song = self.main_view.get_album_sheet_listview_tracktitle(
230 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)231 self.trackTitle)
231 self.pointing_device.click_object(song)232 self.pointing_device.click_object(song)
232233
233 """ Track is playing, shuffle is turned on"""234 """ Track is playing, shuffle is turned on"""
@@ -310,18 +311,16 @@
310 def test_show_albums_sheet(self):311 def test_show_albums_sheet(self):
311 """tests navigating to the Albums tab and displaying the album sheet"""312 """tests navigating to the Albums tab and displaying the album sheet"""
312313
313 artistName = "Benjamin Kerensa"
314
315 # switch to albums tab314 # switch to albums tab
316 self.main_view.switch_to_tab("albumstab")315 self.main_view.switch_to_tab("albumstab")
317316
318 #select album317 #select album
319 albumartist = self.main_view.get_albums_albumartist(artistName)318 albumartist = self.main_view.get_albums_albumartist(self.artistName)
320 self.pointing_device.click_object(albumartist)319 self.pointing_device.click_object(albumartist)
321320
322 #get album sheet album artist321 #get album sheet album artist
323 sheet_albumartist = self.main_view.get_album_sheet_artist()322 sheet_albumartist = self.main_view.get_album_sheet_artist()
324 self.assertThat(sheet_albumartist.text, Equals(artistName))323 self.assertThat(sheet_albumartist.text, Equals(self.artistName))
325324
326 # click on close button to close album sheet325 # click on close button to close album sheet
327 closebutton = self.main_view.get_album_sheet_close_button()326 closebutton = self.main_view.get_album_sheet_close_button()
@@ -331,9 +330,6 @@
331 def test_add_song_to_queue_from_albums_sheet(self):330 def test_add_song_to_queue_from_albums_sheet(self):
332 """tests navigating to the Albums tab and adding a song to queue"""331 """tests navigating to the Albums tab and adding a song to queue"""
333332
334 trackTitle = "Foss Yeaaaah! (Radio Edit)"
335 artistName = "Benjamin Kerensa"
336
337 # get number of tracks in queue before queuing a track333 # get number of tracks in queue before queuing a track
338 initialtracksCount = self.main_view.get_queue_track_count()334 initialtracksCount = self.main_view.get_queue_track_count()
339335
@@ -341,16 +337,16 @@
341 self.main_view.switch_to_tab("albumstab")337 self.main_view.switch_to_tab("albumstab")
342338
343 #select album339 #select album
344 albumartist = self.main_view.get_albums_albumartist(artistName)340 albumartist = self.main_view.get_albums_albumartist(self.artistName)
345 self.pointing_device.click_object(albumartist)341 self.pointing_device.click_object(albumartist)
346342
347 #get album sheet album artist343 #get album sheet album artist
348 sheet_albumartist = self.main_view.get_album_sheet_artist()344 sheet_albumartist = self.main_view.get_album_sheet_artist()
349 self.assertThat(sheet_albumartist.text, Equals(artistName))345 self.assertThat(sheet_albumartist.text, Equals(self.artistName))
350346
351 #get track item to add to queue347 #get track item to add to queue
352 trackicon = self.main_view.get_album_sheet_listview_trackicon(348 trackicon = self.main_view.get_album_sheet_listview_trackicon(
353 trackTitle)349 self.trackTitle)
354 self.pointing_device.click_object(trackicon)350 self.pointing_device.click_object(trackicon)
355351
356 #click on Add to queue352 #click on Add to queue
@@ -368,11 +364,11 @@
368364
369 #verify song's metadata matches the item added to the Now Playing view365 #verify song's metadata matches the item added to the Now Playing view
370 queueArtistName = self.main_view.get_queue_now_playing_artist(366 queueArtistName = self.main_view.get_queue_now_playing_artist(
371 artistName)367 self.artistName)
372 self.assertThat(str(queueArtistName.text), Equals(artistName))368 self.assertThat(str(queueArtistName.text), Equals(self.artistName))
373 queueTrackTitle = self.main_view.get_queue_now_playing_title(369 queueTrackTitle = self.main_view.get_queue_now_playing_title(
374 trackTitle)370 self.trackTitle)
375 self.assertThat(str(queueTrackTitle.text), Equals(trackTitle))371 self.assertThat(str(queueTrackTitle.text), Equals(self.trackTitle))
376372
377 # click on close button to close album sheet373 # click on close button to close album sheet
378 closebutton = self.main_view.get_album_sheet_close_button()374 closebutton = self.main_view.get_album_sheet_close_button()
@@ -383,9 +379,6 @@
383 """tests navigating to the Songs tab and adding the library to the379 """tests navigating to the Songs tab and adding the library to the
384 queue with the selected item being played. """380 queue with the selected item being played. """
385381
386 trackTitle = "Foss Yeaaaah! (Radio Edit)"
387 artistName = "Benjamin Kerensa"
388
389 # get number of tracks in queue before queuing a track382 # get number of tracks in queue before queuing a track
390 initialtracksCount = self.main_view.get_queue_track_count()383 initialtracksCount = self.main_view.get_queue_track_count()
391384
@@ -393,7 +386,7 @@
393 self.main_view.switch_to_tab("trackstab")386 self.main_view.switch_to_tab("trackstab")
394387
395 # get track item to add to queue388 # get track item to add to queue
396 trackitem = self.main_view.get_songs_tab_tracktitle(trackTitle)389 trackitem = self.main_view.get_songs_tab_tracktitle(self.trackTitle)
397 self.pointing_device.click_object(trackitem)390 self.pointing_device.click_object(trackitem)
398391
399 # verify track queue has added all songs to initial value392 # verify track queue has added all songs to initial value
@@ -407,19 +400,16 @@
407400
408 # verify song's metadata matches the item added to the Now Playing view401 # verify song's metadata matches the item added to the Now Playing view
409 queueArtistName = self.main_view.get_queue_now_playing_artist(402 queueArtistName = self.main_view.get_queue_now_playing_artist(
410 artistName)403 self.artistName)
411 self.assertThat(str(queueArtistName.text), Equals(artistName))404 self.assertThat(str(queueArtistName.text), Equals(self.artistName))
412 queueTrackTitle = self.main_view.get_queue_now_playing_title(405 queueTrackTitle = self.main_view.get_queue_now_playing_title(
413 trackTitle)406 self.trackTitle)
414 self.assertThat(str(queueTrackTitle.text), Equals(trackTitle))407 self.assertThat(str(queueTrackTitle.text), Equals(self.trackTitle))
415408
416 def test_add_song_to_queue_from_songs_tab(self):409 def test_add_song_to_queue_from_songs_tab(self):
417 """tests navigating to the Songs tab and adding a song from the library410 """tests navigating to the Songs tab and adding a song from the library
418 to the queue via the expandable list view item. """411 to the queue via the expandable list view item. """
419412
420 trackTitle = "Foss Yeaaaah! (Radio Edit)"
421 artistName = "Benjamin Kerensa"
422
423 # get number of tracks in queue before queuing a track413 # get number of tracks in queue before queuing a track
424 initialtracksCount = self.main_view.get_queue_track_count()414 initialtracksCount = self.main_view.get_queue_track_count()
425415
@@ -427,7 +417,7 @@
427 self.main_view.switch_to_tab("trackstab")417 self.main_view.switch_to_tab("trackstab")
428418
429 # get track item to add to queue419 # get track item to add to queue
430 trackitem = self.main_view.get_songs_tab_trackimage(trackTitle)420 trackitem = self.main_view.get_songs_tab_trackimage(self.trackTitle)
431 self.pointing_device.click_object(trackitem)421 self.pointing_device.click_object(trackitem)
432 addtoqueueLabel = self.main_view.get_songs_tab_add_to_queue_label()422 addtoqueueLabel = self.main_view.get_songs_tab_add_to_queue_label()
433 self.pointing_device.click_object(addtoqueueLabel)423 self.pointing_device.click_object(addtoqueueLabel)
@@ -443,23 +433,21 @@
443433
444 # verify song's metadata matches the item added to the Now Playing view434 # verify song's metadata matches the item added to the Now Playing view
445 queueArtistName = self.main_view.get_queue_now_playing_artist(435 queueArtistName = self.main_view.get_queue_now_playing_artist(
446 artistName)436 self.artistName)
447 self.assertThat(str(queueArtistName.text), Equals(artistName))437 self.assertThat(str(queueArtistName.text), Equals(self.artistName))
448 queueTrackTitle = self.main_view.get_queue_now_playing_title(438 queueTrackTitle = self.main_view.get_queue_now_playing_title(
449 trackTitle)439 self.trackTitle)
450 self.assertThat(str(queueTrackTitle.text), Equals(trackTitle))440 self.assertThat(str(queueTrackTitle.text), Equals(self.trackTitle))
451441
452 def test_create_playlist_from_songs_tab(self):442 def test_create_playlist_from_songs_tab(self):
453 """tests navigating to the Songs tab and creating a playlist by443 """tests navigating to the Songs tab and creating a playlist by
454 selecting a song to add it to a new playlist. """444 selecting a song to add it to a new playlist. """
455445
456 trackTitle = "Foss Yeaaaah! (Radio Edit)"
457
458 # switch to songs tab446 # switch to songs tab
459 self.main_view.switch_to_tab("trackstab")447 self.main_view.switch_to_tab("trackstab")
460448
461 # get track item to add to queue449 # get track item to add to queue
462 trackitem = self.main_view.get_songs_tab_trackimage(trackTitle)450 trackitem = self.main_view.get_songs_tab_trackimage(self.trackTitle)
463 self.pointing_device.click_object(trackitem)451 self.pointing_device.click_object(trackitem)
464 addtoplaylistLbl = self.main_view.get_songs_tab_add_to_playlist_label()452 addtoplaylistLbl = self.main_view.get_songs_tab_add_to_playlist_label()
465 self.pointing_device.click_object(addtoplaylistLbl)453 self.pointing_device.click_object(addtoplaylistLbl)
@@ -497,9 +485,6 @@
497 def test_artists_tab_album(self):485 def test_artists_tab_album(self):
498 """tests navigating to the Artists tab and playing an album"""486 """tests navigating to the Artists tab and playing an album"""
499487
500 artistName = "Benjamin Kerensa"
501 trackTitle = "Foss Yeaaaah! (Radio Edit)"
502
503 # get number of tracks in queue before queuing a track488 # get number of tracks in queue before queuing a track
504 initialtracksCount = self.main_view.get_queue_track_count()489 initialtracksCount = self.main_view.get_queue_track_count()
505490
@@ -507,26 +492,27 @@
507 self.main_view.switch_to_tab("artiststab")492 self.main_view.switch_to_tab("artiststab")
508493
509 #select artist494 #select artist
510 artist = self.main_view.get_artists_artist(artistName)495 artist = self.main_view.get_artists_artist(self.artistName)
511 self.pointing_device.click_object(artist)496 self.pointing_device.click_object(artist)
512497
513 #get album sheet album artist498 #get album sheet album artist
514 sheet_albumartist = self.main_view.get_artist_sheet_artist()499 sheet_albumartist = self.main_view.get_artist_sheet_artist()
515 self.assertThat(sheet_albumartist.text, Equals(artistName))500 self.assertThat(sheet_albumartist.text, Equals(self.artistName))
516501
517 #select artist502 #select artist
518 artist = self.main_view.get_artists_artist(artistName)503 artist = self.main_view.get_artists_artist(self.artistName)
519 self.pointing_device.click_object(artist)504 self.pointing_device.click_object(artist)
520505
521 #get song sheet album artist506 #get song sheet album artist
522 sheet_albumartist = self.main_view.get_album_sheet_artist()507 sheet_albumartist = self.main_view.get_album_sheet_artist()
523 self.assertThat(sheet_albumartist.text, Equals(artistName))508 self.assertThat(sheet_albumartist.text, Equals(self.artistName))
524509
525 # click on song to populate queue and start playing510 # click on song to populate queue and start playing
526 self.pointing_device.click_object(sheet_albumartist)511 self.pointing_device.click_object(sheet_albumartist)
527512
528 #select artist513 #select artist
529 track = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)514 track = self.main_view.get_album_sheet_listview_tracktitle(
515 self.trackTitle)
530 self.pointing_device.click_object(track)516 self.pointing_device.click_object(track)
531517
532 # verify track queue has added all songs to initial value518 # verify track queue has added all songs to initial value
@@ -540,23 +526,21 @@
540526
541 # verify song's metadata matches the item added to the Now Playing view527 # verify song's metadata matches the item added to the Now Playing view
542 queueArtistName = self.main_view.get_queue_now_playing_artist(528 queueArtistName = self.main_view.get_queue_now_playing_artist(
543 artistName)529 self.artistName)
544 self.assertThat(str(queueArtistName.text), Equals(artistName))530 self.assertThat(str(queueArtistName.text), Equals(self.artistName))
545 queueTrackTitle = self.main_view.get_queue_now_playing_title(531 queueTrackTitle = self.main_view.get_queue_now_playing_title(
546 trackTitle)532 self.trackTitle)
547 self.assertThat(str(queueTrackTitle.text), Equals(trackTitle))533 self.assertThat(str(queueTrackTitle.text), Equals(self.trackTitle))
548534
549 def test_swipe_to_delete_song(self):535 def test_swipe_to_delete_song(self):
550 """tests navigating to the Now Playing queue, swiping to delete a536 """tests navigating to the Now Playing queue, swiping to delete a
551 track, and confirming the delete action. """537 track, and confirming the delete action. """
552538
553 artistName = "Benjamin Kerensa"
554
555 # populate queue539 # populate queue
556 first_genre_item = self.main_view.get_first_genre_item()540 first_genre_item = self.main_view.get_first_genre_item()
557 self.pointing_device.click_object(first_genre_item)541 self.pointing_device.click_object(first_genre_item)
558 trackTitle = "Foss Yeaaaah! (Radio Edit)"542 song = self.main_view.get_album_sheet_listview_tracktitle(
559 song = self.main_view.get_album_sheet_listview_tracktitle(trackTitle)543 self.trackTitle)
560 self.pointing_device.click_object(song)544 self.pointing_device.click_object(song)
561545
562 # get initial queue count546 # get initial queue count
@@ -564,7 +548,7 @@
564548
565 # get song to delete549 # get song to delete
566 artistToDelete = self.main_view.get_queue_now_playing_artist(550 artistToDelete = self.main_view.get_queue_now_playing_artist(
567 artistName)551 self.artistName)
568 musicnowplayingpage = self.main_view.get_MusicNowPlaying_page()552 musicnowplayingpage = self.main_view.get_MusicNowPlaying_page()
569553
570 # get coordinates to delete song554 # get coordinates to delete song

Subscribers

People subscribed via source and target branches

to status/vote changes: