Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-ca-cd:teme:proiect:etapa3 [2023/12/22 19:52]
robert.grancsa [Proiect GlobalWaves - Etapa 3 - Analytics & Recommendations]
poo-ca-cd:teme:proiect:etapa3 [2024/01/14 14:39] (current)
robert.grancsa
Line 6: Line 6:
   * **Colaboratori:​** [[sorinabuf@gmail.com | Sorina-Anamaria Buf]], [[stefancocioran@gmail.com | Ștefan Cocioran]], [[miculuis1@gmail.com | Florian-Luis Micu]]   * **Colaboratori:​** [[sorinabuf@gmail.com | Sorina-Anamaria Buf]], [[stefancocioran@gmail.com | Ștefan Cocioran]], [[miculuis1@gmail.com | Florian-Luis Micu]]
   * **Data publicarii: ** 18.12.2023, ora 13:30   * **Data publicarii: ** 18.12.2023, ora 13:30
-  * **Deadline HARD: ** 14.01.2024, ora 23:55 +  * **Deadline HARD: ** <del>14.01.2024</​del>​ 16.01.2024, ora 23:55 
-  * **Ultima modificare a enuntului:​** ​22.12.2023, ora 19:50 updated search specifications +  * **Ultima modificare a enuntului:​** ​ 
-  * **Ultima modificare a testelor:​** ​19.12.2023, ora 23:11 - removed ​bad field from refs+     * 11.01.2024, ora 23:23 added details for design patterns 
 +     * 06.01.2024, ora 14:25 - details for updateRecommendations 
 +  *  
 +  * **Ultima modificare a testelor:​** ​29.12.2023, ora 14:54 - removed ​all songs from the library
   * ** Schelet: ** [[https://​github.com/​oop-pub/​oop-project-2023/​tree/​main/​etapa3 | GitHub]]   * ** Schelet: ** [[https://​github.com/​oop-pub/​oop-project-2023/​tree/​main/​etapa3 | GitHub]]
 +  * **History**
 +    * 28.12.2023, ora 02:37 - simplified complex tests (6, 15, 16) and other fixes for date, recommandation and duplicate songs
 +    * 27.12.2023, ora 11:05 - fixed index for random song
 +    * 26.12.2023, ora 14:13 - replaced topPodcasts and recalculted mostProfitableSong
 +    * 24.12.2023, ora 13:25 - clarifications for wrapped
 +    * 24.12.2023, ora 13:25 - fixed createPlaylist in test 12
 +    * 24.12.2023, ora 13:25 - removed field from test 10 and fixed message for notifications
 +    * 23.12.2023, ora 14:10 - updated notifications info
 +    * 23.12.2023, ora 14:10 - updated notifications messages
 +    * 22.12.2023, ora 19:50 - updated search specifications
 +    * 22.12.2023, ora 22:33 - added hosts to input
 +    * 19.12.2023, ora 23:11 - removed bad field from refs
  
   * **Atenție!** Pentru partea de citire / afișare nu este necesară folosirea adnotărilor din librăria Jackson. Puteți utiliza o metodă similară cu cea prezentată de noi în schelet, și anume să vă folosiți de clasa ObjectMapper. **Nu există o metodă corectă sau greșită de a lucra cu input-ul / output-ul.** Scopul nostru în cadrul acestui proiect nu este să vă testăm abilitatea de a lucra cu fișierele, ci să vă testăm atât înțelegerea cunoștințelor de bază dobândite în cadrul cursurilor și a laboratoarelor,​ cât și modul de gândire într-un limbaj de programare orientat obiect.   * **Atenție!** Pentru partea de citire / afișare nu este necesară folosirea adnotărilor din librăria Jackson. Puteți utiliza o metodă similară cu cea prezentată de noi în schelet, și anume să vă folosiți de clasa ObjectMapper. **Nu există o metodă corectă sau greșită de a lucra cu input-ul / output-ul.** Scopul nostru în cadrul acestui proiect nu este să vă testăm abilitatea de a lucra cu fișierele, ci să vă testăm atât înțelegerea cunoștințelor de bază dobândite în cadrul cursurilor și a laboratoarelor,​ cât și modul de gândire într-un limbaj de programare orientat obiect.
   * **Este obligatoriu să folosiți cel puțin 4 design pattern-uri.** Trebuie sa precizati in README ce design pattern ati folosit, si motivatia & locatia unde a fost folosita   * **Este obligatoriu să folosiți cel puțin 4 design pattern-uri.** Trebuie sa precizati in README ce design pattern ati folosit, si motivatia & locatia unde a fost folosita
 +  * **Depunctari lipsa design pattern-uri**:​ Pentru fiecare design pattern lipsa (din cele 4), veti avea o depunctare de -2.5p, astfel pentru:
 +    * 0 design pattern-uri - **-10p**
 +    * 1 design pattern-uri - **-7.5p**
 +    * 2 design pattern-uri - **-5p**
 +    * 3 design pattern-uri - **-2.5p**
  
 <note important>​ <note important>​
Line 67: Line 87:
   * topSongs - melodiile dupa numarul de listen-uri   * topSongs - melodiile dupa numarul de listen-uri
   * topAlbums - albumele dupa numarul de listen-uri   * topAlbums - albumele dupa numarul de listen-uri
-  * topPodcasts ​- podcast-urile ​dupa numarul de listen-uri+  * topEpisodes ​episoadele de podcast dupa numarul de listen-uri
  
 Mesaje posibile pentru aceasta comanda: Mesaje posibile pentru aceasta comanda:
Line 74: Line 94:
  
 <note important>​Orice melodie stearsa, dar **deja ascultata** de user o sa ramana in statisticile lui</​note>​ <note important>​Orice melodie stearsa, dar **deja ascultata** de user o sa ramana in statisticile lui</​note>​
 +
 +<note warning>​Daca aveti 2 melodii cu acelasi artist si aceasi nume, listen-urile lor se vor combina la afisare, chiar daca se afla in albume diferite</​note>​
  
 === Input === === Input ===
Line 119: Line 141:
       "Led Zeppelin IV": 1            "Led Zeppelin IV": 1     
     },          },     
