In [2]:
from clarifai.client import ClarifaiApi
from IPython.display import Image
import requests
import json
from rauth import OAuth2Service
import time
from random import choice as rc
from random import sample as rs
import re
from pprint import pprint
import webbrowser
In [3]:
# GENIUS_CLIENT_ID = 
# GENIUS_CLIENT_SECRET = 

# genius = OAuth2Service(
#     client_id=GENIUS_CLIENT_ID,
#     client_secret=GENIUS_CLIENT_SECRET,
#     name='genius',
#     authorize_url='https://api.genius.com/oauth/authorize',
#     access_token_url='https://api.genius.com/oauth/token',
#     base_url='https://api.genius.com'
# )

# redirect_uri = 'http://lexography.org'

# params = {
#     'client_id': GENIUS_CLIENT_ID,
#     'redirect_uri': redirect_uri,
#     'scope': 'me',
#     'state': str(time.time()),
#     'response_type': 'code'
# }

# auth_url = genius.get_authorize_url(**params)

# print auth_url
In [4]:
# genius_code = 

# data = {
#     "code": genius_code,
#     "client_id": GENIUS_CLIENT_ID,
#     "client_secret": GENIUS_CLIENT_SECRET,
#     "redirect_uri": redirect_uri,
#     "response_type": genius_access_token,
#     "grant_type": "authorization_code"
# }

# # genius_session = genius.get_auth_session(data=data)
# response = requests.post('https://api.genius.com/oauth/token', data=data)

# genius_access_token = response.json()['access_token']
In [5]:
genius_access_token = 'ACCESS_TOKEN_GOES_HERE'
In [6]:
clarifai_api = ClarifaiApi()
In [7]:
def get_tag_conf(fp):
    fileObj = open(fp)
    result = clarifai_api.tag_images(fileObj)
    resultObj = result['results'][0]
    tags = resultObj['result']['tag']['classes']
    confs = resultObj['result']['tag']['probs']
    print zip(tags, confs)
    return tags
In [8]:
def genius_search(tags):
    access_token = genius_access_token
    payload = {
        'q': ' '.join(tags),
        'access_token': access_token
    }
    endpt = 'http://api.genius.com/search'
    response = requests.get(endpt, params=payload)
    results = response.json()
    hits = results['response']['hits']
    
    artists_titles = []
    
    for h in hits:
        hit_result = h['result']
        if hit_result['url'].endswith('lyrics'):
            artists_titles.append(
                (hit_result['primary_artist']['name'], hit_result['title'])
            )
    
    return artists_titles
In [10]:
def spotify_search(query):
    endpt = "https://api.spotify.com/v1/search"
    payload = {
        'q': query,
        'type': 'track'
    }
    response = requests.get(endpt, params=payload)
    result = response.json()
    result_zero = result['tracks']['items'][0]
    
    return result_zero['external_urls']['spotify']
In [12]:
def chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in xrange(0, len(l), n):
        yield l[i:i+n]
In [13]:
def img_to_spotify(fn):
    tags = get_tag_conf(fn)
    for tag_chunk in chunks(tags,3):
        print tag_chunk
        artists_titles = genius_search(tag_chunk)
        for artist, title in artists_titles:
            print artist, title
            try:
                result_url = spotify_search(artist+' '+title)
            except IndexError:
                pass
            else:
                return result_url
In [14]:
def main(fn):
    tgt_url = img_to_spotify(fn)
    print tgt_url
    webbrowser.open(tgt_url)
