# -*- coding: cp949 -*- import codeshift import id3tag_manip from interface_base import interface_base ''' Interface 모듈 CLI 환경에서 사용자로부터 명령을 입력받거나 메시지를 출력하는 등, 인터페이스와 관련된 내용이 이곳에 정의되어 있습니다. ''' # 사용자로부터 키워드를 입력받는 메뉴입니다. # base class인 interface_base에는 인터페이스의 종료 결과를 # 표시하는response 변수가 정의되어 있습니다. # 0: success, 1:fail class keyword_interface(interface_base): ''' 사용자로부터 키워드를 입력받기 위한 CLI 인터페이스입니다.''' def show_menu(self, file_name): ''' 인터페이스 시작점 함수 Args: file_name: 검색할 파일 이름 Returns: 조작이 끝나고 올바른 상태이면 0, 아니면 1을 리턴한다. Raises: 정의되지 않음 ''' self.file_info = id3tag_manip.mp3info(file_name) self.keyword_song = self.file_info[u'song'] self.keyword_artist = self.file_info[u'artist'] menustring = u'=' * 20 menustring += u' 키워드 입력 ' menustring += u'=' * 20 + u'\n' menustring += u'파일: ' + self.file_info[u'path'] + u'\n' menustring += u'기본 검색 키워드: \'%s, %s\'\n\n' % (self.keyword_song, self.keyword_artist) menustring += u'검색 키워드를 입력...\n' menustring += u'(곡명과 아티스트를 쉼표로 구분해 입력. 아티스트는 생략 가능함)\n' menustring += u'현재 키워드로 바로 검색하려면 [엔터]를 입력\n' menustring += u'[/i]: 파일 정보 보기\n' menustring += u'[/q]: 항목 편집 취소\n' # 영-한 전환이 올바르지 않아도 되도록 처리 commands = [u'/i', u'/q', u'/ㅑ', u'/ㅂ', u'*'] callbacks = [self.show_file_info, self.quit, self.show_file_info, self.quit, self.keyword_input] while self.menuhandler(menustring, commands, callbacks) == False: print u'' return self.__response def show_file_info(self, args): print u'=' * 50 print u'태그버전: ', self.file_info[u'tag_ver'] print u'경로: ', self.file_info[u'path'] print u'곡명: ', self.file_info[u'song'] print u'아티스트: ', self.file_info[u'artist'] print u'앨범명: ', self.file_info[u'album'] print u'발매일: ', self.file_info[u'release_date'] print u'시간: ', self.file_info[u'time'] print u'VBR: ', self.file_info[u'vbr'] print u'Bitrate: ', self.file_info[u'bit_rate'], u'kbps' print u'용량: ', '%.2f' % (float(self.file_info[u'size_bytes'])/float(1024*1024)), u'MiB' print u'디스크: ', self.file_info[u'disc_num'] print u'트랙: ', self.file_info[u'track_num'] print u'레이블: ', self.file_info[u'publisher'] print '' return False def quit(self, args): ''' 종료 명령 핸들러 ''' self.__response = 1 return True def keyword_input(self, str): ''' 키워드 입력 핸들러 ''' if str != '': keywords = str.split(',') if len(keywords) == 2: self.keyword_song = keywords[0].strip() self.keyword_artist = keywords[1].strip() else: self.keyword_song = keywords[0].strip() self.keyword_artist = '' print u'검색 키워드: \'%s, %s\'' % (self.keyword_song, self.keyword_artist) print u'키워드가 올바르면 엔터만 눌러주세요. 틀리면 아무 문자를 입력하세요' r = codeshift.loc2uni(raw_input()).strip() if r == u'': self.__response = 0 return True else: return False ''' id3tag_manip.mp3info() 함수로 전달받은 파일 정보 ''' file_info = None ''' 키워드: 노래 이름 ''' keyword_song = u'' ''' 키워드: 아티스트 이름 ''' keyword_artist = u'' class itemselection_interface(interface_base): ''' 검색 결과 중 하나를 선택받기 위한 CLI 인터페이스입니다.''' def show_menu(self, item_list): ''' 메뉴 시작점 함수 Args item_list: 곡 정보 검색 결과 (파싱된 콘텐츠) 중 'item' 키의 값. 이 값은 리스트로 되어 있다. Returns 0: 정상 종료. 다음 단계로 진행해도 좋음. 1: 사용자로부터 키워드 검색으로 다시 돌아가라는 명령을 받음. 2: 사용자로부터 쉘로 다시 돌아가라는 명령을 받음. Raises 정의되지 않음 ''' self.__item_list = item_list menustring = u'명령 입력...\n' menustring += u'[/l]: 결과 다시 출력\n' menustring += u'[번호]: 번호의 아이템을 선택\n' menustring += u'[/c]: 키워드 검색 단계로 돌아감\n' menustring += u'[/q]: 쉘로 돌아가기\n' commands = [u'/l', u'/c', u'/q', u'/ㅣ', u'/ㅊ', u'/ㅂ', '*'] callbacks = [self.show_list, self.cancel, self.quit, self.show_list, self.cancel, self.quit, self.select_item] self.show_list(None) while self.menuhandler(menustring, commands, callbacks) == False: print u'' return self.__response def show_list(self, str): ''' 검색된 결과를 보여줌 ''' for n in xrange(1, len(self.__item_list)+1): self.__print_item(n) print '' return False def select_item(self, str): ''' 아이템 선택 핸들러 ''' if str.isnumeric() == False: print (str+u' is not a number') return False idx = int(str) self.__print_item(idx) confirm = confirm_interface() resp = confirm.show_menu() if resp == 0: return False self.__response = 0 #success self.selnum = idx return True def cancel(self, str): ''' 아이템 선택 취소 핸들러 ''' self.__response = 1 # cancel. search by keyword again return True def quit(self, str): ''' 쉘 복귀 명령 핸들러 ''' self.__response = 2 # quit to shell return True def __print_item(self, num): if 1 <= num and num <= len(self.__item_list): song = self.__item_list[num-1] print u'=' * 50 print u'번호: %02d' % num print u'곡명: %s' % song[u'title'] print u'아티스트: %s' % song[u'artist'][u'name'] print u'앨범명: %s' % song[u'album'][u'title'] print u'' else: raise Exception(u'printing item: number exceeded the limit') ''' 리스트 중 사용자가 선택한 번호 ''' selnum = 0 ''' 곡 정보 검색 결과 (파싱된 콘텐츠) 중 'item' 키의 값. 리스트 자료형이다. ''' __item_list = None class confirm_interface(interface_base): ''' y/n 명령을 입력받기 위한 인터페이스 ''' def show_menu(self): ''' 메뉴 시작점 함수 Args Returns 1: yes 0: no Raises 정의되지 않음 ''' menustring = u'확실합니까? (y/n)' commands = [u'y', u'n', u'ㅛ', u'ㅜ'] callbacks = [self.yes, self.no, self.yes, self.no] # 기본 에러메시지 오버라이드. self.nocmd_msg = u'y나 n 중 하나만을 선택하세요.' while self.menuhandler(menustring, commands, callbacks) == False: print u'' return self.__response def yes(self, str): self.__response = 1 return True def no(self, str): self.__response = 0 return True