본문

알송 가사 읽어오기 [#1 가수+제목]

1-2년전엔가 일터에서 너무나 무료한 나머지 따로 개인 프로젝트를 해보자 해서 만들었던 알송 가사 검색 프로그램, 다른 프로젝트를 올리려고 파일을 찾다가 발견했고, 오래되어 안될줄 알았지만 아직도 잘 동작이 되기에 올린다. 워낙에 WMP를 사랑하기에(foobar도 빠질 수 없지) 다른 음악 플레이어는 잘 모르고 있었는데 같이 일하던 최모씨가 알송의 존재를 알려주었다. 그는 이미 알송에 몇가지 기능이 더 추가되었으면 좋겠다고 생각해왔던터라 (WMS 기반 스트리밍 서버를 위하여) 웹버전으로 만들기로 하고, 처음 착수했던 모듈이 가사추출부분. 나중에는 가사 제작 및 포스팅 부분까지 만들었으나 같은 폴더에 두지않아(아마 최모씨가 가지고 있을수도) 좀 더 찾아봐야할것같다. 그리고 패킷분석을 위해 쌓아둔 파일들이 있었는데 이것도 어디갔는지....

개발당시 SOAP 기반으로 된 Fedex 프로젝트를 마쳤기 떄문에 패킷에 대한 이해는 충분했다. 단 상용서버에 개인용 프로그램을 올리는건 좀 그래서 개인서버쪽에 올리고보니 SOAP을 지원을 안해서 그냥 문자열을 통으로 넣어버렸다. 그리고 POST하는것은 내가 좋아하는 HttpClient - a PHP Web Client Class 를 사용하였다.(개발시에는 debug 스위치를 넣어주면 편하다) 아래의 소스는 가사만 추출하는데 초점을 맞췄기 때문에 쓸데없는 부분은 그냥 짤라버렸다.

그리고 사실 지금 소스를 보니 어떤생각으로 저 함수들을 넣었는지 생각이 안나지만(중간중간에 주석에 있는 숫자는 뭔가 의미있는것이었지만 지금은 모르겠다), 얼핏 생각나는것은, "동일한 가수+제목으로 등록된 가사들을 한번에 모두다 불러온다"는 사실과 "가끔 가사의 싱크가 아예 등록이 되지 않아있다", 그리고 "등록자가 가사를 등록하다가 지쳤는지 중간에 보면 짤린다" 등과같이 가사에 후처리가 필요하다는 사실이다. 그러고보니 아래의 소스는 실제로 사용된 소스는 아닌것 같다(이러한 후처리등이 적용된 개선된 버전이 있던것으로 기억한다)

만약 artist에 judas priest, title에 turbo라고 입력한다면 다음과 같은 결과가 나올것이다.


3102 ------------- 3041 ---------------<strInfoID>666015</strInfoID><strOnlyLyricWord>0</strOnlyLyricWord><strTitle>Turbo</strTitle><strLyric>[00:35.88]You won't hear me&lt;br&gt;[00:43.72]But you'll feel me&lt;br&gt;[00:50.07]Without warning,&lt;br&gt;[00:53.16]something's dawning, listen.&lt;br&gt;[00:00.00]&lt;br&gt;[01:02.58]Then within your senses,&lt;br&gt;[01:08.73]You'll know you're defenseless&lt;br&gt;[01:14.97]How your heart beats,&lt;br&gt;[01:18.10]when you run for cover&lt;br&gt;[01:27.40]You can't retreat,&lt;br&gt;[01:30.52]I spy like no other.&lt;br&gt;[00:00.00]&lt;br&gt;[01:39.81]Then we race together.&lt;br&gt;[01:45.98]We can ride forever.&lt;br&gt;[01:52.21]Wrapped in horse-power,&lt;br&gt;[01:55.47]driving into fury&lt;br&gt;[02:04.68]Changing gear I pull you tighter to me.&lt;br&gt;[00:00.00]&lt;br&gt;[02:13.91]I'm your turbo lover.&lt;br&gt;[02:19.84]Tell me there's no other.&lt;br&gt;[02:26.40]I'm your turbo lover.&lt;br&gt;[02:32.57]Better run for cover.&lt;br&gt;[00:00.00]&lt;br&gt;[02:41.88]We hold each other closer&lt;br&gt;[02:44.20]as we shift to overdrive&lt;br&gt;[02:47.66]And everything goes rushing by,&lt;br&gt;[02:51.09]with every nerve alive&lt;br&gt;[02:54.39]We move so fast it seems as though we've taken to the sky&lt;br&gt;[02:59.94]Love machines in harmony,&lt;br&gt;[03:03.33]we hear the engines cry.&lt;br&gt;[00:00.00]&lt;br&gt;[00:00.00]&lt;br&gt;[03:06.74]I'm your turbo lover.&lt;br&gt;[03:12.94]Tell me there's no other.&lt;br&gt;[03:18.99]I'm your turbo lover.&lt;br&gt;[03:24.99]Better run for cover.&lt;br&gt;[00:00.00]&lt;br&gt;[00:00.00]&lt;br&gt;[04:21.46]On and on we're charging to the place so many seek&lt;br&gt;[04:27.24]In perfect synchronicity of which so many speak&lt;br&gt;[04:33.83]We feel so close to heaven in this roaring heavy load&lt;br&gt;[04:39.37]And then in sheer abandonment, we shatter and explode.&lt;br&gt;[00:00.00]&lt;br&gt;[00:00.00]&lt;br&gt;[04:46.34]I'm your turbo lover.&lt;br&gt;[04:52.49]Tell me there's no other.&lt;br&gt;[04:58.68]I'm your turbo lover.&lt;br&gt;[05:04.96]Better run for cover.&lt;br&gt;[00:00.00]&lt;br&gt;[00:00.00]&lt;br&gt;[05:11.19]I'm your turbo lover.&lt;br&gt;[05:17.21]Tell me there's no other.&lt;br&gt;[05:23.58]I'm your turbo lover.&lt;br&gt;[05:30.11]Better run for cover.&lt;br&gt;</strLyric><strArtistName>Judas Priest</strArtistName><strAlbumName>Turbo Lover</strAlbumName><strRegisterFirstName>CrecentMoon</strRegisterFirstName><strRegisterFirstEMail>MSN :
lys_p@hanmail.net</strRegisterFirstEMail><strRegisterFirstURL>MSN : lys_p@hanmail.net</strRegisterFirstURL><strRegisterFirstPhone /><strRegisterFirstComment /><strRegisterName /><strRegisterEMail /><strRegisterURL /><strRegisterPhone /><strRegisterComment />


이에대한 소스는 다음과 같다. 다음 포스팅에서는 파일정보를 토대로 자동으로 가사를 검색하는 모듈을 올릴 예정이다

<?
header("Content-Type:text/html; charset=UTF-8");
include('HttpClient.php');

$title=$_POST[title];
$artist=$_POST[artist];

$string = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="ALSongWebServer/Service1Soap" xmlns:ns1="ALSongWebServer" xmlns:ns3="ALSongWebServer/Service1Soap12"><SOAP-ENV:Body><ns1:GetResembleLyric2><ns1:stQuery><ns1:strTitle>'.$title.'</ns1:strTitle><ns1:strArtistName>'.$artist.'</ns1:strArtistName><ns1:nCurPage>0</ns1:nCurPage></ns1:stQuery></ns1:GetResembleLyric2></SOAP-ENV:Body></SOAP-ENV:Envelope>';

$client = new HttpClient('lyrics.alsong.co.kr');
$client->post('/alsongwebservice/service1.asmx', $string);
echo processText($client->getContent(), 0);

function isDuplicatedZero($text) {
if(substr_count($text, '[00:00.00]')>15) return true;
else return false;
}

function getSplitText($text, $startPos) {
$endDup=strpos($text, '<strInfoID>', $startPos+20); //if it has a duplicated entry //170->220
$endSingle=strpos($text, '</ST_GET_RESEMBLELYRIC2_RETURN>', $startPos); //4400
echo "$endDup ------------- $endSingle ---------------";

if($endDup>$endSingle) $end=$endSingle;
else $end=$endDup;

$splitText=substr($text,$startPos,$end-$startPos); //substr from startPost to end-startPos(length)
if(isDuplicatedZero($splitText)) return $end; //if 00 shows more than 15times, return the next entry startpoint.
else return $splitText; //it's ok to return the text
}

function processText($text, $startPos) {
$nextStartPos=strpos($text, '<strInfoID>', $startPos);
if($nextStartPos===false) return 'Cannot find proper caption';
else {
$textOrNum=getSplitText($text, $nextStartPos); //150

if(is_numeric($textOrNum)) return processText($text, $textOrNum);
else return $textOrNum;
}
}
?>

==============
2015-11-13 추가
서버에서 반환되는 xml내용을 첨부해드리니 개발에 도움되시기 바랍니다.

judaspriest_turbo.xml

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.