Beispiel #1
0
 def GET(self):
   rdio, current_user, user_id = get_rdio_and_current_user()
   disco_user, prefs = get_discoversong_user(user_id)
   # circular import
   from discoversong.sources import SourceAppsManager
   
   return render.config(params=Params(user=disco_user, preferences=prefs, message="", environment_message=get_environment_message()),
                        capabilities=SourceAppsManager.all_capabilities(),
                        editform=editform(playlists=rdio.call('getPlaylists')['result']['owned'], prefs=get_db_prefs(user_id)))
Beispiel #2
0
def return_results(rdio, user_id, song_artist_url_list, from_tweet_id=None):
    db = get_db()
    prefs = get_db_prefs(user_id, db=db)

    playlist_key = prefs.get(Preferences.PlaylistToSaveTo, "new")
    add_to_collection = prefs.get(Preferences.AddToCollection, False)
    track_keys_list = [s[3] for s in song_artist_url_list]

    playlists_call = rdio.call("getPlaylists")
    if "result" in playlists_call:
        playlists = playlists_call["result"]["owned"]
    else:
        playlists = []
    p_keys = [playlist["key"] for playlist in playlists]
    p_names = [playlist["name"] for playlist in playlists]

    if playlist_key in ["new", "alwaysnew"] or playlist_key not in p_keys:
        new_name = generate_playlist_name(p_names)
        result = rdio.call(
            "createPlaylist",
            {
                "name": new_name,
                "description": "Songs found by discoversong on %s."
                % datetime.datetime.now().strftime("%A, %d %b %Y %H:%M"),
                "tracks": ", ".join(track_keys_list),
            },
        )
        new_key = result["result"]["key"]

        if playlist_key == "new" or playlist_key not in p_keys:
            prefs[Preferences.PlaylistToSaveTo] = new_key
            db.update(USER_TABLE, where="rdio_user_id=%i" % user_id, prefs=BSONPostgresSerializer.from_dict(prefs))

        # else leave 'alwaysnew' to repeat this behavior every time

    else:
        rdio.call("addToPlaylist", {"playlist": playlist_key, "tracks": ", ".join(track_keys_list)})

    if add_to_collection:
        rdio.call("addToCollection", {"keys": ", ".join(track_keys_list)})

    stats.found_songs(user_id, len(song_artist_url_list))

    twitter_name_config = Capabilities.Twitter().config_options_dict()["twitter_name"]
    user, message = get_discoversong_user(user_id)

    twitter_name = "@" + twitter_name_config.get_value(user)
    reply_to_tweet_id = from_tweet_id

    song, artist, url, track_key = song_artist_url_list[0]
    try:
        tweet_about_found_song(song, artist, url, mention_name=twitter_name, reply_to_tweet_id=reply_to_tweet_id)
    except twython.TwythonError as twe:
        if twe.error_code == 403:
            pass
Beispiel #3
0
 def GET(self):
   rdio, currentUser, user_id = get_rdio_and_current_user()
   disco_user, message = get_discoversong_user(user_id)
   prefs = BSONPostgresSerializer.to_dict(disco_user['prefs'])
   # circular import
   from discoversong.sources import SourceAppsManager
   
   return render.config(user=disco_user,
                        prefs=prefs,
                        capabilities=SourceAppsManager.all_capabilities(),
                        editform=editform(playlists=rdio.call('getPlaylists')['result']['owned'], prefs=get_db_prefs(user_id)),
                        env_message=get_environment_message(),
                        message=message)
def return_results(rdio, user_id, song_artist_url_list, from_tweet_id=None):
  db = get_db()
  prefs = get_db_prefs(user_id, db=db)
  
  playlist_key = prefs.get(Preferences.PlaylistToSaveTo, 'new')
  add_to_collection = prefs.get(Preferences.AddToCollection, False)
  track_keys_list = [s[3] for s in song_artist_url_list]
  
  playlists_call = rdio.call('getPlaylists')
  if 'result' in playlists_call:
    playlists = playlists_call['result']['owned']
  else:
    playlists = []
  p_keys = [playlist['key'] for playlist in playlists]
  p_names = [playlist['name'] for playlist in playlists]
  
  if playlist_key in ['new', 'alwaysnew'] or playlist_key not in p_keys:
    new_name = generate_playlist_name(p_names)
    result = rdio.call('createPlaylist', {'name': new_name,
                                          'description': 'Songs found by discoversong on %s.' % datetime.datetime.now().strftime('%A, %d %b %Y %H:%M'),
                                          'tracks': ', '.join(track_keys_list)})
    new_key = result['result']['key']
    
    if playlist_key == 'new' or playlist_key not in p_keys:
      prefs[Preferences.PlaylistToSaveTo] = new_key
      db.update(USER_TABLE, where="rdio_user_id=%i" % user_id, prefs=BSONPostgresSerializer.from_dict(prefs))
    
    # else leave 'alwaysnew' to repeat this behavior every time
  
  else:
    rdio.call('addToPlaylist', {'playlist': playlist_key, 'tracks': ', '.join(track_keys_list)})
  
  if add_to_collection:
    rdio.call('addToCollection', {'keys': ', '.join(track_keys_list)})
  
  stats.found_songs(user_id, len(song_artist_url_list))
  
  twitter_name_config = Capabilities.Twitter().config_options_dict()['twitter_name']
  user, message = get_discoversong_user(user_id)
  
  twitter_name = '@' + twitter_name_config.get_value(user)
  reply_to_tweet_id = from_tweet_id
  
  song, artist, url, track_key = song_artist_url_list[0]
  try:
    tweet_about_found_song(song, artist, url, mention_name=twitter_name, reply_to_tweet_id=reply_to_tweet_id)
  except twython.TwythonError as twe:
    if twe.error_code == 403:
      pass
