Spotify е платформа за stream-ване на музика, която предоставя на потребителите достъп до милиони песни на изпълнители от цял свят.
Stream-ването е метод за предаване на данни, използван обикновено за мултимедийни файлове. При него възпроизвеждането на съдържанието върху устройството на потребителя започва още с достъпването му, без да се налага то отначало да бъде изтеглено изцяло като файл и после да се стартира в подходящ плеър. Предаването на данните протича едновременно с възпроизвеждането, затова е необходима постоянна мрежова свързаност.
Създайте приложение по подобие на Spotify, състоящо се от две части - сървър и клиент.
Предоставя следните функционалности на клиента:
- регистриране в платформата чрез email и парола (потребителите трябва да се съхраняват във файл)
- login в платформата чрез email и парола
- съхраняване на набор от песни, достъпни на потребителите за слушане
- търсене на песни
- създаване на статистика на най-слушаните песни от потребителите
- създаване на плейлисти (плейлистите трябва да се съхраняват във файлове)
- добавяне на песни към плейлисти
- връщане на информация за даден плейлист
stream-ване на песни
Spotify клиентът трябва да има command line interface със следните команди:
register <email> <password>
login <email> <password>
search <words> - връща всички песни, в чиито имена или имената на изпълнителите iм, се среща потърсената дума (или думи)
top <number> - връща списък с *number* от най-слушаните песни в момента, сортиран в намаляващ ред
create-playlist <name_of_the_playlist>
add-song_to <name_of_the_playlist>
show-playlist <name_of_the_playlist>
play <song>
stop-
За да можете да изпълнявате песни от
Spotifyклиента, използвайте API-тоjavax.sound.sampled. -
javax.sound.sampledработи само с файлове във wav формат, затова всички песни, които имате на сървъра, трябва да са .wav -
javax.sound.sampledпредоставя два начина за възпроизвеждане на музика - чрезClipиSourceDataLine.Clipсе използва когато имамеnon-real-timeмузикални данни (файл), които могат да бъдат предварително заредени в паметта.SourceDataLineсе използва заstream-ване на данни, като например голям музикален файл, който не може да се зареди в паметта наведнъж, или за данни, които предварително не са известни. (за повече информация тук)За целите на проекта, трябва да използвате
SourceDataLine.-
За да създадем
SourceDataLineпърво трябва да знаем конкретния формат на данните, които ще получаваме по мрежата. Това става с класаAudioFormat. За да успеем да възпроизведем дадена песен при клиента, трябва предварително да знаем какъв е този формат. -
Преди сървърът да започне да ни
stream-ва песента, той трябва да ни даде(прати) информация за формата на данните. КласътAudioFormatне еSerializable, т.е не можем да го прехвърляме по мрежата. -
За да вземем формата на песента на сървъра, можем да използваме следния код:
AudioFormat audioFormat = AudioSystem.getAudioInputStream(new File(song)).getFormat();
-
Данните, които са необходими на клиента, са всички полета от конструктора на
AudioFormat. Те могат да бъдат достъпени чрез съответнитеgetterметоди:AudioFormat(AudioFormat.Encoding encoding, float sampleRate, int sampleSizeInBits, int channels, int frameSize, float frameRate, boolean bigEndian)
-
След като сървърът е изпратил формата на данните, клиентът вече е готов да създаде съответния
SourceDataLineобект, чрез който ще се възпроизвежда песента.Encoding encoding = ...; int sampleRate = ...; ... AudioFormat format = new AudioFormat(encoding, sampleRate, sampleSizeInBits, channels, frameSize, frameRate, bigEndian); DataLine.Info info = new DataLine.Info(SourceDataLine.class, format); SourceDataLine dataLine = (SourceDataLine) AudioSystem.getLine(info); dataLine.open(); dataLine.start(); // Имайте предвид, че SourceDataLine.start() пуска нова нишка. За повече информация, може да проверите имплементацията.
-
За да запишем данни в
SourceDataLineобекта (данните, които искаме да възпроизведем) използваме следния метод:dataLine.write(byte[] b, int off, int len);
-
За тестови цели, можем да си пуснем песен (non-real-time) със следния код:
AudioInputStream stream = AudioSystem.getAudioInputStream(new File("<music>.wav")); SourceDataLine dataLine = AudioSystem.getSourceDataLine(stream.getFormat()); dataLine.open(); dataLine.start(); while (true);
-
-
Валидирайте по подходящ начин командите
-
При възникване на програмна грешка, извеждайте в конзолата смислени съобщения на потребителя - не се предполага клиентът да има умения да
troubleshoot-ваexception-и, затоваprintStackTrace()не е добър вариант. Хвръленитеexception-и записвайте във файл.