Hanno’s Coding Log: software development, geek stuff

more cover art

I am currently working on a patch for foo_sendtodevice, an MP3 player plugin for the excellent Foobar2000.

Chris Bowron was so kind, to send me the source code. My patch will allow to automatically copy album cover art in separate files to the device, too.

MP3 Cover Art Embedder and Resizer

I updated my Cover Art Resizer program.

New features:

  • configurable output verbosity
  • allows wildcards in directory names
  • “force” switch for thumb.jpg re-creation

The program takes one or more paths as an argument, searches the entire directory tree for “cover.jpg” files and creates “thumb.jpg” files in 100×100 pixels size. It also embeds the thumb.jpg into the mp3s found in the directory.

It requires the Python Image Library and Mutagen. (If you have setuptools installed, the dependencies will be installed automatically)

You can install by running python setup.py install from the source code distribution or installing the supplied EGG or using the EXE.

Run coverresizer -h for help. (Your Python Scripts directory must be in the PATH)

Coverresizer 0.3 Source Distribution
Coverresizer 0.3 Windows Installer EXE
Coverresizer 0.3 EGG for Python 2.4

thumbnail creator for cover.jpg / album art

I just wrote a small python script that allows you to create thumbnails on all your cover.jpg album art in your MP3 collection.
Make sure you save the covers as cover.jpg in the folder that contains the MP3s. This is recognized by most programs.

With this script you can generate thumbnails for all the cover.jpg files:

#!/usr/bin/env python
import sys
from os import path, walk
from PIL import Image, ImageOps
def process_path(dir):
    for dirpath, dirnames, filenames in walk(dir):
        for name in filenames:
            if name == "cover.jpg":
                if not path.exists(path.join(dirpath, "thumb.jpg")):
                    process_image(dirpath, name)
        for name in dirnames:
            full_path = path.join(dirpath, name)
def process_image(dirpath, name):
    full_path = path.join(dirpath, name)
    print full_path
    img = Image.open(full_path)
    img = img.resize((100,100), Image.BILINEAR)
    img.save(path.join(dirpath, "thumb.jpg"))
if __name__ == "__main__":
    dir = sys.argv[1]
    print dir

You’ll need the Python Imaging Library. Just call the script with the root path of your MP3 collection as the first command line parameter.

You might want to import the thumbnails into the MP3s with software like MP3Tag.

kNose 1.0 released

Brandon Corfman has just released kNose 1.0, a Komodo IDE/Edit extension for the Python unit testing framework “nose”.

Previous screenshots looked quite promising and I am looking forward to trying it out.

However, I won’t have the time at the moment, because of heavy workload and a non-pythonic day job. ;)

Update: kNose 1.1 has just been released.

dynamic graphics in AJAX applications

Michael Mahemoff, author of Ajax Design Patterns, has a nice overview of solutions for dynamic graphics on AJAX enabled web pages.

He covers eight different possibilities, most of them with code examples. It seems like there is still no real solution that works across all browsers and doesn’t require a plugin. Dynamic creation of SVG or VML code looks like the most appealing solution to me. However you would have to do both, depending on IE or other browsers.

redundant routes and DNS

Today one of the biggest regional internet providers in Germany experienced almost a complete loss of service (in German). Rumours go on that this had to do with a DNS problem.

No matter whether this was the real reason, it reminds me that we are heavily relying on DNS infrastructure when using internet services.
More »

Data Retention

For my non German readers: Maybe you have noticed the dog-ear at the top right corner of this weblog.

It’s from a campaign against the Directive on Mandatory Retention of Communications Traffic Data enacted in March 2006 by the European Union. Since the directive has passed the European Parliament, the fight against the directive now takes place in the member states.

I support this campaign, because I think data retention is no solution:

“Data retention is an invasive tool that interferes with the private lives of all 450 million people in the European Union. Data retention is a policy that expands powers of surveillance in an unprecedented manner. It simultaneously revokes many of the safeguards in European human rights instruments, such as the Data Protection Directives and the European Convention on Human Rights.” — www.dataretentionisnosolution.com

If you’re interested in the topic here is another link covering the topic.

Scope and foreach loops

One of these misunderstandings: I always thought foreach loops would create a temporary variable for the current element that would mask any variable with the same name in the current scope.

Obviously that is not the case, as I discovered when I tried to find a bug in Simple Tagging’s STP_RelatedPosts() function.

First I thought this was a PHP-only behavior… But see the following PHP and Python examples:
More »

Dynamic ip based authentication with Apache

I have a very cool Squeezebox WiFi MP3-Player which comes with a very cool music server software called Slimserver (written in Perl, Open Source, too!).
One thing this Slimserver can do is stream MP3 to every MP3 stream capable player. (Winamp, etc.)

The problem: How to access my music from any computer that has i.e. Winamp installed, without risking a big security breach at my home computer.
Solution: Secure the Slimserver with Apache as a proxy, using Apache’s SSL and authentication capabilities.
Catch: Winamp doesn’t do SSL and MediaPlayer isn’t to good at it, either.

The real solution: Access the management interface of Slimserver via SSL, protect it via some AuthType and allow unprotected, unencrypted access to the stream URL only from IPs that have previously accessed and successfully logged in at the SSL protected page.
I do that with mod_python and the various hooks it provides. Yes, you can do more with it than just executing Python scripts.
More »

Duck Typing, Generics and Templates…

Skunk Works has an article about how “The Future Won’t Be Statically Typed”.

There’s been many criticisms of duck typing but usually those voicing them don’t have an extensive experience of development using non statically typed languages or are Java fundamentalists.

Yeah. I agree with that. But I also think current dynamic languages are not the end of the story. Why is everybody thinking Types? Why not Interfaces? No, I don’t mean Java’s Interfaces — because they also rely on inheritance trees (or are the root of it). I think inheritance trees are the root of the problem.
More »

Stoppt die Vorratsdatenspeicherung! Jetzt klicken & handeln!Willst du auch bei der Aktion teilnehmen? Hier findest du alle relevanten Infos und Materialien: