본문

알송 가사 읽어오기 [#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

저작자 표시 비영리 변경 금지
신고

댓글 23

  • 게스트 썸네일
    2015.11.13 19:42 신고

    안녕하세요 먼저 좋은글 감사합니다.
    제가 php로 가사데이터좀 빼오려하는데
    잘안되네요 계속 strpos<strinfoId>여기서 오류가나네요
    켄낫~~~

    • 게스트 썸네일
      2015.11.13 21:02 신고

      혹시 processText에서 $text 내용은 잘 수신되시나요? 어떻게 수신되는지 알려주시면 좋을것 같습니다.
      마땅한 PHP서버가 없어서 소스테스트는 못해봤는데 우선은 가사서버는 잘 동작하고있네요~

  • 게스트 썸네일
    2015.11.13 19:51

    비밀댓글입니다

  • 게스트 썸네일
    배현우
    2015.11.15 00:19 신고

    기존
    echo processText($client->getContent(), 0);

    확인
    echo $client->getContent();
    해당 미디어 유형이 지원되지 않기 때문에 서버가 요청을 처리할 수 없습니다.
    이렇게 나오네요 ㅠ 하 정말 ㅠㅠㅠ 이런경우가 있습니까?

    • 게스트 썸네일
      2015.11.15 09:27 신고

      이 문제는 아무래도 POST header에 정보가 누락되어 발생한것 같습니다. 예전에는 안그랬는데 재현해보니 저도 그렇게 나오네요
      header에 "Content-type: text/xml;charset=utf-8"를 추가하면 될것같은데 예제에서 사용한 HttpClient에서는 헤더 수정 함수를 제공하지 않네요.
      다른 HTTP Client 라이브러리를 사용하셔서 요청하시면 될것 같습니다. 저는 요즘 PHP를 안해서 어떤 라이브러리가 있는지 잘 모르겠네요..
      해결하시고 정보공유해주시면 감사하겠습니다^^

  • 게스트 썸네일
    2015.11.15 17:57

    비밀댓글입니다

    • 게스트 썸네일
      2015.11.16 09:17 신고

      SOAPAction: ALSongWebServer/GetLyric5
      제가 알송을 안깔아놔서 패킷확인이 불가하지만 이것도 헤더에 추가해보세요. RESTClient라는 Firefox addon으로 동작 확인했습니다. 헤더에 정보를 넣지 않으면 언급하신 문제들이 발생하네요~

  • 게스트 썸네일
    배현우
    2015.11.16 22:34 신고

    와 대박이네요!! ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ됐네요 됐어요 !!!ㅋㅋㅋㅋㅋ
    아 감사합니다 ㅠㅠ!!!
    그건 포기하고 파싱이 안되서 씩겁하고 있었는데 ㅠㅠ
    저거 soap는 파싱하는법이 다른가요???
    아놔 감사합니다 ㅋㅋㅋㅋ

    • 게스트 썸네일
      2015.11.17 09:13 신고

      성공하셨네요!! 이제 파싱하시는것을 도와드리겠습니다!!ㅋㅋ
      soap은 xml기반이기 때문에 xml리더 라이브러리를 사용하시면 쉽게 처리가 가능합니다. 위에거는 그냥 strpos을 사용한거라 수정하기도 쉽지않구요.. 혹시나 잘 안되시면 인코딩문제일수도 있으니 확인해보세요

    • 게스트 썸네일
      jsjs
      2016.05.23 17:05 신고

      다른 라이브러리 다운받고 하신것은 아니고 해결하신건가요??

      어찌 파싱했는지 힌트라도 알려주실 수 있을까요?? ㅠ.ㅠ

    • 게스트 썸네일
      jsjs
      2016.05.23 17:05 신고

      다른 라이브러리 다운받고 하신것은 아니고 해결하신건가요??

      어찌 파싱했는지 힌트라도 알려주실 수 있을까요?? ㅠ.ㅠ

    • 게스트 썸네일
      2016.07.01 11:36 신고

      파싱은 다른 xml 라이브러리를 사용하셔도 되고
      위에 소스처럼 문자열을 직접 처리하셔도 됩니다

  • 게스트 썸네일
    배현우
    2015.11.19 16:12 신고

    하악 요 몇일 일이 밀려서 ㅠ 개인작업을 못하고있네요 ㅠㅠ
    한 몇일뒤에 질문계속할꺼같아요 ㅠ

    • 게스트 썸네일
      2015.11.20 15:20 신고

      괜찮습니다. 요새는 여유가 좀 있어서 매일 블로그에 출근합니다^^

  • 게스트 썸네일
    배현우
    2015.11.30 15:42 신고

    안녕하세요 ㅋㅋㅋ 다시 뵙네요 ㅎㅎ 이래저래 일이 좀 바빠서 이제야 여유가 약간 생기네요 ㅎㅎ
    날씨도 추운데 건강 잘챙기고 계신가요?
    요즘 티스토리 초대장받고 개설해서 슬슬 꾸미려구요 ㅎ 어디쪽에서 일하시는거예요?

    • 게스트 썸네일
      2015.12.02 12:59 신고

      이제는 제가 여유가 없...ㅠㅠ
      넷상에서 제건강챙겨주시는 분이 계서 행복합니다ㅋㅋㅋㅋ
      통신장비관련 일을하고있어요 프로그래밍은 설렁설렁 하고 있어요 php예전에는 열심히하다가 요새는 뜸하게됐네요ㅎ

  • 게스트 썸네일
    2015.11.30 16:41

    비밀댓글입니다

    • 게스트 썸네일
      2015.12.02 13:04 신고

      아마 xml 라이브러리등과 헷갈리신것 같아요. processText는 그냥 strpos로 <strlyric>안에 내용을 잘라서 문자열로 가져오는거에요. 적어주신건 해당 xml문서를 dom class로 wrapping 한 상황일때에야 가능합니다.

  • 게스트 썸네일
    pmk
    2015.12.11 13:15 신고

    안녕하세요. 블로그 내용 잘 보고 있습니다.
    염치없지만 궁금한게 있어서 질문드립니다.
    한글로 된 가수나 타이틀을 데이터로 넣으면 검색이 전혀 되지 않는데 보니까 인코딩이 깨져서 그런거 같은데 어떻게 해결하면 될까요?

    • 게스트 썸네일
      2015.12.14 17:56 신고

      안녕하세요, 잘 읽어주셔서 감사합니다!
      해결하셨겠지만 인코딩 관련하여는 iconv, euc-kr, utf-8 키워드로 검색하시면 도움되실 것 같습니다. 예를 들면 한글->utf-8인경우 iconv("EUC-KR", "UTF-8", $str);로 하시면 되세요

  • 게스트 썸네일
    String
    2016.04.11 19:57 신고

    잘 작동 하네요 ^^ 감사합니다.

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.

티스토리 툴바