Remove bongo music player
@@ -8,7 +8,7 @@
|
|||||||
("67e998c3c23fe24ed0fb92b9de75011b92f35d3e89344157ae0d544d50a63a72" default)))
|
("67e998c3c23fe24ed0fb92b9de75011b92f35d3e89344157ae0d544d50a63a72" default)))
|
||||||
'(package-selected-packages
|
'(package-selected-packages
|
||||||
(quote
|
(quote
|
||||||
(bongo org-ref json-mode cargo racer ess-smart-underscore company-tern auto-complete markdown-mode xref-js2 js2-refactor js2-mode writeroom-mode weechat counsel ivy-bibtex org-bullets paredit zenburn-theme slime rust-mode racket-mode polymode org lua-mode haskell-mode geiser ergoemacs-mode djvu auctex)))
|
(org-ref json-mode cargo racer ess-smart-underscore company-tern auto-complete markdown-mode xref-js2 js2-refactor js2-mode writeroom-mode weechat counsel ivy-bibtex org-bullets paredit zenburn-theme slime rust-mode racket-mode polymode org lua-mode haskell-mode geiser ergoemacs-mode djvu auctex)))
|
||||||
'(tramp-syntax (quote default) nil (tramp)))
|
'(tramp-syntax (quote default) nil (tramp)))
|
||||||
(custom-set-faces
|
(custom-set-faces
|
||||||
;; custom-set-faces was added by Custom.
|
;; custom-set-faces was added by Custom.
|
||||||
|
|||||||
@@ -1,83 +0,0 @@
|
|||||||
;;; bongo-autoloads.el --- automatically extracted autoloads
|
|
||||||
;;
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(add-to-list 'load-path (directory-file-name
|
|
||||||
(or (file-name-directory #$) (car load-path))))
|
|
||||||
|
|
||||||
|
|
||||||
;;;### (autoloads nil "bongo" "bongo.el" (0 0 0 0))
|
|
||||||
;;; Generated autoloads from bongo.el
|
|
||||||
|
|
||||||
(autoload 'bongo-start "bongo" "\
|
|
||||||
Start playing the current track in the nearest playlist buffer.
|
|
||||||
If there is no current track, perform the action appropriate for the current
|
|
||||||
playback mode (for example, for regressive playback, play the last track).
|
|
||||||
However, if something is already playing, do nothing.
|
|
||||||
When called interactively and the current track is a stop action track,
|
|
||||||
continue playback as if the action track had finished playing.
|
|
||||||
CALLED-INTERACTIVELY-P is non-nil when called interactively.
|
|
||||||
|
|
||||||
\(fn &optional CALLED-INTERACTIVELY-P)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo-start/stop "bongo" "\
|
|
||||||
Start or stop playback in the nearest Bongo playlist buffer.
|
|
||||||
With prefix ARGUMENT, call `bongo-stop' even if already stopped.
|
|
||||||
CALLED-INTERACTIVELY-P is non-nil when called interactively.
|
|
||||||
|
|
||||||
\(fn &optional ARGUMENT CALLED-INTERACTIVELY-P)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo-show "bongo" "\
|
|
||||||
Display what Bongo is playing in the minibuffer.
|
|
||||||
If INSERT-FLAG (prefix argument if interactive) is non-nil,
|
|
||||||
insert the description at point.
|
|
||||||
Return the description string.
|
|
||||||
|
|
||||||
\(fn &optional INSERT-FLAG)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo-playlist "bongo" "\
|
|
||||||
Switch to a Bongo playlist buffer.
|
|
||||||
See the function `bongo-playlist-buffer'.
|
|
||||||
|
|
||||||
\(fn)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo-library "bongo" "\
|
|
||||||
Switch to a Bongo library buffer.
|
|
||||||
See the function `bongo-library-buffer'.
|
|
||||||
|
|
||||||
\(fn)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo-switch-buffers "bongo" "\
|
|
||||||
In Bongo, switch from a playlist to a library, or vice versa.
|
|
||||||
With prefix argument PROMPT, prompt for the buffer to switch to.
|
|
||||||
|
|
||||||
\(fn &optional PROMPT)" t nil)
|
|
||||||
|
|
||||||
(autoload 'bongo "bongo" "\
|
|
||||||
Switch to a Bongo buffer.
|
|
||||||
See the function `bongo-buffer'.
|
|
||||||
|
|
||||||
\(fn)" t nil)
|
|
||||||
|
|
||||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "bongo" '("bongo-" "afplay" "mikmod" "timidity" "speexdec" "ogg123" "vlc" "define-bongo-backend" "with-")))
|
|
||||||
|
|
||||||
;;;***
|
|
||||||
|
|
||||||
;;;### (autoloads nil "lastfm-submit" "lastfm-submit.el" (0 0 0 0))
|
|
||||||
;;; Generated autoloads from lastfm-submit.el
|
|
||||||
|
|
||||||
(if (fboundp 'register-definition-prefixes) (register-definition-prefixes "lastfm-submit" '("lastfm")))
|
|
||||||
|
|
||||||
;;;***
|
|
||||||
|
|
||||||
;;;### (autoloads nil nil ("bongo-pkg.el") (0 0 0 0))
|
|
||||||
|
|
||||||
;;;***
|
|
||||||
|
|
||||||
;; Local Variables:
|
|
||||||
;; version-control: never
|
|
||||||
;; no-byte-compile: t
|
|
||||||
;; no-update-autoloads: t
|
|
||||||
;; coding: utf-8
|
|
||||||
;; End:
|
|
||||||
;;; bongo-autoloads.el ends here
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
(define-package "bongo" "20171118.1842" "play music with Emacs"
|
|
||||||
'((cl-lib "0.5")
|
|
||||||
(emacs "24.1")))
|
|
||||||
;; Local Variables:
|
|
||||||
;; no-byte-compile: t
|
|
||||||
;; End:
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
This is the file .../info/dir, which contains the
|
|
||||||
topmost node of the Info hierarchy, called (dir)Top.
|
|
||||||
The first time you invoke Info you start off looking at this node.
|
|
||||||
|
|
||||||
File: dir, Node: Top This is the top of the INFO tree
|
|
||||||
|
|
||||||
This (the Directory node) gives a menu of major topics.
|
|
||||||
Typing "q" exits, "?" lists all Info commands, "d" returns here,
|
|
||||||
"h" gives a primer for first-timers,
|
|
||||||
"mEmacs<Return>" visits the Emacs manual, etc.
|
|
||||||
|
|
||||||
In Emacs, you can click mouse button 2 on a menu item or cross reference
|
|
||||||
to select it.
|
|
||||||
|
|
||||||
* Menu:
|
|
||||||
|
|
||||||
Emacs
|
|
||||||
* Bongo: (bongo). Play music with Emacs.
|
|
||||||
|
Before Width: | Height: | Size: 488 B |
|
Before Width: | Height: | Size: 772 B |
|
Before Width: | Height: | Size: 359 B |
|
Before Width: | Height: | Size: 448 B |
|
Before Width: | Height: | Size: 544 B |
|
Before Width: | Height: | Size: 603 B |
|
Before Width: | Height: | Size: 290 B |
|
Before Width: | Height: | Size: 335 B |
|
Before Width: | Height: | Size: 826 B |
@@ -1,75 +0,0 @@
|
|||||||
;;; lastfm-submit.el --- submit information to Last.fm
|
|
||||||
;; Copyright (C) 2006 Daniel Brockman <daniel@brockman.se>
|
|
||||||
|
|
||||||
;; This file is free software; you can redistribute it and/or
|
|
||||||
;; modify it under the terms of the GNU General Public License as
|
|
||||||
;; published by the Free Software Foundation; either version 2 of
|
|
||||||
;; the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
;; This file is distributed in the hope that it will be useful,
|
|
||||||
;; but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
||||||
;; of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
;; See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
;; You should have received a copy of the GNU General Public
|
|
||||||
;; License along with GNU Emacs; if not, write to the Free
|
|
||||||
;; Software Foundation, 51 Franklin Street, Fifth Floor,
|
|
||||||
;; Boston, MA 02110-1301, USA.
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
|
|
||||||
;; This is a thin frontend to the `lastfmsumbit' tool,
|
|
||||||
;; which is included in the `lastfmsubmitd' distribution,
|
|
||||||
;; available at the following URL:
|
|
||||||
|
|
||||||
;; <http://www.red-bean.com/~decklin/software/lastfmsubmitd/>
|
|
||||||
|
|
||||||
;; Please note that you may have to be in the `lastfm' group
|
|
||||||
;; to run the `lastfmsubmit' program, and that you may have
|
|
||||||
;; to relogin for such a group change to take effect.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(defcustom lastfmsubmit-program-name
|
|
||||||
(or (executable-find "lastfmsubmit")
|
|
||||||
;; Debian puts it here.
|
|
||||||
(executable-find "/usr/lib/lastfmsubmitd/lastfmsubmit"))
|
|
||||||
"The name of the `lastfmsubmit' executable.
|
|
||||||
Note that you may have to be in the `lastfm' group to run this program,
|
|
||||||
and that adding yourself to a group normally requires that you re-login."
|
|
||||||
:type 'string
|
|
||||||
:group 'multimedia
|
|
||||||
:group 'external)
|
|
||||||
|
|
||||||
(defun lastfm-submit (artist title length &optional album mbid time)
|
|
||||||
"Submit TITLE by ARTIST to Last.fm using the `lastfmsubmit' tool.
|
|
||||||
ARTIST is the name of the artist and TITLE is the name of the track.
|
|
||||||
LENGTH is the length of the track, either as a number of seconds
|
|
||||||
or formatted as \"HOURS:MINUTES:SECONDS\" (HOURS may be omitted).
|
|
||||||
ALBUM is either nil or the name of the album on which the track appears.
|
|
||||||
MBID is either nil or the MusicBrainz ID of the track.
|
|
||||||
TIME is either nil or the time at which the track was played, formatted
|
|
||||||
in UTC as \"%Y-%m-%d %H:%M:%S\" (see `format-time-string').
|
|
||||||
See also `lastfmsubmit-program-name'."
|
|
||||||
(when (numberp length)
|
|
||||||
(setq length (number-to-string (round length))))
|
|
||||||
(unless (string-match "^\\(\\([0-9]+:\\)?[0-9]+:\\)?[0-9]+$" length)
|
|
||||||
(error "Badly formed track length: %s" length))
|
|
||||||
(with-temp-buffer
|
|
||||||
(let ((status (apply 'call-process lastfmsubmit-program-name nil t nil
|
|
||||||
"--artist" artist "--title" title "--length" length
|
|
||||||
(append (when album (list "--album" album))
|
|
||||||
(when mbid (list "--mbid" mbid))))))
|
|
||||||
(unless (equal status 0)
|
|
||||||
(with-output-to-temp-buffer "*lastfmsumbit*"
|
|
||||||
(princ (buffer-string)))
|
|
||||||
(if (integerp status)
|
|
||||||
(error "lastfmsubmit failed with exit code %s" status)
|
|
||||||
(error "lastfmsubmit failed: %s" status))))))
|
|
||||||
|
|
||||||
;;; Local Variables:
|
|
||||||
;;; coding: utf-8
|
|
||||||
;;; End:
|
|
||||||
|
|
||||||
(provide 'lastfm-submit)
|
|
||||||
;;; lastfm-submit.el ends here.
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
#!/usr/bin/env ruby
|
|
||||||
## tree-from-tags.rb --- create file hierarchies from media tags
|
|
||||||
# Copyright (C) 2006, 2007 Daniel Brockman
|
|
||||||
|
|
||||||
# Author: Daniel Brockman <daniel@brockman.se>
|
|
||||||
# Created: April 24, 2006
|
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or
|
|
||||||
# modify it under the terms of the GNU General Public License as
|
|
||||||
# published by the Free Software Foundation; either version 2 of
|
|
||||||
# the License, or (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This file is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
||||||
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
# See the GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public
|
|
||||||
# License along with GNU Emacs; if not, write to the Free
|
|
||||||
# Software Foundation, 51 Franklin Street, Fifth Floor,
|
|
||||||
# Boston, MA 02110-1301, USA.
|
|
||||||
#
|
|
||||||
# To run this program, you need Ruby-taglib, available at
|
|
||||||
# <https://robinst.github.io/taglib-ruby/>.
|
|
||||||
|
|
||||||
require "fileutils"
|
|
||||||
require "find"
|
|
||||||
require "taglib"
|
|
||||||
|
|
||||||
if ARGV.empty? or ["-?", "-h", "-help", "--help"].include? ARGV.first
|
|
||||||
puts "Usage: #$0 [--hardlinks] DIRECTORIES..."
|
|
||||||
puts "
|
|
||||||
This program recursively scans DIRECTORIES for media files in formats
|
|
||||||
that support embedded file tags, such as Ogg and MP3.
|
|
||||||
|
|
||||||
For each file with sufficient embedded information, it creates a symlink
|
|
||||||
in the current directory, or in a subdirectory of the current directory,
|
|
||||||
pointing to the original file.
|
|
||||||
|
|
||||||
If given the `--hardlinks' option, it creates hardlinks instead.
|
|
||||||
|
|
||||||
The symlinks or hardlinks created by this program follow a certain
|
|
||||||
naming scheme that is understood by Bongo, the Emacs media player."
|
|
||||||
exit
|
|
||||||
end
|
|
||||||
|
|
||||||
if ["--hard", "--hardlink", "--hardlinks"].include? ARGV.first
|
|
||||||
ARGV.shift
|
|
||||||
$hardlinks = true
|
|
||||||
else
|
|
||||||
$hardlinks = false
|
|
||||||
end
|
|
||||||
|
|
||||||
class NotEnoughData < RuntimeError ; end
|
|
||||||
|
|
||||||
class String
|
|
||||||
def blank? ; !self[/\S/] end
|
|
||||||
def trim ; sub(/^\s+|\s+$/, "") end
|
|
||||||
end
|
|
||||||
|
|
||||||
def escape_component (component)
|
|
||||||
case component
|
|
||||||
when "." then "Dot"
|
|
||||||
when ".." then "Double Dot"
|
|
||||||
else component.gsub(" - ", " -- ").gsub("/", "\\")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def join_components (*components)
|
|
||||||
components.compact * " - "
|
|
||||||
end
|
|
||||||
|
|
||||||
def parse_data (data)
|
|
||||||
an = data[:artist_name]
|
|
||||||
ay = data[:album_year]
|
|
||||||
at = data[:album_title]
|
|
||||||
ti = data[:track_index]
|
|
||||||
tt = data[:track_title]
|
|
||||||
|
|
||||||
ay = nil if ay == "0"
|
|
||||||
|
|
||||||
case
|
|
||||||
when an && ay && at && ti && tt
|
|
||||||
components = [[an], [ay, at], [ti, tt]]
|
|
||||||
when an && ay && at && tt
|
|
||||||
components = [[an], [ay, at], [tt]]
|
|
||||||
when an && at && ti && tt
|
|
||||||
components = [[an], [at], [ti, tt]]
|
|
||||||
when an && at && tt
|
|
||||||
components = [[an], [at], [tt]]
|
|
||||||
when an && tt
|
|
||||||
components = [[an], [tt]]
|
|
||||||
when tt
|
|
||||||
components = [[tt]]
|
|
||||||
else raise NotEnoughData
|
|
||||||
end
|
|
||||||
|
|
||||||
return components.map { |x| x.map { |x| escape_component(x) } }
|
|
||||||
end
|
|
||||||
|
|
||||||
COLUMNS = ENV["COLUMNS"] || 80
|
|
||||||
|
|
||||||
def singleton (&body)
|
|
||||||
object = Object.new
|
|
||||||
object.extend(Module.new(&body))
|
|
||||||
object.send :initialize
|
|
||||||
return object
|
|
||||||
end
|
|
||||||
|
|
||||||
status_line = singleton do
|
|
||||||
attr_reader :width
|
|
||||||
def initialize
|
|
||||||
@width = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def remaining_width
|
|
||||||
COLUMNS - @width
|
|
||||||
end
|
|
||||||
|
|
||||||
def clear
|
|
||||||
print "\b" * COLUMNS
|
|
||||||
print " " * COLUMNS
|
|
||||||
print "\b" * COLUMNS
|
|
||||||
@width = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
|
||||||
clear ; yield ; flush
|
|
||||||
end
|
|
||||||
|
|
||||||
def flush
|
|
||||||
$stdout.flush
|
|
||||||
end
|
|
||||||
|
|
||||||
def << string
|
|
||||||
count = [remaining_width, string.size].min
|
|
||||||
print string[0 ... count]
|
|
||||||
@width += count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
n_total_files = 0
|
|
||||||
print "Counting files..." ; $stdout.flush
|
|
||||||
Find.find(*ARGV) { |x| n_total_files += 1 if FileTest.file? x }
|
|
||||||
puts " #{n_total_files}."
|
|
||||||
|
|
||||||
def warn_skip (file_name, message)
|
|
||||||
puts "Warning: Skipping file `#{file_name}': #{message}"
|
|
||||||
end
|
|
||||||
|
|
||||||
n_completed_files = 0 # This counts all files.
|
|
||||||
n_processed_files = 0 # This only counts recognized files.
|
|
||||||
n_created_links = 0
|
|
||||||
Find.find *ARGV do |file_name|
|
|
||||||
if FileTest.directory? file_name
|
|
||||||
status_line.update do
|
|
||||||
percent_done = n_completed_files * 100.0 / n_total_files
|
|
||||||
status_line << "[%.2f%%] " % percent_done
|
|
||||||
count = status_line.remaining_width - "Processing `'...".size
|
|
||||||
if file_name.size > count
|
|
||||||
file_name_tail = "[...]" + file_name[-count + 5 .. -1]
|
|
||||||
else
|
|
||||||
file_name_tail = file_name
|
|
||||||
end
|
|
||||||
status_line << "Processing `#{file_name_tail}'..."
|
|
||||||
end
|
|
||||||
elsif FileTest.file? file_name
|
|
||||||
next if [".jpg", ".jpeg", ".png", ".gif"].include? \
|
|
||||||
File.extname(file_name).downcase
|
|
||||||
begin
|
|
||||||
|
|
||||||
TagLib::FileRef.open(file_name) do |file|
|
|
||||||
n_processed_files += 1
|
|
||||||
unless file.null?
|
|
||||||
tag = file.tag
|
|
||||||
data = { :artist_name => tag.artist,
|
|
||||||
:album_year => tag.year.to_s,
|
|
||||||
:album_title => tag.album,
|
|
||||||
:track_index => "#{0 if tag.track < 10}#{tag.track}",
|
|
||||||
:track_title => tag.title }
|
|
||||||
|
|
||||||
for key, value in data do
|
|
||||||
if (value.nil? or value.blank?)
|
|
||||||
data.delete key
|
|
||||||
else
|
|
||||||
data[key] = value.trim
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
components = parse_data(data).map { |x| join_components(*x) }.
|
|
||||||
inject([]) { |a, x| a << join_components(a.last, x) }
|
|
||||||
|
|
||||||
dir_name = components[0...-1] * "/"
|
|
||||||
new_file_name = components * "/" + File.extname(file_name)
|
|
||||||
|
|
||||||
FileUtils.mkdir_p(dir_name) if components.length > 1
|
|
||||||
|
|
||||||
begin
|
|
||||||
if $hardlinks
|
|
||||||
FileUtils.ln(file_name, new_file_name)
|
|
||||||
else
|
|
||||||
FileUtils.ln_s(file_name, new_file_name)
|
|
||||||
end
|
|
||||||
n_created_links += 1
|
|
||||||
rescue Errno::EEXIST
|
|
||||||
if $hardlinks
|
|
||||||
raise unless File.stat(file_name).ino ==
|
|
||||||
File.stat(new_file_name).ino
|
|
||||||
else
|
|
||||||
raise unless FileTest.symlink? new_file_name and
|
|
||||||
File.readlink(new_file_name) == file_name
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
rescue NotEnoughData
|
|
||||||
puts ; warn_skip file_name, "Not enough track data " +
|
|
||||||
"(need at least the track title)."
|
|
||||||
rescue Errno::EEXIST
|
|
||||||
puts ; warn_skip file_name,
|
|
||||||
"Cannot create #{$hardlinks ? "hardlink" : "symbolic link"}: " +
|
|
||||||
"Conflicting file already exists. [original error: #$!]"
|
|
||||||
rescue Interrupt
|
|
||||||
puts ; puts "Interrupted." ; exit(1)
|
|
||||||
rescue Exception
|
|
||||||
puts ; raise
|
|
||||||
end
|
|
||||||
|
|
||||||
n_completed_files += 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
status_line.update do
|
|
||||||
status_line << "[100%] Processing `#{ARGV.last}'..."
|
|
||||||
end
|
|
||||||
|
|
||||||
puts ; puts "Processed #{n_processed_files} media files " +
|
|
||||||
"(created #{n_created_links} " +
|
|
||||||
"#{$hardlinks ? "hardlinks" : "symbolic links"})."
|
|
||||||