In [15]:
main('putin.jpg')
Image('putin.jpg')
[(u'politics', 0.9945972561836243), (u'government', 0.9910799264907837), (u'leader', 0.9902607202529907), (u'portrait', 0.9894281625747681), (u'people', 0.9829134941101074), (u'politician', 0.9824186563491821), (u'one', 0.9782326221466064), (u'capital', 0.9721550941467285), (u'conference', 0.9688420295715332), (u'business', 0.961031436920166), (u'finance', 0.9472644329071045), (u'speech', 0.9470629692077637), (u'meeting', 0.9403805732727051), (u'parliament', 0.9274305105209351), (u'election', 0.9074193239212036), (u'press conference', 0.8944219350814819), (u'president', 0.8926072120666504), (u'clothing', 0.8851751089096069), (u'dwelling', 0.8809040784835815), (u'minister', 0.8758523464202881)]
[u'politics', u'government', u'leader']
Immortal Technique The 3rd World
https://open.spotify.com/track/5KM6uHM7JuCDl2MltBOv1N
Out[15]:
In [16]:
main('cat.jpg')
Image('cat.jpg')
[(u'feline', 0.9980111122131348), (u'animal', 0.9978890419006348), (u'kitten', 0.997208833694458), (u'cat', 0.995855450630188), (u'cute', 0.9953833818435669), (u'domestic', 0.9880112409591675), (u'kitty', 0.9852457642555237), (u'small', 0.9851857423782349), (u'mammal', 0.9851556420326233), (u'fur', 0.9836616516113281), (u'portrait', 0.9819622039794922), (u'young', 0.9813418984413147), (u'looking', 0.9740389585494995), (u'pet', 0.9731495976448059), (u'paw', 0.9715224504470825), (u'funny', 0.966864287853241), (u'adorable', 0.9631398320198059), (u'claw', 0.9574546813964844), (u'curiosity', 0.9532482624053955), (u'whiskers', 0.9503458738327026)]
[u'feline', u'animal', u'kitten']
Haiku D'etat Kats
https://open.spotify.com/track/1w1yQMcueBo7MWnhWgLsFC
Out[16]:
In [17]:
main('landscape.jpg')
Image('landscape.jpg')
[(u'nature', 0.9925621747970581), (u'snow', 0.989025354385376), (u'mountain', 0.9775615930557251), (u'high', 0.9725484251976013), (u'grass', 0.9705415964126587), (u'summer', 0.9637105464935303), (u'valley', 0.9554368257522583), (u'nobody', 0.9533373117446899), (u'travel', 0.9461472034454346), (u'outdoors', 0.9447886943817139), (u'sky', 0.907622218132019), (u'sunshine', 0.9037473797798157), (u'majestic', 0.882263720035553), (u'scenic', 0.8695169687271118), (u'landscape', 0.8691047430038452), (u'alpine', 0.8597686886787415), (u'daytime', 0.8312705159187317), (u'pastureland', 0.8079403042793274), (u'panoramic', 0.777816891670227), (u'cloud', 0.7689800262451172)]
[u'nature', u'snow', u'mountain']
Matty Means Can Things Be Different
Half A Mill What You Ridin'?
[u'high', u'grass', u'summer']
Susheela Raman The Same Song
https://open.spotify.com/track/5kjsK3XrCToekWdqQedzxd
Out[17]:
In [18]:
main('street.jpg')
Image('street.jpg')
[(u'street', 0.9917725324630737), (u'square', 0.9895729422569275), (u'road', 0.9883618354797363), (u'urban', 0.9858005046844482), (u'taxi', 0.9802849888801575), (u'travel', 0.9785647392272949), (u'city', 0.9772683382034302), (u'outdoors', 0.9722838401794434), (u'traffic', 0.9711309671401978), (u'tourist', 0.9697055816650391), (u'transportation', 0.9685533046722412), (u'tourism', 0.9488428831100464), (u'many', 0.9420232772827148), (u'building', 0.9388694763183594), (u'commerce', 0.9385197162628174), (u'town', 0.9374809265136719), (u'shopping', 0.9326518774032593), (u'architecture', 0.9258205890655518), (u'bus', 0.9204193949699402), (u'people', 0.9195054769515991)]
[u'street', u'square', u'road']
Oak Street Ramblers Square Barn Road
Lindisfarne Soho Square
https://open.spotify.com/track/1BoOOWrON7sXtt1PZCM1lb
Out[18]: