lastkey <- "xxxxxxxxxxxxxxxxxxxxxxxxxx" # get your key from http://www.last.fm/api/account/create
user_name <- "LeMUr1978KCrq"

# install package from:
# https://cran.r-project.org/src/contrib/Archive/RLastFM/RLastFM_0.1-5.tar.gz
library(RLastFM)

library(dplyr)
library(rvest)

# weź 200 najnowszych scrobbli
# im więcej tym lepsze rekomendacje
# im więcej tym dłużej to trwa...
# 1000 to max
lastfm <- as.data.frame(user.getRecentTracks(user_name, limit = 200)) %>%
   select(Artist=artist, Song=track)

lastfm$Artist <- as.character(lastfm$Artist)
lastfm$Song <- as.character(lastfm$Song)


# najpopularniejsze piosenki (najczęściej słuchane)
# n - ile razy piosenka była słuchana?
popular_songs <- lastfm %>% 
   filter(Artist!="[unknown]") %>%
   group_by(Artist, Song) %>%
   summarise(n=n()) %>%
   ungroup() %>%
   arrange(desc(n)) %>% 
   mutate(ArtSong=paste(Artist, Song, sep=" - "))
ArtSong n
Kombajn Do Zbierania Kur Po Wioskach - Waniliowe niebo 3
Deep Purple - Black Night 2
Deep Purple - Speed King 2
Kombajn Do Zbierania Kur Po Wioskach - Don’t drive so fast 2
Kombajn Do Zbierania Kur Po Wioskach - Połączenia 2
Led Zeppelin - What Is and What Should Never Be 2
Led Zeppelin - Whole Lotta Love 2
Leonard Cohen - You Want It Darker 2
Marek Grechuta - Dni, których nie znamy 2
Marek Grechuta - Hop szklanke piwa 2
# liczba unikalnych piosenek
nrow(popular_songs)
## [1] 183
# bierzemy tylko 5% najczęściej słuchanych
# przy dużej bibliotece to i tak będzie dużo!
popular_songs <- filter(popular_songs, n>=quantile(n, probs = 0.95))

# liczba unikalnych piosenek - po redukcji do 5%
n_popular_songs <- nrow(popular_songs)
print(n_popular_songs)
## [1] 16
# procent scrobli po redukcji, na których oparte będą rekomendacje
print(100 * sum(popular_songs$n) / nrow(lastfm))
## [1] 16.5
similar_songs_df <- data.frame()
for(i in 1:n_popular_songs) {
   similar_songs <- track.getSimilar(track=popular_songs[i, 2], artist=popular_songs[i,1])
   if(length(similar_songs$artist) != 0)
      similar_songs_df <- rbind(similar_songs_df,
                                data.frame(Song=as.character(popular_songs[i, 4]),
                                           Artist=similar_songs$artist,
                                           Track=similar_songs$track,
                                           Match=similar_songs$match))
}

# liczba piosenek wybranych jako podobne
nrow(similar_songs_df)
## [1] 1298
# oznacz te, które nie były scroblowane
# tolower() żeby nie było problemu z wielkością liter
# np. "The Doors - Light my fire" vs. "The doors - Light My Fire"
similar_songs_df$ArtTrack <- paste(similar_songs_df$Artist, similar_songs_df$Track, sep=" - ")
similar_songs_df$Unknown <- !(tolower(similar_songs_df$ArtTrack) %in% tolower(popular_songs$ArtSong))


# podaj najczęściej polecane i policz prawdopodobieństwo spodobania się
# prawdopodobieństwo wg LastFM * ilość poleceń danego utworu / maksymalna ilość poleceń utworu
polecane_songs <- similar_songs_df %>%
   filter(Unknown==TRUE) %>%
   group_by(ArtTrack) %>%
   summarise(n=n(), mean_match=mean(Match)) %>%
   ungroup() %>%
   mutate(p=100*mean_match*n/max(n)) %>%
   arrange(desc(p))

