LPD For Fun and MP3 Playing
poop writes "Most true Unix geeks will recognize just how nice LPD is as a distributed queueing mechanism for managing all jobs sent to the printer. But, what most people don't realize is that LPD can be used for other things too. In fact, it can be viewed as a general queueing mechanism with a few added bells and whistles for printers. So let's examine a more interesting use of LPD, an engine for distributed spooling of MP3s." Bruha points out this mirror.
How could you read it...slashdotted already.
Is this a conspiracy to sign people up?
In Soviet Russia, Nigel makes plans for you!
How do I suppress the printing of the CD artwork that occurs between each "print" job?
this has been getting a lot of coverage this week (article on deadly, some canadian newspaper, and now here). they did it at the obsd hackathon last year, and again this year.
lpd is quite cool. i've used it to queue software builds on remote machines where we aren't given ssh accounts. it's pretty slick.
vodka, straight up, thank you!
The real beauty of this would be if he had written a "print" driver that would allow a remote PC running windows to queue up a song thus utilizing lpd to be a "music" server rather then just an mp3 player hack.
I don't normally do this, but as the site seems to be almost dead within the first three posts, I've duplicated the article content in this post.
/etc/printcap on my redhat 7.3 system (no sound card on the openBSD firewall) it is /etc/printcap.local. You'll want to paste the following snipped of code in there:
:lp=/dev/null:\ :sd=/var/spool/lpd/audio:\ :if=/usr/local/bin/audiofilter:\ :af=/var/log/audio-acct:\ :lf=/var/log/audio-errs:\ :sh
:lp=/dev/null: - we're not hooking this up to a physical device in the normal sense :if=/usr/local/bin/audiofilter: - this is the input filter. I'll show how to create it later. :af=/var/log/audio-acct: - this is the accounting file. You could do some fun stuff with this to monitor who uses the queue the most and what not. :lf=/var/log/audio-errs: - this is the file that errors will be logged to. Well, some errors; not all errors will end up here. :sh - tells it to supress any header information that would normally be sent. This is important or you may get junk before every file which causes audiofilter to fail.
/usr/local/bin/audiofilter:
;; ;; ;;
-- article --
May 23, 2003
LPD for fun and MP3 playing
Background
Most true Unix geeks will recognize just how nice LPD is as a distributed queueing mechanism for managing all jobs sent to the printer. It has a beautiful simplicity to it, and some mean power to go along with it. It's a difficult beast to tame, but once you understand it, everything will start coming out exactly like you want it.
But, what most people don't realize is that LPD can be used for other things too. In fact, it can be viewed as a general queueing mechanism with a few added bells and whistles for printers. So let's examine a more interesting use of LPD, an engine for distributed spooling of MP3s.
Motivation
The main thing that got me started on this quest was seeing these two pictures (one, two) from the c2k3 openBSD hackathon I saw that obviously someone else had figured out how to do it. I sure as heck could also.
Initial Assessment
The first stop on my quest was examine the all-knowing seer of the Internet, google. That returned a wonderful page in Swedish about how to do this very task. Unfortunately, my swedish sucks, but thankfully the scripts were written in bash, and the other big thing was just a printcap file.
Creating a Printcap Entry
The first thing that you need to do is to create an entry in your printcap file for your shiny new mp3 printer. On most systems this file is
mp3:\
Now we'll walk through the entry line by line. I'll ignore the \ at the end of almost every line, that just tells lpd to keep reading because there is more to come. The last line doesn't need the \ obviously.
* 1: mp3: - the name of your mp3 printer. In this case, just mp3
* 2:
* 3:
* 4:
* 5:
* 6:
An Audio Input Filter
The key to the whole system is that all of the processing is done by input filter. On some platforms this may cause it say that the printing has stalled while a song is playing, but that's not a big deal. There is no output from the input filter, and thus nothing is done after this. You'll want to put the following piece of code on your system as
#!/bin/bash
#
# This script was originally made by Teddy Hogeborn.
# Small alterations was made by:
# Peter Lundqvist
# Patrick Wagstrom
#
# This is a "printer filter" for playing audio files
for arg in "$@"; do
case "$arg" in
-d*) dir="${arg#-d}"
-e*) basefile="${arg#-e}"
-f*.*) ext="${arg##*.}"
esac
done
mp3player="mpg123 -q -o oss";
modplayer="mikmod --quiet --playmode 0 --noloops --
I'm suprised they didn't try to pull this feat on Emacs first though.
:)
Next in line, "sendmail configuration files used as crypto keys"
Karma cannot be described by words alone.
Anyone have any links to some libraries or projects that might use lpd as a transport for generic queueing? Seems like a nice, language-agnostic, non-complex mechanism for cross-system job scheduling, etc. No real security model (though one could adapt something to it), but cool and readily available nonetheless.
Given what one can do with ghostscript queues, this is not exactly rocket science, but it goes to show the flexibility of *nix once again.
Mind the gap...
...unless it can be used as a porn queueing mechanism.
The real problem I see with this is, you will always get some sadistic bastard who spools a ton of *pop* music before disapearing out of ear shot or some fool who doesnt understand how it works and sticks the same song in over and over again.
Apart form that looks very fun for a small network with shared sound.
37 - what does it stand for really...
And enjoy. Don't mod me up though, it would be karma-whoring.
And wanted to add that the idea isn't new as you can see in this recent thread on deadly.org here (See post "mp3's playing via lpr?").
"A door is what a dog is perpetually on the wrong side of" - Ogden Nash
The OpenBSD guys had this long ago! ;)
This is something I did about five years ago when MP3s where just starting to become popular. It included writing a front-end in Java that was served via an Apache web server on the music host.
It was actually quite successful and kept my house in 24x7 music for about four years. Unfortunately, I retired all of my lpd-based printers and started using CUPS, so I also killed the mp3 queue too.
I don't much like lpd. To me it is one of those crufty old programs that never seems to work right, never gives informative error messages, and whose configuration is arcane. Other nominees: ntp and sendmail. (And yes, I'm sure they're all wonderful once you've mastered them).
I like CUPS's mechanism for this kind of thing even more. You basically have two components, a filter and a backend. The filter takes in one a few forms of input (mostly postscript, but plain text and some image formats also) and dumps out the native data format of the selected printer model (or just echos the input if you set it as a raw queue). The backend is then responsible for somehow getting it to the printer, either queueing it on the parallel port or sending it out on the network somehow, or anything else.
Some fun things I've done with backends:
Network printing over SSH
Text-to-speech queueing (print your source code to hear it read aloud by festival)
Dumping into a jpeg as a way of snapshotting any document you might want to save
Dumping into a PDF with ps2pdf to make your Windows friends feel stupid for buying Distiller =)
25% Funny, 25% Insightful, 25% Informative, 25% Troll
While we're hacking ... how about using DNS zone transfers. Its distributed (everywhere) and its cached until a change occurs. Maybe you'd have to
uuencode the info. But what if every .com entry had a few MP3s!
"/dev/dsp" is on fire!
Schrodinger's cat is either dead or really pissed off...
Sounds like a good technique for cheaply playing muzac to me. Or is Muzac dead in the water? Supplanted by piped Clear Channel broadcasts?
Could this be adapted for a MQ system (say queuing database queries?).. just adding some extra info into the "document", like where the query came from, etc. What kind of load can it handle?
meh
I sent my entire playlist to lpd and i've gone through all my paper, is there a way to make it print 4-up to save a few trees? To be honest I don't see the appeal of this....
just my two cents: cups has been much nicer in my experience. One of my favorites: lp -o prettyprint -o number-up=2
Don't become a regular here, you will become retarded. -- Yoda the Retard
Slashdot REALLY needs to start being more responsible and contacting these people first..
Sure, report news as needed, but before *linking* ASK them if they can deal with the load.. or the cost after being hit hard..
This is getting really bad, and i can feel a 'anti-slashdot' movement growing over this sort of thing.
---- Booth was a patriot ----
...will it do something like this?
I just let xmms handle the queueing of music, in a thing called a "play list".
However, for real geekiness, you should be using gridengine to queue and distribute your mp3s.
Government of the people, by corporate executives, for corporate profits.
Mod him up, he probably paid a lot to learn how to crack such good jokes, that'll make him feel better.
http://lmo.warcry.com/mp3lpd.php Lazy Link to Mirror Enjoy
...until you accidentally spool that mp3 to the printer ;)
-- Even if a god did exist, why the fsck should I worship it?
We used to do this with .au files back in 1991.
Is this a new group, group of songs, or what?
What genre?
Actually they did mod me down. And no, I don't care, I've got karma points falling out of my arse.
As I said, they're easy to get.
Oh, and they'll probably mod this one down too, but I still don't care. Notice I'm leaving the karma bonus on to really drive the point through your thick skull.
Daniel
Carpe Diem
http://mural.uv.es/~joferna/000128.html
What about the poor guys that are self-hosting on dsl/cable and go over their monthly cap.. then socked with a HUGE bill...
Or the tiny personal web pages that cap # of hits...
---- Booth was a patriot ----
I can imagine hooking LPD up to a 3D renderer like POV-Ray, BMRT, or even Lightwave's new Linux render client, then "printing" TIFF frames from your animation software.
How cool! I can't wait to try it!
I can't BELIEVE the RIAA is trying to shut thus guy down for...
Oh they're not?
Well.. How DARE SCO sue this guy for using...
Err, wait..
This is an article.. about someone using software technology... to accomplish a task... and there's no litigation involved???
OH MY GOD!!!!
nonsig. unsig. desig.
" What about the poor guys that are self-hosting on dsl/cable and go over their monthly cap.. then socked with a HUGE bill...
Or the tiny personal web pages that cap # of hits..."
Using the referral header to redirect to goatse.cx or tubagirl. I guarentee that if everyone linked does that (internet version of the death penalty) Taco will quickly get the message. Be a good netizin, or else.
Whoa. My CUPS is right now playing some .ogg files :)
/etc/cups/mime.types
/usr/local/bin/mplayer -really-quiet "$6" >> /dev/null /usr/lib/cups/backend/ as audioplay
/dev/null
Steps are simple:
1. uncomment
#application/octet-stream
at the very end of
3. drop this
---
#!/bin/bash
if [ $# = 0 ] ; then
echo network audioplay \"Unknown\" \"Audio Player\";
exit 0;
fi
----
in
chmod it +x and restart cups
4. Add printer in cups:
name: audio
location:
description: Hacked Audio-playing CUPS
device: Audio player
(if you don't see this device, you probably haven't restarted cups or audioplay is not executable)
device uri: audioplay://unused/
make: raw
model: rawqueue
4. cat your_favourite.ogg | lpr -r -Paudio
you can also do
lpr -Paudio -r song.mp3
but be careful, lpr likes to delete file after printing.
5. Prof^WEnjoy!
:wq
At NOAO the Unix lpd has long been used as the mechanism for Save the Bits, which is the means by which they and several other observatories archive all of the data acquired at their telescopes.
Beware, these scripts appear to be vulnerable to to un-escaped shell command characters (ie ', ", &, etc) in the filename. The script does not do any validation of the file that is sent to it. Since LPD doesn't do any authentication by default, be very careful about running this stuff on a public-accessible machine.
Chris
From what I understand... xterminals don't really support sound, not in any meaningful way. Could this simple solution be used with a typical x-terminal to provide... well, local sound?
There is no sanctuary. There is no sanctuary. SHUT UP! There is no shut up. There is no shut up.
I did this back in 1993, "printing" my MIDI files through a perl4 filter which translated them to musixTeX and converted them to PostScript and then to TIFF, faxing them automatically to a piano-player friend of mine who would then call me and play. Big deal.
A well-designed, well-implemented print spooling system could be useful for other applications. Unfortunately, we don't have one of those yet.
lpd, lprng, and cups all have a nasty habit of getting into weird states. And lprng and cups can also be a b*tch to configure.
In my office we use a one-writer, many-readers database system for timeseries data. But we have many people responsible for small parts of the database, so we needed some way to pool the updates into a single, serial stream. About eight or so years ago, we wrote an update queueing system using PLP, the precursor to LPRng. The thing has worked flawlessly since then, in a production environment supporting dozens of updaters. Print spoolers aren't just for printing anymore :-)
Got a mirror up - here. It can handle the traffic, don't worry.
jasp
In trying to explain the mentality to those unfamiliar with it, I use this analogy:
[100% ISO 646 Compliant]
SVM, ERGO MONSTRO.
You might be able to do that with samba, by defining a printer or share in your smb.conf with the spool that plays mp3s.
There was an article a couple months ago in Linux Journal, i believe, with instructions on using a smb-shared "printer" on your linux box to run files through ghostscript in order to get PDFs out.
I can't try it out right now but i hope this gives someone an idea.
[100% ISO 646 Compliant]
SVM, ERGO MONSTRO.
Here's an script for just that purpose:
[simple, but working, encryption/decryption script]
Lameness Filter Encountered
Reason: Use fewer "junk" characters.
Your comment has too few characters per line (currently 29.8).
So, since I can't be bothered to start a sourceforge project, I guess we'll just have to forget it.
Irene KHAAAAAAN!
Back when I was a GNU/newbie, my Red Hat box got 0wn3d by some script kiddie due to a buffer overflow exploit in lpd. I use CUPS now, even though I know LPD is generally very safe. One of those irrational, almost subconscious things, you know? Ahh well, no damage was done, it taught me to keep my software patched and my ports closed, and it gave me a good excuse to rid myself of RPM hell and install Slackware :^)