;; Copyright 2023 FoAM
;;
-;; Author: nik gaffney <nik@fo.am>
+;; Author: nik gaffney <nik@fo.am>, Frederik Vanrenterghem <frederik@vanrenterghem.biz>
;; Created: 2023-05-05
-;; Version: 0.1
+;; Updated: 2025-01-25
+;; Version: 0.2fv
;; Package-Requires: ((emacs "27.1") (request "0.3"))
;; Keywords: music, scrobbling, multimedia
;; URL: https://github.com/zzkt/listenbrainz
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Listens for user: %s" username)))))))
+ (message "Listens for user: %s\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-listens response))))
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "User playing now: %s" username)))))))
+ (message "User playing now: %s\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-playing response))))
;; - https://listenbrainz.readthedocs.io/en/production/dev/api-usage/#submitting-listens
;; - https://listenbrainz.readthedocs.io/en/production/dev/json/#json-doc
-(defun listenbrainz-submit-listen (type artist track &optional release)
+(defun listenbrainz-submit-listen (type artist track &optional release timestamp)
"Submit listening data to ListenBrainz.
- listen TYPE (string) either \='single\=', \='import\=' or \='playing_now\='
- ARTIST name (string)
- TRACK title (string)
-- RELEASE title (string) also album title."
+- RELEASE title (string) also album title.
+- TIMESTAMP time (time) track was listened to"
(message "listenbrainz: submitting %s - %s - %s" artist track release)
(let* ((json-null "")
(now (listenbrainz-timestamp))
(remove nil
(list
(when (string= type "single") (cons "listened_at" now))
+ (when (string= type "import") (cons "listened_at" (listenbrainz-timestamp timestamp)))
(list "track_metadata"
(cons "artist_name" artist)
(cons "track_name" track)
"Submit data for track (ARTIST TRACK and optional RELEASE) playing now."
(listenbrainz-submit-listen "playing_now" artist track (when release release)))
+;;;###autoload
+(defun listenbrainz-submit-historic-listen (artist track timestamp &optional release)
+ "Submit data for track (ARTIST TRACK and optional RELEASE) heard at TIMESTAMP."
+ (listenbrainz-submit-listen "import" artist track (if release release "") timestamp))
;;; ;; ;; ; ; ; ; ; ;
;;
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Top recordings for user: %s" username)))))))
+ (message "Top recordings for user: %s\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-stats-2 response))))
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Top releases for user: %s" username)))))))
+ (message "Top releases for user: %s\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-stats-0 response))))
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Top artists for user: %s" username)))))))
+ (message "Top artists for user: %s\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-stats-1 response))))
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Followers for %s" username)))))))
+ (message "Followers for %s\n%s" username
+ (if data data ""))))))))
(if (string= "graph" output)
- (princ (listenbrainz--format-followers-graph response))
- (princ (listenbrainz--format-followers-list response)))))
+ (princ (listenbrainz--format-followers-graph response))
+ (princ (listenbrainz--format-followers-list response)))))
;;;###autoload
(defun listenbrainz-following (username)
:sync t
:success (cl-function
(lambda (&key data &allow-other-keys)
- (message "Users %s is following" username)))))))
+ (message "Users %s is following\n%s" username
+ (if data data ""))))))))
(princ (listenbrainz--format-following response))))