Well mainly because I'm a network engineer and software developer with my own server in a datacenter...then there's a lot of technical stuff:
MP3 files are usually ripped from original CDs using CDex, my favorite ripping program for many years now. It's really easy to use but has plenty of advanced features to let you create the best quality MP3 files. Adding ID3 tags is critical since Shoutcast sends that info, which will come later...
There are always the MP3s that you have where you're "not really sure" where you got them, and either have bad or no ID3 tags. For those, and if you just realized that you've encoded your entire CD library only to find that your software didn't write the ID3 tags while ripping, I use TagScanner, the most awesome MP3 tagging tool I've ever seen. It's made by some crazy Russian guy and it works wonders. I mainly use it after I rename all of the files to my format, TagScanner will add the ID3s based on your filename format. You can also do the opposite, if you have a bunch of files that have good ID3s but the filenames are all wrong, you can rename the files based on their ID3 tags. You can also scroll through a single-column list of all your MP3s' ID3s to see if there are any that stand out.
The MP3 library resides on the streaming server but could easily sit on another storage device on the local network. I wrote a custom .NET console app to scan all files and folders in a given directory and read the artist, album, track, and song titles from the filename. I standardize all my MP3s in "Artist - Album - Track# - Song.mp3" format but there's always a few tracks that slip by. It then inserts that data into a MS SQL database, so now I can run queries in a language I know extremely well because that's a big part of my day job. It could easily be run on MySQL, Oracle, or any other modern database. The Albums table has a field for vendor_itemid which is where Amazon's ASIN number goes. So far the only reliable way to get the ASINs into your database is to surf Amazon.com looking for the CDs, the ASIN is always in an information section in the middle of the page, copy and paste it into the field. They have web services that can return XML search results but nothing beats having the exact ASIN number already in the database.
The streaming portion is simply Winamp with the Shoutcast DSP Plugin and Shoutcast Server. These run on the same machine but could easily be separated. The Shoutcast Plugin and Server provide the data that you see on www.shoutcast.com, and also to the next section, the web site. They also provide the actual stream of course, and the Shoutcast Server has a lot of cool configuration options such as max listeners, ports, etc.
The site runs on ASP.NET and upon loading, reads the XML data from the Shoutcast Server's XML URL. I load the XML into a Dataset using an HTTP Request "page scraper" function that I wrote and a MemoryStream object, using the Dataset object's ReadXML method. Then I get the artist and song title the current song and each of the previous 9 songs, pass those to a stored procedure that looks up the album info if any and returns a URL (hopefully) to the page for that CD on Amazon.com. I add a column to the dataset called "link" and run that query for each row. I'm slowly adding Amazon's ASIN numbers to the database, if a song belongs to an album that has an ASIN stored it will return the exact URL to that CD. They have some web services that will return search results and album images in XML format, the next version of the home page will utilize some of those features.
The important key is that the currently playing artist and song titles come from the Shoutcast DSP Plugin's song info stored in the Shoutcast Server's realtime stats XML stream, and that data is read directly from the currently playing MP3's ID3 tag, and that "Artist - Song Title" is all you have to work with. Notice there's no album information so you have to query the database by artist and song title to find the album it goes to, and its ASIN tag if it has one. If the ID3 tag's info doesn't find a match in the database it returns Amazon's Search URL which lets them try to find the CD you're looking for.
The resulting dataset contains the current song and last 9 or so songs, depending on your Shoutcast server configuration, along with a new "link" field for each row. The dataset is then passed via XML (Dataset.GetXML) to an XSLT template, which is done by a custom function that transforms an XML stream with an XSLT file that displays the data the way I want it to, including the hyperlinks to Amazon's site. The XML webcontrol object doesn't work for me because it wants a file and this whole operation is done in memory only. The string returned from that function becomes the Text property of a Label object, and the page is finally rendered.
I also built a few back-end pages to allow me to edit the data in SQL, such as a list of artists that when clicked displays all albums associated with them, then all songs for a selected album, all of which is editable in place through an Edit link. This is where I quickly insert an ASIN tag, it's usually less than 5 click to get to a particular album's editor.