class Flickrie::Middleware::FixFlickrData

Public Instance Methods

call(env) click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 4
def call(env)
  response = @app.call(env)
  fix_flickr_data!(response)
  response
end

Private Instance Methods

actions() click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 32
def actions
  @actions ||= {
    "flickr.people.findByUsername" => lambda { |data| },
    "flickr.people.findByEmail" => lambda { |data| },
    "flickr.people.getInfo" => lambda { |data| },
    "flickr.people.getUploadStatus" => lambda { |data|
      data['user']['upload_status'] = {
        'bandwidth' => data['user'].delete('bandwidth'),
        'filesize' => data['user'].delete('filesize'),
        'sets' => data['user'].delete('sets'),
        'videosize' => data['user'].delete('videosize'),
        'videos' => data['user'].delete('videos')
      }
    },
    "flickr.people.getPhotos" => lambda { |data| fix_common!(data) },
    "flickr.people.getPhotosOf" => lambda { |data| fix_common!(data) },
    "flickr.people.getPublicPhotos" => lambda { |data| fix_common!(data) },

    "flickr.photos.getInfo" => lambda { |data|
      data['photo']['comments_count'] = data['photo'].delete('comments')
      data['photo']['dates']['uploaded'] = data['photo'].delete('dateuploaded') rescue nil
      data['photo']['tags'] = data['photo']['tags']['tag'] rescue nil
    },

    "flickr.photos.getSizes" => lambda { |data|
      data['sizes']['usage'] = {
        'canblog'     => data['sizes']['canblog'],
        'canprint'    => data['sizes']['canprint'],
        'candownload' => data['sizes']['candownload']
      }
      if data['sizes']['size'].find { |hash| hash['label'] == 'Video Player' }
        # Video
        data['sizes']['video'] ||= {}
        data['sizes']['size'].each do |info|
          case info['label']
          when 'Video Player' then data['sizes']['video']['source_url'] = info['source']
          when 'Site MP4'     then data['sizes']['video']['download_url'] = info['source']
          when 'Mobile MP4'   then data['sizes']['video']['mobile_download_url'] = info['source']
          end
        end
      else
        flickr_sizes = {
          'Square'       => Photo::FLICKR_SIZES['Square 75'],
          'Large Square' => Photo::FLICKR_SIZES['Square 150'],
          'Thumbnail'    => Photo::FLICKR_SIZES['Thumbnail'],
          'Small'        => Photo::FLICKR_SIZES['Small 240'],
          'Small 320'    => Photo::FLICKR_SIZES['Small 320'],
          'Medium'       => Photo::FLICKR_SIZES['Medium 500'],
          'Medium 640'   => Photo::FLICKR_SIZES['Medium 640'],
          'Medium 800'   => Photo::FLICKR_SIZES['Medium 800'],
          'Large'        => Photo::FLICKR_SIZES['Large 1024'],
          'Large 1600'   => Photo::FLICKR_SIZES['Large 1600'],
          'Large 2048'   => Photo::FLICKR_SIZES['Large 2048'],
          'Original'     => Photo::FLICKR_SIZES['Original']
        }
        data['sizes']['size'].each do |size_info|
          size_abbr = flickr_sizes[size_info['label']]
          data['sizes']["width_#{size_abbr}"] = size_info['width']
          data['sizes']["height_#{size_abbr}"] = size_info['height']
          data['sizes']["url_#{size_abbr}"] = size_info['source']
        end
      end
    },
    "flickr.photos.search" => lambda { |data| fix_common!(data) },
    "flickr.photos.getContactsPhotos" => lambda { |data|
      data['photos']['photo'].each do |media_hash|
        media_hash['ownername'] = media_hash.delete('username')
      end
      fix_common!(data)
    },
    "flickr.photos.getContactsPublicPhotos" => lambda { |data|
      data['photos']['photo'].each do |media_hash|
        media_hash['ownername'] = media_hash.delete('username')
      end
      fix_common!(data)
    },
    "flickr.photos.getNotInSet" => lambda { |data| fix_common!(data) },
    "flickr.photos.getPerms" => lambda { |data|
      fix_visibility!(data['perms'])
      data['perms']['permissions'] = {
        'permcomment' => data['perms'].delete('permcomment'),
        'permaddmeta' => data['perms'].delete('permaddmeta')
      }
    },
    "flickr.photos.getRecent" => lambda { |data| fix_common!(data) },
    "flickr.photos.getUntagged" => lambda { |data| fix_common!(data) },
    "flickr.photos.getWithGeoData" => lambda { |data| fix_common!(data) },
    "flickr.photos.getWithoutGeoData" => lambda { |data| fix_common!(data) },
    "flickr.photos.recentlyUpdated" => lambda { |data| fix_common!(data) },

    "flickr.photos.comments.getList" => lambda { |data|
      data["comments"]["comment"].map! do |comment_hash|
        comment_hash["photo_id"] = data["comments"]["photo_id"]
        comment_hash["author"] = {
          "id"         => comment_hash["author"],
          "nsid"       => comment_hash.delete("author"),
          "username"   => comment_hash.delete("authorname"),
          "iconserver" => comment_hash.delete("iconserver"),
          "iconfarm"   => comment_hash.delete("iconfarm")
        }
        comment_hash
      end
    },
    "flickr.photos.comments.getRecentForContacts" => lambda { |data| fix_common!(data) },

    "flickr.photosets.getPhotos" => lambda { |data|
      data['photoset']['photo'].map! do |media_hash|
        media_hash['owner'] = {
          'id' => data['photoset']['owner'],
          'nsid' => data['photoset']['owner'],
          'username' => data['photoset']['ownername'],
        }
        fix_extras!(media_hash)
        media_hash
      end
    },
    "flickr.photosets.getInfo" => lambda { |data| },
    "flickr.photosets.getList" => lambda { |data|
      data['photosets']['photoset'].map! do |set_hash|
        set_hash['count_photos'] = set_hash.delete('photos')
        set_hash['count_videos'] = set_hash.delete('videos')
        set_hash['title'] = set_hash['title']['_content'] rescue nil
        set_hash['description'] = set_hash['description']['_content'] rescue nil
        set_hash
      end
    },
    "flickr.reflection.getMethods" => lambda { |data|
      data['methods']['method'].map! { |hash| hash["_content"] }
    },
    "flickr.test.login" => lambda { |data| }
  }
