#!/usr/bin/env lua local socket = require 'socket' local http = require 'socket.http' local url = require 'socket.url' local math = require 'math' local username = 'doyster' local pass_hash = '63ff9c4d9cf5d1a68a63deeb74b034ef' function md5(str) local file = io.popen('echo -n ' .. str .. ' | md5sum', 'r') local ret = file:read() file:close() ret = string.sub(ret, 1, 32) return ret end function handshake(username) local handshake_url = 'http://post.audioscrobbler.com/?hs=true&p=1.1&c=tst&v=1.0&u=' .. username print("Sending handshake request to " .. handshake_url) response = http.request(handshake_url) print("Response to handshake:\n" .. response) local i = 1 local response_lines = {} for line in string.gfind(response, "[^\n]+") do response_lines[i] = line i = i + 1 end if i ~= 5 or string.sub(response_lines[1], 1, 2) ~= 'UP' then return nil, "Error in handshake!" end return response_lines end function parse_cache(cache_text) local tracks = {} for track in string.gfind(cache_text, "a%[%d+%]=[^&]*&t%[%d+%]=[^&]*&b%[%d+%]=[^&]*&l%[%d+%]=[^&]*&i%[%d+%]=[^&]*&m%[%d+%]=[^&]*&") do local _, _, artist, track, album, length, time, mbid = string.find(track, "a%[%d+%]=([^&]*)&t%[%d+%]=([^&]*)&b%[%d+%]=([^&]*)&l%[%d+%]=([^&]*)&i%[%d+%]=([^&]*)&m%[%d+%]=([^&]*)&") table.insert(tracks, {artist = artist, track = track, album = album, length = length, time = time, mbid = mbid}) end return tracks end function submit(username, challenge_response, submit_url, tracks) local to_submit = "" for i, track in ipairs(tracks) do to_submit = to_submit .. string.format("a[%d]=%s&t[%d]=%s&b[%d]=%s&l[%d]=%s&i[%d]=%s&m[%d]=%s&", i - 1, track.artist, i - 1, track.track, i - 1, track.album, i - 1, track.length, i - 1, track.time, i - 1, track.mbid) end submission = 'u=' .. username .. '&s=' .. challenge_response .. '&' .. to_submit print('Submitting ' .. submission .. ' to ' .. submit_url) response = http.request(submit_url, url.unescape(submission)) print("Response to submission:\n" .. response) end local handshake_response = assert(handshake(username)) local challenge_response = md5(pass_hash .. handshake_response[2]) local file = io.open(arg[1], 'r') local raw_tracks = file:read() file:close() local tracks = parse_cache(raw_tracks) local to_submit = {} for i = 0, math.floor(table.getn(tracks) / 10) - 1 do for j = 1, 10 do to_submit[j] = tracks[j+10*i] end submit(username, challenge_response, handshake_response[3], to_submit) to_submit = {} print("Sleeping...") socket.sleep(2) end for j = 1, math.mod(table.getn(tracks), 10) do to_submit[j] = tracks[j+10*math.floor(table.getn(tracks) / 10)] end submit(username, challenge_response, handshake_response[3], to_submit)