#!/usr/bin/env ruby
#
# Amarok Script for embedding album cover images in MP3 files.
#
# (c) 2005-2006 Mark Kretschmann <markey@web.de>
# License: GNU General Public License V2


require 'md5'
require "uri"

$stdout.sync = true
MenuItemName = "EmbedCover DoIt!"


def cleanup()
  `dcop amarok script removeCustomMenuItem #{MenuItemName}`
end

def sql_escape( string )
  return string.gsub( /[']/, "''" )
end


trap( "SIGTERM" ) { cleanup() }

`dcop amarok script addCustomMenuItem #{MenuItemName}`


loop do
  message = gets().chomp()
  command = /[A-Za-z]*/.match( message ).to_s()

  case command
  when "configure"
    msg  = 'EmbedCover does not have configuration options. Simply select a track in the '
    msg += 'playlist, then start EmbedCover from the context-menu (right mouse click).'

    `dcop amarok playlist popupMessage "#{msg}"`

  when "customMenuClicked"
    if message.include?( MenuItemName )
      args = message.split()
      # Remove the command args
      3.times() { args.delete_at( 0 ) }

      # Iterate over all selected files
      args.each() do |arg|
        uri = URI.parse( arg )
        file = URI.unescape( uri.path() )

        puts( "Path: #{file}" )

        backend = File.dirname( File.expand_path( __FILE__ ) ) + "/addimage2mp3.rb"

        # In the database we store relative URLs (for dynamic collection), so we need to convert
        file_relative = `dcop amarok collection relativePath "#{file}"`.chomp

        # Query is two parts, first ID, then name
        artist_id = `dcop amarok collection query "SELECT DISTINCT artist FROM tags WHERE url = '#{sql_escape( file_relative )}'"`.chomp
        artist    = `dcop amarok collection query "SELECT DISTINCT artist.name FROM artist WHERE id = '#{artist_id}'"`.chomp

        album_id  = `dcop amarok collection query "SELECT DISTINCT album FROM tags WHERE url = '#{sql_escape( file_relative )}'"`.chomp
        album     = `dcop amarok collection query "SELECT DISTINCT album.name FROM album WHERE id = '#{album_id}'"`.chomp

        puts( "ArtistId : #{artist_id}" )
        puts( "Artist   : #{artist}" )
        puts( "AlbumId  : #{album_id}" )
        puts( "Album    : #{album}" )

        if artist_id.empty?() and album_id.empty?()
          `dcop amarok playlist popupMessage "EmbedCover Error: This track is not in your Collection."`
          next
        end

        md5sum = MD5.hexdigest( "#{artist.downcase()}#{album.downcase()}" )
        imagefolder = "#{ENV['HOME']}/.trinity/share/apps/amarok/albumcovers/large/"
        image = "#{imagefolder}#{md5sum}"

        puts( "Imagepath: #{image}" )

        unless FileTest.exist?( image )
          # If there is no imported image, check if there is an image associated
          # in the music folder

          sql = "SELECT path FROM images WHERE artist LIKE #{sql_escape( artist )} AND album LIKE #{sql_escape( album )} ORDER BY path;"
          images = `dcop amarok collection query #{sql}`.split( "\n" )

          # FIXME select best image from array, like CollectionDB does
          image = images.first()

          if image == nil or not FileTest.exist?( image )
            `dcop amarok playlist popupMessage "EmbedCover: No image found for this track."`
            next
          end
        end

        output = `ruby #{backend} "#{image}" "#{file}"`

        if $?.success?()
          `dcop amarok playlist popupMessage "EmbedCover has successfully embedded the image."`
        else
          reg = Regexp.new( "Error:.*", Regexp::MULTILINE )
          errormsg = reg.match( output )

          `dcop amarok playlist popupMessage "EmbedCover #{errormsg}"`
        end
      end
    end
  end
end