# liczba unikalnych polecanych 
nrow(polecane_songs)
## [1] 975
# tylko 5% najbardziej polecanych - żeby było szybciej :)
polecane_songs_5 <- polecane_songs %>%
   filter(p>=quantile(p, probs = 0.95)) %>%
   select(ArtTrack, p)
n_polecane_songs_5 <- nrow(polecane_songs_5)
print(n_polecane_songs_5)
## [1] 49
ArtTrack p
Kombajn Do Zbierania Kur Po Wioskach - Prezent 38
Deep Purple - Bloodsucker 20
Deep Purple - Strange Kind of Woman 20
Kombajn Do Zbierania Kur Po Wioskach - Białe kwity 20
Kombajn Do Zbierania Kur Po Wioskach - Niemiecki krasnal 20
Led Zeppelin - Heartbreaker 20
# najbardziej polecana bierze się z podobieństwa do słuchanych piosenek:
similar_songs_df %>%
   filter(ArtTrack==as.character(polecane_songs_5[1,1])) %>%
   select(Song, Match) %>%
   arrange(desc(Match))
Song Match
Kombajn Do Zbierania Kur Po Wioskach - Waniliowe niebo 0.96
Kombajn Do Zbierania Kur Po Wioskach - Don’t drive so fast 0.94
# dodaj linki do klipów na YouTube - tylko pierwszy wynik wyszukiwania!
polecane_songs_5$YT_link <- "https://www.youtube.com/"

for(i in 1:n_polecane_songs_5) {
   yt_search_str <- gsub(" ", "%20", as.character(polecane_songs_5[i,1]))
   yt_search_str <- gsub("'", "%27",yt_search_str)
   yt_search_str <- gsub("&", "%26",yt_search_str)
   link_url <- read_html(paste0("https://www.youtube.com/results?search_query=", yt_search_str, "&sp=EgIQAQ%253D%253D")) %>%
       html_node("#results") %>%
       html_node("div.yt-lockup") %>%
       html_node("h3.yt-lockup-title") %>%
       html_node("a") %>%
       html_attr("href")
   polecane_songs_5[i, 3] <- paste0("http://youtube.com", link_url)
}

