#!/usr/bin/env ruby require 'format' require 'xmmsclient' # Edit this for desired effect: FORMAT = '%a%l%n' def sort(list, first = 0, last = list.length - 1) pivot = rand(last - first + 1) + first if(first < last) pivot = part(list, first, last, pivot) sort(list, first, pivot - 1) sort(list, pivot + 1, last) end end def part(list, first, last, pivot) pivot_val = list[pivot] index = first swap(list, pivot, last) (first..last - 1).each do|i| if(list[i] <= pivot_val) swap(list, i, index) index += 1 end end swap(list, last, index) return index end def swap(list, a, b) return if(a == b) if(a < b) @xmms.playlist_move(a, b).wait @xmms.playlist_move(b - 1, a).wait elsif(a > b) @xmms.playlist_move(b, a).wait @xmms.playlist_move(a - 1, b).wait end tmp = list[a] list[a] = list[b] list[b] = tmp end @xmms = Xmms::Client.new('Magic_SuperSorter') @xmms.connect(ENV["XMMS_PATH"]) format = Format.new(FORMAT) list = @xmms.playlist_list.wait.value.map do |entry| res = @xmms.medialib_get_info(entry) info = {} res.wait.value.each do |from, key, val| info[key] = val end info[:url_decoded] = res.decode_url(info[:url]) format.prettify(info) end sort(list)