Beispiel #5
0
  def GET(self):
    rdio, current_user, user_id = get_rdio_and_current_user()
    disco_user, prefs = get_discoversong_user(user_id)
    programs_page = etree.parse("http://www.kpfa.org/programs/music", etree.HTMLParser())

    divs = try_get(programs_page, '//div[@class="node"][.//a[starts-with(@href, "/playlists/show/")]]')

    shows = []
    for div in divs:
      title = try_get(div, './/h2/a[@title]/@title')
      playlists_link = try_get(div, './/a[starts-with(@href, "/playlists/show/")]/@href')
      show_num = int(playlists_link[len("/playlists/show/"):])
      shows.append(show(title=title, number=show_num))

    return render.list_shows(params=Params(user=disco_user, preferences=prefs, message="", environment_message=get_environment_message()),
                          shows=shows)
Beispiel #6
0
 def GET(self):
   rdio, currentUser, user_id = get_rdio_and_current_user()
   
   if rdio and currentUser:
     if not_allowed(user_id):
       raise web.seeother('/logout')
     
     disco_user, message = get_discoversong_user(user_id)
     stats.visited(user_id)
     # circular import
     from discoversong.sources import SourceAppsManager
     return render.loggedin(name=currentUser['firstName'],
                            message=message,
                            sourceapps=SourceAppsManager.ALL,
                            env_message=get_environment_message())
   else:
     return render.loggedout(env_message=get_environment_message())
Beispiel #7
0
 def GET(self):
   svc, current_user, user_id = get_rdio_and_current_user()
   
   if svc and current_user:
     if not_allowed(user_id):
       raise web.seeother('/logout')
     
     disco_user, prefs = get_discoversong_user(user_id)
     stats.visited(user_id)
     # circular import
     from discoversong.sources import SourceAppsManager
     return render.loggedin(params=Params(user=disco_user,
                                                preferences=prefs,
                                                message="",
                                                environment_message=get_environment_message()),
                            name=current_user['firstName'],
                            sourceapps=SourceAppsManager.ALL)
   else:
     return render.loggedout(env_message=get_environment_message())
Beispiel #8
0
  def GET(self, show_number, episode_number):
    episode_url = "http://www.kpfa.org/playlist/id/%i" % int(episode_number)
    playlist_page = etree.parse(episode_url, etree.HTMLParser())

    show_title = try_get(playlist_page, '//div[@class="field-item"]/a/text()')
    episode_title = try_get(playlist_page, '//div[@class="orangeheader"]/text()', xform=get_episode_title)

    songs = EpisodeImporter().scrape_songs(episode_number)

    rdio, current_user, user_id = get_rdio_and_current_user()
    disco_user, prefs = get_discoversong_user(user_id)

    return render.import_episode(params=Params(user=disco_user, preferences=prefs, message="", environment_message=get_environment_message()),
                                 search=search,
                                 importing=[],
                                 show_title=show_title,
                                 show_number=show_number,
                                 episode_title=episode_title,
                                 episode_number=episode_number,
                                 show_url="/import/" + show_number,
                                 songs=songs)
Beispiel #9
0
  def GET(self, show_number):
    inputs = web.input()
    p_url = inputs.get('p')
    rdio, current_user, user_id = get_rdio_and_current_user()
    disco_user, prefs = get_discoversong_user(user_id)

    show_url = "http://www.kpfa.org/playlists/show/" + show_number
    episodes_page = etree.parse(show_url, etree.HTMLParser())

    show_title = try_get(episodes_page, '//div[@class="orangeheader"]/text()')
    show_title = show_title[:show_title.index(": Playlists")]
    episode_links = try_get(episodes_page, '//a[starts-with(@href, "/playlist/id/")]')
    episodes = []
    for episode_link in episode_links:
      title = try_get(episode_link, 'text()', xform=get_episode_title)
      url = try_get(episode_link, '@href')
      number = int(url[len("/playlist/id/"):])
      episodes.append(episode(title=title, number=number))

    return render.list_episodes(params=Params(user=disco_user, preferences=prefs, message="", playlist_url=p_url, environment_message=get_environment_message()),
                                show=show(title=show_title, number=show_number),
                                episodes=episodes)
Beispiel #10
0
  def POST(self, show_number, episode_number):
    inputs = web.input()
    rdio, current_user, user_id = get_rdio_and_current_user()
    disco_user, prefs = get_discoversong_user(user_id)

    songs = EpisodeImporter().scrape_songs(episode_number)

    importing = []

    for song in songs:
      new_query = inputs.get('query_%s' % song.hash())
      if new_query != song.query:
        song.query = new_query
      for r in search(song):
        new_import = inputs.get('import_keys_%i_%s' % (song.hash(), r.key))
        if new_import:
          if r.key not in importing:
            importing.append(r.key)

    action = inputs.get('submit')
    if action.startswith('Retry'):
      return render.import_episode(params=Params(user=disco_user, preferences=prefs, message="", environment_message=get_environment_message()),
                                   search=search,
                                   importing=importing,
                                   show_title=inputs['show_title'],
                                   show_number=show_number,
                                   episode_title=inputs['episode_title'],
                                   episode_number=episode_number,
                                   show_url="/import/" + show_number,
                                   songs=songs)
    else:
      p = rdio.call('createPlaylist', {'name': inputs['pname'],
                                       'description': 'Imported by discoversong on %s' % datetime.datetime.now().strftime('%x'),
                                       'tracks': ','.join(importing),
                                       'isPublished': False})['result']
      return web.seeother("/import/%s?p=%s" % (show_number, p['shortUrl']))