# -*- coding: cp949 -*- import urllib2 import codeshift import util from api_base_v3 import api_base_v3 class api_search_v3(api_base_v3): ''' Maniadb OpenAPI v0.3 키워드 검색 모듈 ''' # Search for data. If an error happens, returns None def search(self, itemtype, option, query, option2 = u'', query2 = u'', display = 10): ''' 키워드 기반 검색 (앨범/아티스트/곡목) 함수. 함수에서 직접 URL을 UTF-8로 변경하므로 인수는 유니코드로 전달하여야 한다. **NOTE** itemtype과 option을 동일하게 적지 않으면 올바로 검색이 되지 않는다. query2의 값은 적지 않아도 무방하나, artist 이외의 종류는 서버에서 올바로 검색하지 못한다. Args: itemtype: 어떤 검색을 수행할지 결정한다. 'album/artist/song' 중 택일. option: 질의어로 어떤 종류를 선택할지 결정한다. 마찬가지로 'album/artist/song' 중 택일. query: 질의어. 공백은 자동으로 '+'으로 치환된다. option2: 두 번째 질의어를 선택적으로 지정할 수 있다. 실질적으로 artist 이외는 효력이 없다. query2: 질의어. option2와 query2는 모두 공백이 아닌 문자일 때만 유효하다. display: 응답으로 전달되는 XML 문서에 최대 몇 개까지의 결과를 담을지 지정할 수 있다. Returns: 서버로부터 전달된 응답 문서. XML 형식으로 되어 있다. 만일 네트워크 장애로 XML 문서를 전달받지 못한 경우 None을 리턴한다. Raises: ''' request_url = self.__make_request_url(itemtype, option, query, option2, query2, display) try: req = urllib2.urlopen(codeshift.uni2utf8(request_url)) except Exception as e: util.trace_error(u'An error in api_album_v3:', e) return None return req.read(self.max_buffer) def __make_request_url(self, itemtype, option, query, option2, query2, display): _url = self.__REQUEST_BASE_URL _url += u'?key=' + self.api_key _url += u'&' + self.api_version _url += u'&target=' + u'music' _url += u'&itemtype=' + itemtype _url += u'&option=' + option _url += u'&query=' + query.replace(u' ', u'+') if option2 != '' and query2 != '': _url += u'&option2=' + option2 _url += u'&query2=' + query2.replace(u' ', u'+') _url += u'&display=' + str(display) return _url __REQUEST_BASE_URL = u'http://www.maniadb.com/api/search.asp' if __name__ == '__main__': s = api_search_v3() r = s.search(u'song', u'song', u'Never ending stroy', u'부활') if r: print codeshift.utf82loc(r)