2015-09-03 3 views
0

Я пишу программу для чтения таблицы mysql для песни и поиска песни на youtube. Я хочу загрузить песню и поместить ее в свою учетную запись soundcloud. Я попытался написать для этого код. Проблема в том, что каждый раз, когда я бегу, я получаю следующий вопрос:Encoding Issue-Python

Non-ASCII character '\xe2' in file on line 164, but no encoding declared

Пожалуйста, помогите решить то же самое.

import youtube_dl 

from apiclient.discovery import build 
from apiclient.errors import HttpError 

import sys 
import pymysql 
import urllib2 
import urllib 
from urllib import urlopen 
import json 
import soundcloud 
from goto import goto, label 
import time 


DEVELOPER_KEY = "" 
YOUTUBE_API_SERVICE_NAME = "youtube" 
YOUTUBE_API_VERSION = "v3" 

global conn 
conn=pymysql.connect(db='twitter_users', user='root' , host='127.0.0.1' , port=3307) 
global cursor 
cursor=conn.cursor() 
client = soundcloud.Client(client_id= '', 
          client_secret= '', 
          username= '', 
          password= '') 
global song_name 
global artist_final 
global stored_title 
global genre 
def search_video(title): 
    search_response = youtube.search().list(
    q=title, 
    part="id,snippet", 
    maxResults=10 
).execute() 

    for search_result in search_response.get("items", []): 
    if search_result["id"]["kind"] == "youtube#video": 
     return search_result["id"]["videoId"], search_result["snippet"]["title"] 


##youtube_dl configuration 
class MyLogger(object): 
    def debug(self, msg): 
     pass 

    def warning(self, msg): 
     pass 

    def error(self, msg): 
     print(msg) 

def my_hook(d): 
    if d['status'] == 'downloading': 
     sys.stdout.write('\r\033[K') 
     sys.stdout.write('\tDownloading... ETA: ' + str(d["eta"]) + " seconds") 
     sys.stdout.flush() 
    elif d['status'] == 'finished': 
     sys.stdout.write('\r\033[K') 
     sys.stdout.write('\tDownload complete\n\tConverting video to mp3') 
     sys.stdout.flush() 

ydl_opts = { 
    'format': 'bestaudio', 
    'outtmpl': '%(title)s.%(ext)s', 
    'postprocessors': [{ 
     'key': 'FFmpegExtractAudio', 
     'preferredcodec': 'mp3', 
     'preferredquality': '0', 
    }], 
    'logger': MyLogger(), 
    'progress_hooks': [my_hook], 
} 