end
cleanup_content(data) click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 165
def cleanup_content(data)
  data.inject({}) do |hash, (key, value)|
    hash[key] =
      if value.is_a?(Hash)
        value.count == 1 ? (value["_content"] || cleanup_content(value)) : cleanup_content(value)
      else
        value
      end
    hash
  end
end
fix_common!(hash) click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 226
def fix_common!(hash)
  hash['photos']['photo'].map! do |media_hash|
    media_hash['owner'] = {
      'id' => media_hash['owner'],
      'nsid' => media_hash.delete('owner'),
      'username' => media_hash.delete('ownername')
    }
    fix_extras!(media_hash)
    fix_visibility!(media_hash)
    media_hash
  end
end
fix_extras!(hash) click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 177
def fix_extras!(hash)
  if hash['iconserver'] or hash['iconfarm']
    hash['owner'] ||= {}
    hash['owner'].update \
      'iconserver' => hash.delete('iconserver'),
      'iconfarm' => hash.delete('iconfarm')
  end

  if hash['place_id']
    geo_info = %w[latitude longitude accuracy context place_id woeid]
    hash['location'] = geo_info.inject({}) do |location, geo|
      location.update(geo => hash.delete(geo))
    end
    hash['geoperms'] = {
      'isfamily' => hash['geo_is_family'],
      'isfriend' => hash['geo_is_friend'],
      'iscontact' => hash['geo_is_contact'],
      'ispublic' => hash['geo_is_public']
    }
  end

  if hash['tags']
    hash['tags'] = hash['tags'].split(' ').map do |tag_content|
      {'_content' => tag_content, 'machine_tag' => 0}
    end
  end
  if hash['machine_tags']
    hash['tags'] ||= []
    hash['tags'] += hash.delete('machine_tags').split(' ').map do |tag_content|
      {'_content' => tag_content, 'machine_tag' => 1}
    end
  end

  hash['dates'] = {
    'uploaded' => hash.delete('dateupload'),
    'lastupdate' => hash.delete('lastupdate'),
    'taken' => hash.delete('datetaken'),
    'takengranularity' => hash.delete('datetakengranularity'),
  }
end
fix_flickr_data!(response) click to toggle source

Ugly, just normalizing the data

# File lib/flickrie/middleware/fix_flickr_data.rb, line 13
def fix_flickr_data!(response)
  query = CGI.parse(response.env[:url].query)
  flickr_method = query['method'].first

  case flickr_method
  when "flickr.photos.getSizes"
    response.env[:body]['sizes']['id'] = query['photo_id'].first
  when "flickr.photosets.getList"
    response.env[:body]['photosets']['photoset'].map! do |set_hash|
      set_hash['owner'] = query['user_id'].first
      set_hash
    end
  end

  response.env[:body] = cleanup_content(response.env[:body])
  action = actions[flickr_method]
  action.call(response.env[:body]) if action
end
fix_visibility!(hash) click to toggle source
# File lib/flickrie/middleware/fix_flickr_data.rb, line 218
def fix_visibility!(hash)
  hash['visibility'] = {
    'ispublic' => hash.delete('ispublic'),
    'isfriend' => hash.delete('isfriend'),
    'isfamily' => hash.delete('isfamily')
  }
end