Playlist de Favoritos

18 de April, 2022

La última vez comencé una biblioteca llamado Racket y hoy lo he extendido para que pueda manejar un playlist simple de favoritos. El playlist se almacena en un formato llamado m3u (la única razón que elegí este es porque es el menos complicado que utiliza VLC). Es tan simple como esto:

#EXTM3U
file:///nombre/del/archivo/1.ogg
file:///nombre/del/archivo/2.wav

Para comenzar definí un variable personalizable llamado racket-favourites-playlist que describe el nombre del archivo del playlist:

(defcustom racket-favourites-playlist "~/Music/playlists/Favourites.m3u"
  "File path where favourites playlist is stored."
  :type 'string
  :group 'racket)

A continuación añadí unos funciones simples para tocar este playlist en EMMS:

(defun racket-add-favourites ()
  "Add favourites playlist"
  (interactive)
  (emms-add-playlist-file racket-favourites-playlist))

(defun racket-play-favourites ()
  "Play favourites playlist"
  (interactive)
  (emms-play-playlist-file racket-favourites-playlist))

Ahora viene la parte divertida: añadir la pista que se está tocando en este momento al playlist, para que pueda añadirlo fácilmente con una combinación de teclas en cualquier momento. Para encontrar el nombre del archivo de la pista actual, puedo utilizar la función con un nombre kilométrico emms-score-current-selected-track-filename. La función que creé evida hacer ningún cambio si la pista ya se encuetra en el playlist, y añade un newline al final del archivo si falta.

(defun racket-add-track-to-favourites ()
  "Add current track to favourites"
  (interactive)
  (let ((line (concat "file://" (emms-score-current-selected-track-filename))))
    (with-current-buffer (or (get-file-buffer racket-favourites-playlist)
                             (find-file-noselect racket-favourites-playlist))
      (save-excursion
        (beginning-of-buffer)
        (if (search-forward-regexp
              (concat "^" (regexp-quote line) "$")
            nil t)
          ;; Don’t do anything if the track is already added
          (message "The track is already inside the playlist.")
          ;; Add to playlist
          (progn 
            (end-of-buffer)
            (unless (eq ?\C-j (char-before))
              (insert "\n"))
            (insert line "\n")
            (save-buffer)
            (message "Track added to playlist.")))))))

También creé dos funciones más: uno para eliminar la pista actual de los favoritos y otro para abrir el archivo para que pueda reordenarlo fácilmente. Puedes encontrar el código completo para Racket aquí. Finalmente, creé una combinación de teclas para cada una de estas funciones, debajo de C-SPC r (C-SPC es donde defino todos mis combinaciones personalizadas, y el r es para Racket). Puedes encontrar el código para eso aquí.