##main 
label .start 
if __name__ == "__main__": 
    youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION,developerKey=DEVELOPER_KEY) 
    query=cursor.execute("select search_term from song_downloads where Soundcloud_TID='' order by id asc limit 1") 
    if query>0: 
     query_result=cursor.fetchone() 
     term=query_result[0] 
    else: 
     goto .end  
    print("\tSearching video") 
    try: 
     videoID, videoTitle = search_video(term); 
     with youtube_dl.YoutubeDL(ydl_opts) as ydl: 
      print("\tFound video: '" + videoTitle + "' - ID: " + videoID) 
      Find=cursor.execute("select Youtube_VID from song_downloads where Youtube_VID=%s", (videoID)) 
      if find>0: 
       goto .duplicate 
      else: 
       try: 
        song_name=videoTitle.split(' - ')[1] 
       except: 
        song_name='Null' 
       try:  
        Artist_name=videoTitle.split(' - ')[0]  
        if ' feat. ' in Artist_name: 
         artist_final=Artist_name.split(' feat. ')[0] 
        elif ' feat ' in Artist_name: 
         artist_final=Artist_name.split(' feat ')[0] 
        elif ' ft ' in Artist_name: 
         artist_final=Artist_name.split(' ft ')[0] 
        elif ' ft. ' in Artist_name: 
         artist_final=Artist_name.split(' ft. ')[0] 
        elif ' featuring ' in Artist_name: 
         artist_final=Artist_name.split(' featuring ')[0] 
        elif ' Starring ' in Artist_name: 
         artist_final=Artist_name.split(' Starring ')[0] 
        elif ' Feat ' in Artist_name: 
         artist_final=Artist_name.split(' Feat ')[0] 
        elif ' Feat. ' in Artist_name: 
         artist_final=Artist_name.split(' Feat.')[0] 
        elif ' Featuring ' in Artist_name: 
         artist_final=Artist_name.split(' Featuring ')[0] 
        elif ' Ft. ' in Artist_name: 
         artist_final=Artist_name.split(' Ft. ')[0] 
        elif ' starring ' in Artist_name: 
         artist_final=Artist_name.split(' starring ')[0] 
        else: 
         artist_final=Artist_name 
       except: 
        artist_final='Null'  
       if artist_final=='Null': 
        genre='Null' 
       else: 
        try:  
         api_beg='http://developer.echonest.com/api/v4/artist/profile?api_key=OZ8G9N2O7YFPZIRXN&' 
         api_end='&bucket=genre&format=json' 
         api_final=api_beg+'name='+artist_final+api_end 
         url= urlopen(api_final).read() 
         print('url read') 
         result=json.loads(url) 
         print('result decoded') 
         genre= result['response']['artist']['genres'][0]['name'] 
        except: 
         genre='Null' 
       if artist_final=='Null': 
        album_art='Null'    
       else: 
        try:  
         api_image_beg='http://developer.echonest.com/api/v4/song/search?api_key=OZ8G9N2O7YFPZIRXN&format=json&results=1&artist=' 
         api_image_end='&bucket=id:7digital-US&bucket=tracks' 
         api_image_final=api_image_beg+artist_final+'&title='+song_name+api_image_end 
         url= urlopen(api_image_final).read() 
         result=json.loads(url) 
         album_art=result['response']['songs'][0]['tracks'][0]['release_image'] 
         print(album_art) 
        except: 
         album_art='Null'    
       print(artist_final) 
       print(genre)  
       ydl.download(['http://www.youtube.com/watch?v=' + videoID]) 
       print("\tDone") 
       stored_title=videoTitle + '.mp3' 
       cursor.execute("update song_downloads set Song_Name=%s , Artist_Name=%s, Genre=%s, Album_art_url=%s, Youtube_VID=%s, video_title=%s where Search_Term=%s" , (song_name.encode('utf-8'), artist_final('utf-8'), genre.encode('utf-8'),album_art.encode(‘utf-8’),videoID.encode('utf-8'),stored_title.encode('utf-8'), term.encode('utf-8'))) 
       conn.commit() 



track = client.post('/tracks', track={ 
    'title': song_name + '-' artist_final, 
    'genre': genre, 
    'artwork_data':album_art, 
    'asset_data': open(stored_title, 'rb') 
}) 

soundcloud_track_url=track.permalink_url 
cursor.execute("update song_downloads set Soundcloud_TID=%s where Youtube_VID=%s" , (soundcloud_track_url.encode('utf-8'),videoID.encode('utf-8'))) 
conn.commit() 
print("Track downloaded and posted to SC") 
label .duplicate 
cursor.execute("update song_downloads set Youtube_VID='duplicate' where Search_Term=%s " , (term)) 
label .end 
print("sleep for 1 minute") 
time.sleep(60) 
goto .start 


    except HttpError, e: 
     print "An HTTP error %d occurred:\n%s" % (e.resp.status, e.content)  
+0

Возможный дубликат [Python "SyntaxError: Non-ASCII character '\ xe2' in file"] (http://stackoverflow.com/questions/21639275/python-syntaxerror-non-ascii-character-xe2-in- файл) –

+0

Прошу прощения, у меня нет времени, чтобы подробно просмотреть ваш код, но это скорее всего проблема с unicode. Вероятно, вам нужно закодировать строку юникода где-то, возможно, просто используя 'string.encode ('utf8', 'replace')'. Посмотрите здесь: https://pythonhosted.org/kitchen/unicode-frustrations.html. –

+1

Как вы знаете, я вижу ошибку в строке 'cursor.execute', где у вас просто есть' artist_final ('utf-8') ', который должен быть' artist_final.encode ('utf-8') '. – CasualDemon

ответ

0

Вы использовали неправильные кавычки здесь: Change Line 164

album_art.encode ('UTF-8') -> album_art.encode ('UTF-8'),

Если вы используете шестнадцатеричный редактор, вы можете найти char 0xe2 и заменить их на 0x27.