Trac is being migrated to new services! Issues can be found in our new YouTrack instance and WIKI pages can be found on our website.

Import Custom Smileys from Emesene

Emesene is a client for the MSN protocol. It supports custom smileys, which can be imported into Pidgin using the following script (requires Python 2.5 or later).

Download the script.

# Import custom smileys into Pidgin from Emesene 1.0.
# Requires Python 2.5 or later.
# Copyright (C) 2009, Danilo Piazzalunga <>
# This file is distributed under the same license as the Pidgin package.
# Usage:
# EMESENE_EMOTICON_MAP: the custom_emoticons/map file in your emesene
# account directory, to be used as the input file
# For example, $HOME/.config/emesene1.0/*/custom_emoticons/map.
# PURPLE_USER_DIR: the libpurple user directory, to be used as output
# directory. Defaults to $HOME/.purple.

from __future__ import with_statement

import hashlib
import os.path
import shutil
import sys
import xml.dom.minidom

def usage():
    return ("usage: %s EMESENE_EMOTICON_MAP [PURPLE_USER_DIR]" % sys.argv[0])

def purple_user_dir():
    for dir in [ "$PURPLEHOME", "%APPDATA%", "$HOME", "~" ]:
        purple_dir = os.path.join(
        if os.path.isdir(purple_dir):
            return purple_dir

def open_cmdline_arg(filename, input=True):
    if filename == "-":
        if input: return sys.stdin
        else: return sys.stdout
        if input: return open(filename, "U")
        else: return open(filename, "w")

def parse_emesene_map(map):
    smileys = {}

    while True:
        shortcut = map.readline().rstrip("\n")
        if not shortcut: break

        picture_name = map.readline().rstrip("\n")
        smileys[shortcut] = picture_name

    return smileys

def sha1sum(filename):
    with open(filename, "rb") as file:
        data =

    sha1sum = hashlib.sha1()
    return sha1sum.hexdigest()

def import_smileys(smileys, purple_dir):
    purple_custom_smiley_dir = os.path.join(purple_dir, "custom_smiley")
    purple_smileys_xml = os.path.join(purple_dir, "smileys.xml")

    if not os.path.isdir(purple_custom_smiley_dir):

    smileys_purple = []

    for shortcut, picture_name in smileys.iteritems():
        checksum = sha1sum(picture_name)
        ext = os.path.splitext(picture_name)[1]
        filename = "".join([checksum, ext])

                        os.path.join(purple_custom_smiley_dir, filename))

        smileys_purple.append({"shortcut": shortcut,
                               "checksum": checksum,
                               "filename": filename })

    write_purple_smileys_xml(smileys_purple, purple_smileys_xml)

def write_purple_smileys_xml(smileys_purple, purple_smileys_xml):
    dom = xml.dom.minidom.getDOMImplementation()
    doc = dom.createDocument(None, "smileys", None)

        top_element = doc.documentElement
        top_element.setAttribute("version", "1.0")

        profile_element = doc.createElement("profile")
        profile_element.setAttribute("name", "Default")

        smiley_set_element = doc.createElement("smiley_set")

        for s in smileys_purple:
            smiley_element = doc.createElement("smiley")
            smiley_element.setAttribute("shortcut", s["shortcut"])
            smiley_element.setAttribute("checksum", s["checksum"])
            smiley_element.setAttribute("filename", s["filename"])

        with open(purple_smileys_xml, "w") as writer:
            doc.writexml(writer, addindent="\t", newl="\n")

if __name__ == "__main__":
    if len(sys.argv) < 2 or len(sys.argv) > 3:

    input_filename = sys.argv[1]
    purple_dir = sys.argv[2] if len(sys.argv) > 2 else purple_user_dir()

    with open_cmdline_arg(input_filename) as map:
        smileys = parse_emesene_map(map)

    import_smileys(smileys, purple_dir)

Last modified 15 years ago Last modified on Jan 20, 2009, 12:05:54 AM

Attachments (1)

Download all attachments as: .zip

All information, including names and email addresses, entered onto this website or sent to mailing lists affiliated with this website will be public. Do not post confidential information, especially passwords!