-    "topPodcasts": {       +    "topEpisodes": {       
       "The Power of Design":​ 2,              "The Power of Design":​ 2,       
       "The Science of Us": 1            "The Science of Us": 1     
Line 312: Line 334:
   "​username":​ "​alice22",​   "​username":​ "​alice22",​
   "​timestamp":​ 5,   "​timestamp":​ 5,
-  "​message":​ "Ed Sheeran ​has added new merch successfully."​+  "​message":​ "alice22 ​has added new merch successfully."​
 } }
 </​code>​ </​code>​
Line 392: Line 414:
   * ''​%%"​The username ${username} doesn'​t exist."​%%''​   * ''​%%"​The username ${username} doesn'​t exist."​%%''​
   * ''​%%"​${username} is not a premium user."​%%''​   * ''​%%"​${username} is not a premium user."​%%''​
-  * ''​%%"​${username} ​canceled ​the subscription successfully."​%%''​+  * ''​%%"​${username} ​cancelled ​the subscription successfully."​%%''​
  
 <spoiler Click pentru input cancel premium> <spoiler Click pentru input cancel premium>
Line 410: Line 432:
     "​username":​ "​alice22",​     "​username":​ "​alice22",​
     "​timestamp":​ 15,     "​timestamp":​ 15,
-    "​message":​ "​alice22 ​canceled ​the subscription successfully."​+    "​message":​ "​alice22 ​cancelled ​the subscription successfully."​
 } }
 </​code>​ </​code>​
Line 419: Line 441:
 <note important>​Un user premium nu poate fi scos niciodata de pe platforma</​note>​ <note important>​Un user premium nu poate fi scos niciodata de pe platforma</​note>​
  
-Un utilizator poate cumpara subscriptie premium la pretul unic de **1.000.000**,​ care va semnifica cat credit are pentru a plati artisti. Formula pentru a afla cat primeste fiecare artist este urmatoarea:+Un utilizator poate cumpara subscriptie premium la pretul unic de **1.000.000**,​ care va semnifica cat credit are pentru a plati artisti. La finalul fiecarei rularii, toti utilizatori care sunt premium vor adauga bani in contul artistilor de la care a ascultat. Formula pentru a afla cat primeste fiecare artist este urmatoarea:
  
 <​html><​img src="​https://​latex.codecogs.com/​svg.image?​val = \frac{10^6}{song_{total}}*song_{artist}"​ alt=""/></​html>​ <​html><​img src="​https://​latex.codecogs.com/​svg.image?​val = \frac{10^6}{song_{total}}*song_{artist}"​ alt=""/></​html>​
Line 444: Line 466:
 Pentru ca un utilizator free nu plateste deloc ca sa foloseasca aplicatia, va primi la momente predefinite ad-uri. Acestea vor fi adaugate in coada userului atunci cand va aparea comanda "​adBreak"​ de la input. In acest caz, dupa terminarea melodiei curente, utilizatorul va avea de ascultat obligatoriu un ad care este unskippable. Pentru ca un utilizator free nu plateste deloc ca sa foloseasca aplicatia, va primi la momente predefinite ad-uri. Acestea vor fi adaugate in coada userului atunci cand va aparea comanda "​adBreak"​ de la input. In acest caz, dupa terminarea melodiei curente, utilizatorul va avea de ascultat obligatoriu un ad care este unskippable.
  
-Ad-ul este un cantec definite in library, si ar trebui sa functioneaza ​la fel ca un cantec normal doar ca nu se poate da skip la el. Totusi, un load il va suprascrie mereu.+Ad-ul este un cantec definite in library, si ar trebui sa functioneaze ​la fel ca un cantec normal doar ca nu se poate da skip la el. Totusi, un load il va suprascrie mereu.
  
 <note important>​Ad-urile nu vor contribui la spotify wrapped</​note>​ <note important>​Ad-urile nu vor contribui la spotify wrapped</​note>​
Line 480: Line 502:
 == Calcul monetizare == == Calcul monetizare ==
  
-Dupa ce asculta ​ad-ul, se vor calcula ultimele melodii ascultate intre ad-ul curent, si ultimul ad primit (sau inceputul istoricului),​ si artistii ai caror melodii a ascultat acel user vor primii valoarea urmatoare:+Atunci cand ad-ul intra in player, se vor calcula ultimele melodii ascultate intre ad-ul curent, si ultimul ad primit (sau inceputul istoricului),​ si artistii ai caror melodii a ascultat acel user vor primii valoarea urmatoare:
  
 <​html><​img src="​https://​latex.codecogs.com/​svg.image?​val = \frac{price_{ad}}{song_{last}}*song_{artist}"​ alt=""/></​html>​ <​html><​img src="​https://​latex.codecogs.com/​svg.image?​val = \frac{price_{ad}}{song_{last}}*song_{artist}"​ alt=""/></​html>​
Line 487: Line 509:
   * $val$ = valoarea de bani care se duce la **artistul respectiv** ​   * $val$ = valoarea de bani care se duce la **artistul respectiv** ​
   * $price_{ad}$ = cat valoareaza ad-ul respectiv   * $price_{ad}$ = cat valoareaza ad-ul respectiv
-  * $song_{last}$ = numarul de cantece ascultate de catre userul premium ​+  * $song_{last}$ = numarul de cantece ascultate de catre user de la ultimul adBreak pana la adBreak-ul curent
   * $song_{artist}$ = numarul de cantece ascultate de la artist   * $song_{artist}$ = numarul de cantece ascultate de la artist
  
Line 517: Line 539:
 ==== Subscribe ==== ==== Subscribe ====
  
-Pentru a se abona la un artist, utilizatorul trebuie sa se afle pe pagina artistului/​host-ului.+Pentru a se abona la un artist/host, utilizatorul trebuie sa se afle pe pagina artistului/​host-ului. Daca utilizatorul va da de 2 ori la rand comanda subscribe pentru un artist/​host,​ el se va dezabona de la acel user.
  
 Mesaje posibile pentru aceasta comanda: Mesaje posibile pentru aceasta comanda:
  
   * ''​%%"​The username ${username} doesn'​t exist."​%%''​   * ''​%%"​The username ${username} doesn'​t exist."​%%''​
-  * ''​%%"​You can subscribe only to artists and hosts."​%%''​ 
   * ''​%%"​To subscribe you need to be on the page of an artist or host."​%%''​   * ''​%%"​To subscribe you need to be on the page of an artist or host."​%%''​
-  * ''​%%"​${username} subscribed to ${artist/​host} successfully."​%%''​+  * ''​%%"​${username} ​(subscribed/​unsubscribed) (to/​from) ​${artist/​host} successfully."​%%''​
  
 === Input === === Input ===
Line 577: Line 598:
   "​username":​ "​alice22",​   "​username":​ "​alice22",​
   "​timestamp":​ 15,   "​timestamp":​ 15,
-  "result": [+  "notificarions": [
     {     {
       "​name":​ "New Album",​       "​name":​ "New Album",​
Line 598: Line 619:
  
 Fiecare utilizator normal va primii recomandari pentru melodii si playlist-uri,​ care vor fi afisate pe HomePage-ul acestuia. Pentru a le reda, utilizatorul trebuie sa primeasca comanda de //​loadRecommendations//​. Fiecare utilizator normal va primii recomandari pentru melodii si playlist-uri,​ care vor fi afisate pe HomePage-ul acestuia. Pentru a le reda, utilizatorul trebuie sa primeasca comanda de //​loadRecommendations//​.
 +
 +<note important>​Se poate ca pentru utilizatorul pentru care s-a cerut recomandari sa nu se gaseasca nicio recomandare.</​note>​
 +
  
 Output-ul pentru printarea HomePage-ului utilizatorului va avea urmatorul format:<​html><​br></​html>​ Output-ul pentru printarea HomePage-ului utilizatorului va avea urmatorul format:<​html><​br></​html>​
Line 622: Line 646:
   * alegerea random se va baza pe un **seed** reprezentat de cat a ascultat utilizatorul din melodia curenta   * alegerea random se va baza pe un **seed** reprezentat de cat a ascultat utilizatorul din melodia curenta
  
-<note important>​Cand se cere o recomandare ​de tipul random song, se considera ca utilizatorul asculta o melodie ​si nu alt tip de fisier/colectie audio. Idem si pentru celelalte tipuri de recomandari. </​note>​+<note important>​Cand se cere o recomandare,​ se considera ca utilizatorul asculta o melodie/playlist. </​note>​
  
 === Adaugare recomandare Random Song === === Adaugare recomandare Random Song ===
Line 840: Line 864:
  
 <note important>​Intr-o succesiune de comenzi back/​foward,​ daca apare o comanda de ChangePage, atunci istoricul pentru foward va fi resetat.</​note>​ <note important>​Intr-o succesiune de comenzi back/​foward,​ daca apare o comanda de ChangePage, atunci istoricul pentru foward va fi resetat.</​note>​
 +
 +<note tip>​Noile optiuni pentru comanda changePage de ''​%%Host%%''/''​%%Artist%%'',​ te vor directiona catre pagina host-ului, respectiv artistului al carui fisier este la acel moment in playerul userului.</​note>​
  
 Cand se primeste comanda de Cand se primeste comanda de
poo-ca-cd/teme/proiect/etapa3.1703267546.txt.gz · Last modified: 2023/12/22 19:52 by robert.grancsa
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0