diff --git a/assets/css/styles.css b/assets/css/styles.css index ea28095..30a2da9 100644 --- a/assets/css/styles.css +++ b/assets/css/styles.css @@ -75,6 +75,25 @@ pre { min-width: calc(100% - 20px); } +.lastfm-container { + text-align: center; +} + +.lastfm-text { + font-weight: bold; + color: purple; + animation: scalePulse 2s infinite ease-in-out; +} + +@keyframes scalePulse { + 0%, 100% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } +} + @media (max-width: 800px) { header, footer, main { flex: 1 100%; diff --git a/main.go b/main.go index d5ca808..6282c84 100644 --- a/main.go +++ b/main.go @@ -59,6 +59,11 @@ func setupRoutes(app *models.App) *http.ServeMux { router.Handle(postLink, m(controllers_pages.PostPageHandler(app))) } + // Api + { + router.Handle("/api/lastfm", m(controllers.LastfmHandler(app))) + } + return router } diff --git a/mvc/controllers/lastfm.go b/mvc/controllers/lastfm.go new file mode 100644 index 0000000..e0651c8 --- /dev/null +++ b/mvc/controllers/lastfm.go @@ -0,0 +1,31 @@ +package controllers + +import ( + "fmt" + "log" + "main/mvc/models" + "net/http" +) + +// Обработчик главной страницы +func LastfmHandler(app *models.App) http.HandlerFunc { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var err error + + resp, err := models.GetRecentTracks("s3rr", "bc5ce9ff9289ac925841cf483e211fc1") + if err != nil { + log.Println(err) + } + + data := fmt.Sprintf("%s - %s", resp.RecentTracks.Track[0].Name, resp.RecentTracks.Track[0].Artist.Name) + + sendLastfm(w, data) + }) +} + +// Отправляет страницу +func sendLastfm(w http.ResponseWriter, data string) { + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusOK) + fmt.Fprint(w, data) +} diff --git a/mvc/models/lastfm.go b/mvc/models/lastfm.go new file mode 100644 index 0000000..44aed6b --- /dev/null +++ b/mvc/models/lastfm.go @@ -0,0 +1,44 @@ +package models + +import ( + "encoding/json" + "fmt" + "io" + "net/http" +) + +type LastFMResponse struct { + RecentTracks struct { + Track []struct { + Name string `json:"name"` + Artist struct { + Name string `json:"#text"` + } `json:"artist"` + Album struct { + Name string `json:"#text"` + } `json:"album"` + Date struct { + Unix string `json:"#text"` + } `json:"date"` + } `json:"track"` + } `json:"recenttracks"` +} + +func GetRecentTracks(username, apiKey string) (*LastFMResponse, error) { + url := fmt.Sprintf("https://ws.audioscrobbler.com/2.0/?method=user.getrecenttracks&user=%s&api_key=%s&format=json", username, apiKey) + resp, err := http.Get(url) + if err != nil { + return nil, fmt.Errorf("lastfm get resp err: %v", err) + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("lastfm read resp body err: %v", err) + } + var lastFMResponse LastFMResponse + if err := json.Unmarshal(body, &lastFMResponse); err != nil { + return nil, fmt.Errorf("lastfm unmarshal err: %v", err) + } + + return &lastFMResponse, nil +} diff --git a/mvc/views/blocks/header.gohtml b/mvc/views/blocks/header.gohtml index 13acf1c..9dedee4 100644 --- a/mvc/views/blocks/header.gohtml +++ b/mvc/views/blocks/header.gohtml @@ -3,6 +3,13 @@
+
+

+ 🎵 last played track: + waiting for a response from lastfm... + 🎵 +

+

contacts @@ -22,5 +29,22 @@ and also you can subscribe to my telegram channel with pictures!

+ + {{ end }} \ No newline at end of file