Aug
27
Posted on 27-08-2007
Filed Under (Nimboo, Programming, Ruby, Yahoo) by Federico Feroldi on 27-08-2007

When I discover delicious it was too late for me since at the time I had too many bookmarks already tagged in Yahoo’s Myweb. But since then I’ve always wanted to move all my bookmarks to delicious but didn’t found how to do it, until now.

Some days ago I found this python script that makes use of myweb and delicious web services to migrate the bookmarks.
Unfortunately the script wasn’t very reliable, it was crashing quite often and, since I have more than 1500 bookmarks, it was quite painful since every time I launched it, it was starting from scratch.

So I decided to build a new script (actually two)… in Ruby.

Step 1 : prerequisites

First of all you must install Ruby and rubygems on your system.

Then you must install rubilicious gem.

Step 2 : export myweb bookmarks

Here’s the first ruby script that you must run:

require 'net/http'
require 'uri'
require 'rexml/document'

# YOU WANT TO MODIFY THIS
yahoo_id = 'pix'

myweb_appid = 'YahooDemo'
myweb_urlsearch = 'http://search.yahooapis.com/MyWebService/V1/urlSearch'

request_start_idx = 1
request_max = 50

while(true)
  url = myweb_urlsearch + '?' + {
    :appid => myweb_appid,
    :yahooid => yahoo_id,
    :results => request_max,
    :start => request_start_idx
  }.to_a.collect {|kv| kv[0].to_s + '=' + kv[1].to_s}.join('&')
 
  retries = 3
  while(true)
    $stderr.puts(" - Requesting URLs from [#{request_start_idx}] (#{retries} retries left) -> #{url}\n")
   
    http_resp = Net::HTTP.get_response(URI.parse(url))
   
    if(http_resp.code.to_i < 200 || http_resp.code.to_i > 299)
      $stderr.puts(" ! request failed [#{http_resp.code}]\n")
      retries -= 1
      sleep(5) && next if(retries > 0)
      $stderr.puts(" ! too many retries, something is broken!\n")
      exit
    end
    break # exit while loop
  end

  xml_data = http_resp.body
 
  # extract event information
  doc = REXML::Document.new(xml_data)
 
  tot_results = doc.root.attributes['totalResultsAvailable'].to_i
  break unless tot_results > 0
 
  doc.elements.each('ResultSet/Result') do |r|
    puts [
      r.elements['Title'].text,
      r.elements['Summary'].text,
      r.elements['Url'].text,
      r.elements['Tags'].collect() {|e| e.text.to_s}.join(','),
    ].collect {|v| URI.escape(v.to_s) }.join('&') + "\n"
   
    request_start_idx += 1
  end

end

Copy this code and paste it to a file (like myweb_export.rb). You also want to set the yahoo_id variable with your myweb ID.

Then you can run the script:

ruby myweb_export.rb > data.txt

Step 3 : import bookmarks into delicious

For the final step you’ll need the script below:

require 'rubilicious'
require 'uri'

r = Rubilicious.new('USER', 'PASSWORD')

$stdin.each_line do |l|
  title, description, url, keys = l.split('&').collect { |i| URI.decode(i) }
  keys = keys.split(',').collect { |k| k.strip.gsub(/\s+/, '-') }.join(' ')
  puts title + "\n" + url + "\n" + keys + "\n---\n"
  r.add(url, title, description, keys)
  sleep(1)
end

You want to set the proper values for USER and PASSWORD of your delicious account and copy the code to deli_import.rb.

ruby deli_import.rb < data.txt

The script waits 1 second after each URL since this is required by the delicious API.

Limitations: unfortunately since the Myweb web services only allow the search of public bookmarks, you’ll not be able to migrate private bookmarks. You must do this by hand or wait that Yahoo will release a Myweb webservice that supports authentication.

(1) Comment    Read More   
May
21
Posted on 21-05-2007
Filed Under (PHP, Yahoo) by Federico Feroldi on 21-05-2007
(0) Comments    Read More   
May
18
Posted on 18-05-2007
Filed Under (Life facts, Talks, Yahoo) by Federico Feroldi on 18-05-2007
(10) Comments    Read More   
May
08
Posted on 08-05-2007
Filed Under (PHP, Programming, Yahoo) by Federico Feroldi on 08-05-2007
(1) Comment    Read More