# tabela 50 najbardziej polecanych piosenek
LP Wykonawca_Piosenka Prawdopodobienstwo YouTube
1 Kombajn Do Zbierania Kur Po Wioskach - Prezent 38.0 http://youtube.com/watch?v=L1agdRONzTc
2 Deep Purple - Bloodsucker 20.0 http://youtube.com/watch?v=6LGtYLpUs4w
3 Deep Purple - Strange Kind of Woman 20.0 http://youtube.com/watch?v=bAzjVdD06z8
4 Kombajn Do Zbierania Kur Po Wioskach - Białe kwity 20.0 http://youtube.com/watch?v=2rOACRkTYmA
5 Kombajn Do Zbierania Kur Po Wioskach - Niemiecki krasnal 20.0 http://youtube.com/watch?v=T9FGV0y8HrI
6 Led Zeppelin - Heartbreaker 20.0 http://youtube.com/watch?v=_xvTmpc4eX4
7 Led Zeppelin - The Lemon Song 20.0 http://youtube.com/watch?v=Zyhu2ysqKGk
8 Leonard Cohen - Suzanne 20.0 http://youtube.com/watch?v=ZX0CfFdk-jw
9 Marek Grechuta - Nie dokazuj 20.0 http://youtube.com/watch?v=F6J_JROaIxs
10 Marek Grechuta - Niepewność 20.0 http://youtube.com/watch?v=krksWron54w
11 Marek Grechuta - Tango Anawa 20.0 http://youtube.com/watch?v=QCU33C6RHPk
12 Marek Grechuta - Zagadki 20.0 http://youtube.com/watch?v=sgTcRaIYs7w
13 The Stooges - Not Right 20.0 http://youtube.com/watch?v=JcFG_mr4dwQ
14 Marek Grechuta - W dzikie wino zaplątani 20.0 http://youtube.com/watch?v=iw1SwzyWGvo
15 Kombajn Do Zbierania Kur Po Wioskach - 8 dzień tygodnia 19.9 http://youtube.com/watch?v=5w2U4h9yCA0
16 Deep Purple - Flight of the Rat 19.5 http://youtube.com/watch?v=XxNYOcNnmGI
17 The Stooges - Real Cool Time 19.5 http://youtube.com/watch?v=oBF6tJGmZcc
18 Led Zeppelin - Thank You 19.2 http://youtube.com/watch?v=u1z4vkPWkLQ
19 Marek Grechuta - Wesele 18.9 http://youtube.com/watch?v=7GOliQS-_dg
20 Leonard Cohen - Samson in New Orleans 18.6 http://youtube.com/watch?v=QMQtvOwkT6w
21 Led Zeppelin - Ramble On 18.6 http://youtube.com/watch?v=a3HemKGDavw
22 Black Sabbath - Paranoid 17.7 http://youtube.com/watch?v=cNdB5-A9O7g
23 Marek Grechuta - Z Głębiny Nocy Niepojętej 16.7 http://youtube.com/watch?v=_4dEtz7JWX4
24 Uriah Heep - Easy Livin’ 14.7 http://youtube.com/watch?v=DKxZY0DIxIk
25 Cream - Sunshine of Your Love 14.1 http://youtube.com/watch?v=zt51rITH3EA
26 Aerosmith - Walk This Way 13.3 http://youtube.com/watch?v=pL4uESRCnv8
27 AC/DC - Back in Black 13.0 http://youtube.com/watch?v=pAgnJDJN4VA
28 Free - All Right Now 12.2 http://youtube.com/watch?v=siMFORx8uO8
29 Nazareth - Hair of the Dog 12.2 http://youtube.com/watch?v=kyXz6eMCj2k
30 Guns N’ Roses - Welcome To The Jungle 12.2 http://youtube.com/watch?v=o1tj2zJ2Wvg
31 Rainbow - Kill the King 12.1 http://youtube.com/watch?v=83qBRmM00R4
32 Jethro Tull - Aqualung 12.0 http://youtube.com/watch?v=wUEA5NWlQU0
33 Dire Straits - Sultans of Swing 11.8 http://youtube.com/watch?v=h0ffIJ7ZO4U
34 UFO - Doctor Doctor 11.7 http://youtube.com/watch?v=TDRHuVqO1dE
35 Czesław Niemen - Wspomnienie 11.4 http://youtube.com/watch?v=gYJix_D1qjM
36 Van Halen - Ain’t Talkin’ ’Bout Love 11.0 http://youtube.com/watch?v=SuyvT8nFMLY
37 Boston - More Than a Feeling 10.9 http://youtube.com/watch?v=SSR6ZzjDZ94
38 ZZ Top - La Grange 10.9 http://youtube.com/watch?v=Vppbdf-qtGU
39 Bob Dylan - Like a Rolling Stone 10.9 http://youtube.com/watch?v=dxLMr784l0Q
40 Steppenwolf - Born to Be Wild 10.8 http://youtube.com/watch?v=rMbATaj7Il8
41 Cream - White Room 10.6 http://youtube.com/watch?v=pkae0-TgrRU
42 Blue Öyster Cult - (Don’t Fear) The Reaper 10.6 http://youtube.com/watch?v=ClQcUyhoxTg
43 Foghat - Slow Ride 10.4 http://youtube.com/watch?v=GcCNcgoyG_0
44 Scorpions - Rock You Like a Hurricane 10.4 http://youtube.com/watch?v=6yP1tcy9a10
45 Marek Grechuta - Gdzieś w nas 10.4 http://youtube.com/watch?v=f1lgLdRhGnA
46 Blue Öyster Cult - Godzilla 10.3 http://youtube.com/watch?v=T65rW_SIzg0
47 AC/DC - Highway To Hell 10.1 http://youtube.com/watch?v=gEPmA3USJdI
48 Dire Straits - Money for Nothing 10.1 http://youtube.com/watch?v=wTP2RUD_cL0
49 Ted Nugent - Stranglehold 9.9 http://youtube.com/watch?v=0c3d7QgZr7g