문제가 된다면 삭제하겠습니다-_-

전에 WireShark를 이용해서 알송패킷을 캡쳐했을 때 보면 특정주소의 WebService를 요청해서 가져오게 되어있었습니다. http://mudchobo.tomeii.com/tt/434

실제 전송하는 데이터는 MD5값인데, 이게 어떻게 생성되는지 몰라서 구글에서 검색을 하니 어떤 블로그에서 시도한 흔적을 발견했습니다. 거기에 있는 댓글에서 발견했습니다^^
http://dialup.egloos.com/152001

"MP3 파일의 경우 strChecksum 값은 ID3태그등을 제외한 순수 MP3 음악 데이터를 앞에서부터 163840 바이트 읽어서 MD5로 돌린 값입니다. " 라고 친절하게 답변이....-_-

그래서 이렇게 하니까 잘 되더라구요. 아래는 샘플 코드입니다.
필요한 라이브러리는 MD5생성해주는 corelib가 필요합니다.
http://code.google.com/p/as3corelib/
[code]<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    applicationComplete="applicationCompleteHandler()">
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import flash.text.engine.ContentElement;
            import mx.messaging.messages.HTTPRequestMessage;
            import mx.rpc.http.HTTPService;
            import com.adobe.crypto.MD5;
            private function applicationCompleteHandler():void
            {
                var fs:FileStream = new FileStream();
                fs.open(new File("C:/Users/mudchobo/Downloads/임재범 - 사랑이라서.mp3"), FileMode.READ);
                var fileSize:int = fs.bytesAvailable;
               
                for (var i:int = 0; i < 500000; i++)
                {
                    if (fs.bytesAvailable >= 3 && fs.readUTFBytes(3) == "ID3")
                    {
                        var sizeByte:ByteArray = new ByteArray();
                       
                        // ID3v2길이구하기
                        fs.position += 3;
                        fs.readBytes(sizeByte, 0, 4);
                        var id3Size:int = sizeByte[0] << 21 | sizeByte[1] << 14 | sizeByte[2] << 7 | sizeByte[3];
                        fs.position = id3Size + 10;
                        break;
                    }
                }
               
                // ID3태그 없는 경우
                if (i == 500000)
                {
                    fs.position = 0;
                }
               
                // 공백있는 ID3태그에 대한 처리
                for (i = 0; i < 50000; i++)
                {
                    if (fs.readUnsignedByte() == 255)
                    {
                        var a:int = fs.readUnsignedByte();
                        if ((a >> 5) == 7)
                        {
                            fs.position += -2;
                            break;
                        }
                    }
                }
               
                // 163840만큼 읽어서 md5생성
                var data:ByteArray = new ByteArray();
                fs.readBytes(data, 0, 163840);
                var md5:String = MD5.hashBytes(data);
               
                // 웹서비스 요청
                var httpService:HTTPService = new HTTPService();
                httpService.method = HTTPRequestMessage.POST_METHOD;
                httpService.contentType = "application/soap+xml";
                httpService.url = "http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx";
                httpService.request = new XML('<?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:GetLyric5><ns1:stQuery><ns1:strChecksum>' + md5 + '</ns1:strChecksum><ns1:strVersion>2.0 beta2</ns1:strVersion><ns1:strMACAddress>ffffffffffff</ns1:strMACAddress><ns1:strIPAddress>255.255.255.0</ns1:strIPAddress></ns1:stQuery></ns1:GetLyric5></SOAP-ENV:Body></SOAP-ENV:Envelope>');
                httpService.addEventListener(ResultEvent.RESULT, resultHandler);
                httpService.addEventListener(FaultEvent.FAULT, faultHandler);
                httpService.send();
            }
           
            private function resultHandler(event:ResultEvent):void
            {
                trace("싱크가사 = " + event.result.Envelope.Body.GetLyric5Response.GetLyric5Result.strLyric);
            }
           
            private function faultHandler(event:FaultEvent):void
            {
                trace(event.toString());
            }
           
        ]]>
    </mx:Script>
</mx:WindowedApplication>
[/code]
여기서 알송가사에서 제공하는 웹서비스는 WebService인데, HTTPService로 요청한 이유는 wsdl문서가 어디있는지 못찾겠음 ㄷㄷ 그래서 그냥 httpservice로 xml통채로 넘겨버리니-_- 되더라구요 ^^
xml넘길 때 strCheckSum값만 md5구한걸로 넘기면 돼요^^

[code]싱크가사 = [00:00.00]하루 하루 그대만 보여서<br>[00:23.28]매일매일 눈을 가리고 살아<br>[00:31.34]그대 곁을 나조차도 모르게 머물며<br>[00:38.91]메마른 내 가슴이 그댈 잊어버리지 못한 이유는<br>[00:00.00]<br>[00:00.00]<br>[00:49.93]사랑이라서 사랑이라서<br>[00:56.06]두번다시 못볼 사랑이라서<br>[00:00.00]<br>[01:03.32]하늘이 하는 일 돌릴 수 없는 일<br>[01:11.39]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[01:19.51]죽어서 보라고 그래서 보라고<br>[01:26.42]그때라도 사랑한 마음이 남아있게된다면<br>[01:34.53]그때쯤에<br>[00:00.00]<br>[01:42.93]어딜가도 그대만 보여서<br>[01:49.88]매일매일 나를 지우고 살아<br>[01:57.28]한순간도 바람처럼 떠날줄 모르고<br>[02:04.71]죽어도 내가슴이 그댈 떠나보내지 못한 이유는<br>[00:00.00]<br>[02:15.49]사랑이라서 사랑이라서<br>[02:23.68]가슴가득 맺힌 사랑이라서<br>[00:00.00]<br>[02:29.68]하늘이 하는 일 돌릴 수 없는 일<br>[02:37.81]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[02:45.79]죽어서 보라고 그래서 보라고<br>[02:52.51]그때라도 사랑한 마음이 남아있게 된다면<br>[03:00.90]그때쯤에<br>[00:00.00]<br>[03:04.66]간절히 바랬어 너에게 가는일<br>[00:00.00]<br>[03:33.19]하늘이 하는 일 돌릴 수 없는 일<br>[03:41.80]이렇게 사는게 힘들면 그녈 보내줄텐데<br>[03:49.23]죽어서 보라고 그래서 보라고<br>[03:56.56]그때라도 사랑한 마음이 남아있게된다면<br>[04:04.29]그때쯤에<br>[/code]

PS. HTTPService에서 xml전송해서 하는 거 어떻게 하는지 몰랐는데, 그냥 httpservice에 있는 request객체에 xml을 생성해서 넣어주면 된다는....-_-

 
Posted by 머드초보

댓글을 달아 주세요

  1. BlogIcon 쿠나 2010.01.17 16:27  댓글주소  수정/삭제  댓글쓰기

    우와~ 감사합니다 :)
    POST 헤더를 어떻게 만들어서 보내야하는지 전전긍긍했는데 도움 많이 되었어요~

    • 머드초보 2010.01.19 11:57  댓글주소  수정/삭제

      아....도움이 되셨다니 다행이네요^^
      근데 이글은 알송가사서버에 비정상접속에 대한 글에서....얻으셨다니!-_-

  2. plz 2010.05.31 00:46  댓글주소  수정/삭제  댓글쓰기

    죄송한데 이걸 C++로 바꿔주시면 안될까요

  3. 궁금이 2010.07.24 05:09  댓글주소  수정/삭제  댓글쓰기

    for (i = 0; i < 50000; i++)
    {
    if (fs.readUnsignedByte() == 255)
    {
    var a:int = fs.readUnsignedByte();
    if ((a >> 5) == 7) //굳이 5와 7로 값을 정한이유가 왜죠?
    {
    fs.position += -2; //포지션이 두칸뒤로가면 계속 돌지않나요?
    break;
    }
    }
    }

    • 머드초보 2010.07.25 19:04  댓글주소  수정/삭제

      헐....저도 기억이....나질 않네요-_-
      몬가 ID3값에 공백이 있어서 몬가 처리해놓은 것 같은데....-_-

  4. tri**** 2010.11.03 09:32  댓글주소  수정/삭제  댓글쓰기

    정말 배울게 많은 곳이에요~

    Flex 공부하면서 많이 보고갑니다.

  5. Dect 2012.01.08 16:37  댓글주소  수정/삭제  댓글쓰기

    꼭 ID3를 보내야하나요?
    그냥 HTTP만 보내도 될듯한데..

  6. Dect 2012.01.11 20:23  댓글주소  수정/삭제  댓글쓰기

    죄송합니다. 한가지만 더 여쭙겠습니다..;

    SetFilePointer fh, ExistSize, 0, FILE_BEGIN
    ReadFile fh, Buff(0), 163840, 0, ByVal 0

    ExistSize 로 헤더의 크기를 구한다음
    그 헤더의 끝. 그러니까 순수 음악데이터를 가져온후
    163840 까지 읽어 들였습니다. 그러고 ByteHash 를 돌려
    값을 구했는데요.. 자꾸 딴 값이 나옵니다.ㅠㅠ

    JavaScript는 아니지만 원리를 도저히 모르겠습니다.. ( MD5에서 3일째.. )

    MD5가 다른건가요? 아니면
    저 가져오는 소스가 잘못된건가요?

  7. BlogIcon 토리;s 2012.02.18 06:35  댓글주소  수정/삭제  댓글쓰기

    전 빌더를 안써서 ..httpService 가없다는 비극이!

  8. BlogIcon 토리&#039;s 2012.05.21 20:23  댓글주소  수정/삭제  댓글쓰기

    SOAP 요청부가 바뀐듯한데...전..분석해도 모르겟네요ㅜ

  9. BlogIcon 토리&#039;s 2012.05.22 01:21  댓글주소  수정/삭제  댓글쓰기

    아. 그리고 wsdl 은
    http://lyrics.alsong.co.kr/alsongwebservice/service1.asmx?wsdl
    요깁니당.

  10. BlogIcon 혁이s 2013.02.28 14:31  댓글주소  수정/삭제  댓글쓰기

    혹시 웹에서도 가수+노래제목 으로 가사데이터를 가져올수 잇나요?

 
오 이런게 있는줄 몰랐군요-_-(역시 무식하면 몸이 고생합니다!) 이걸로 요청한 데이터와 응답받은 데이터를 쉽게 확인할 수 있겠죠^^
더욱 놀라운 것은 무료라는 것!(물건 팔러온 것 같군요) 하지만 영어.....OTL.....요즘은 유명하지 않은 프로그램도 한글판이 있고 그러던데...와이어샤크도 한글패치를....-_-

우선 설치를 해봅시다!
http://www.wireshark.org/download.html
저는 64bit여서 64비트용으로 받았네요^^

설치를 하면 되는데요. 설치를 하다보면 Install WinPcap을 설치할 것인지 물어보는데요.
저는 뭐 부가적으로 설치하는건가...이런식으로 끼워팔면 안돼! 당당히 Install체크를 해제했는데, 꼭 필요한 것입니다-_- 체크하고 설치하세요-_-
사용자 삽입 이미지
설치가 완료되면 실행해봅시다.

실행하면 DashBoard같은 것이 나오는데, Capture부분에 어떤 걸 캡쳐시작할 것인지 선택할 수 있는데, 자신의 랜카드는 백방 첫번째로 나오는 것 같습니다-_- 제 회사컴도 그렇고, 제 놋북도 그렇고-_-
암튼, 첫번째꺼 클릭하면 캡쳐가 시작됩니다. 웹서핑을 시작하면 미친듯이 로그가 올라가요-_-

이런 게 있으면 가장 궁금했던 알송가사는 어떻게 전송되는지 확인해봅시다-_-
알송으로 노래를 아무거나 하나 듣습니다. 그럼 뭔가 패킷을 주고 받았습니다.
사용자 삽입 이미지
알송가사 웹서비스가 있군요. SOAP으로 주고 받는 듯 합니다. 전송할 때 strCheckSum, strVersion, strMACAddress, strIPAddress값을 넘기네요. strCheckSum으로 해당 MP3파일에 대한 유니크한 값을 전송해서 해당 파일에 대해 가사가 등록되었는지 확인 후 넘겨주는 듯합니다.

가사가 있으니 응답패킷을 살펴보니 이렇네요.
[00:00.59]Is this the real life~~~~ 이런식으로 넘어오네요.
사용자 삽입 이미지

이런 soap을 이용한 webservice로 통신을 하는줄 몰랐네요.
암튼, 매우 유용한 패킷분석기네요^^

 
Posted by 머드초보

댓글을 달아 주세요

  1. skywalker 2009.09.01 15:56  댓글주소  수정/삭제  댓글쓰기

    아...웹사이트 패킷분석은 파이어폭스의 플러그인인 'firebug'도 상당히 쓸만하죠.

    • 머드초보 2009.09.09 17:40  댓글주소  수정/삭제

      와....파이어버그에는 없는기능이 없군요 ^^
      전 간간히 javascript디버거 용으로 쓰긴 하지만, 패킷도 다 보이는군요^^

  2. 구경꾼 2010.02.16 01:46  댓글주소  수정/삭제  댓글쓰기

    패킷값을 바꾸면 어떻게되나요..

    전문지식전혀없는사람입니다.ㅎ

    • 머드초보 2010.02.16 11:50  댓글주소  수정/삭제

      일단 와이어샤크는 패킷감시만 할 수 있구요.
      패킷값을 바꿔서 보내는 건 뭐 가능하겠지만, 제가 어떻게 하는지 모르겠구요-_-
      저렇게 그냥 똑같이 만들어서 보내는 건 뭐 가능합니다^^
      그냥 뭐 요청하는거다보니-_- 똑같이 http요청만들어서 보내면 됩니다^^

 
컴퓨터를 포맷을 해서 알송을 다시 설치하려고 사이트에 가니까 2.0이 새로 나왔더군요. 아직 2.0Beata여서 자동업그레이드를 제공하지 않았던 것이군요.
국내 MP3플레이어 중에서는 최고라고 생각하고 있는 알송! 왜냐하면 사용자가 많아서 인지 가사가 다 잘나오거든요^^ 가사는 사용자가 직접 등록하는 것인데, 신기하게도 희귀한 음악 빼곤 왠만해선 가사가 다 입력이 되어있습니다^^ 사용자가 많으니 이런 점이 참 좋죠^^ 게다가 플레이어 기능도 전혀 불편하지가 않죠. 전 그래서 알송을 애용해요~ ^^

2.0에서 새로 생긴 기능을 한번 살펴봅시다.
모양은 아래와 같이 바뀌었군요.
사용자 삽입 이미지
스크린샷을 보면 알송으로 무엇을 할 수 있는지가 한눈에 보이네요. 게다가 mp3파일에 앨범커버가 있으면 커버도 보여주네요^^ 앨범커버를 보여줘야 역시 뭔가 간지가 나죠-_-

1. 아이튠즈와 비슷한 기능중 하나인 재생목록기능
이건 자신만의 재생목록을 만들 수 있습니다. 새 재생목록 추가버튼 클릭하고, 새로운 재생목록을 만들어서 음원을 추가하면 재생목록을 만들 수 있습니다. 재생목록을 분리해서 정리해놓으면 듣고 싶을 때 노래도 쉽게 찾을 수 있겠죠.
게다가 추가로 많이 들은 음악, 최근 들은 음악을 제공합니다. 많이 들은 음악은 알송으로 재생한 곡수를 통계를 내어서 가장 많이 들었던 노래를 순위별로 보여주죠. 아이튠즈에 있던 기능들이죠^^
사용자 삽입 이미지

재생목록 관리 화면


2. MP3플레이어와 직접적인 연동
여기서 말하는 MP3플레이어는 알송이 아닌 기기를 말합니다-_- 제가 가지고 있는 s9와 연결해보겠습니다.
연결하면 신기하게 인식을 하는군요^^
사실 이 기능은 뭐 그냥 자신의 하드드라이브에 있는 곡들을 MP3Player로 이동식디스크로 복사하는 건데, 좀 더 편하게 현재 재생되고 있는 노래나 재생목록에 있는 곡들을 쉽게 복사할 수 있죠^^
사용자 삽입 이미지

MP3남은 용량도 볼 수 있네요.

아 기존부터 벨소리 만들기 기능이 있었는데요. 벨소리 사는 것도 있네요. 만드는 것과 벨소리 파는 것을 공존시키다니-_- 뭐 해당 음원이 없으면, 구입할 수도 있겠네요^^
사운드효과는 뭐 제가 막귀여서 이런 기능은 저한테 사치죠-_-

디자인도 깔끔하고 맘에 드네요 하지만 이런 기능들은 다 필요없고-_- 알송을 쓰는 이유는 단하나입니다-_-
싱크가사죠-_- 방대한 양의 싱크가사가 존재합니다. 몇백만 되는 사용자들의 노가다 정성이 들어간 멋진 기능이죠. 이 기능때문에 알송을 포기할 수 없어요-_-

 
Posted by 머드초보

댓글을 달아 주세요

  1. 알송2.0 아오 !! 2009.08.18 20:56  댓글주소  수정/삭제  댓글쓰기

    가장 중요한게 불편함 ㅡㅡ,,

    구버전에서는 화살표 누르면 다음곡 , 이전곡 , 소리 음량 이런거 다되는데

    신버전에는 마우스로 하나하나 클릭해서 해야돼 아오 알송 몹쓸 프로그램

    • 머드초보 2009.08.23 19:23  댓글주소  수정/삭제

      아....키보드 단축키를 주로 쓰셨군요.
      음 그런 점이 있었군요-_-
      이스트소프트에 문의해보세요 해줄꺼에요! ^^

 

사용자 삽입 이미지

알송에다가 대고 마우스 오른쪽버튼 누르면 나온다.



 

벨소리를 제작하려면 매우 사운드편집 프로그램으로 빡씨게 편집하고 그래야 했는데

알송에서는 매우 쉽게 제작할 수 있도록 자체적으로 벨소리를 만들어 주는 기능을 제공한다.

제작하고 싶은 노래 재생 중에 '휴대폰 벨소리 제작하기'를 클릭하면

아래와 같은 화면이 나온다.


사용자 삽입 이미지




벨소리시간을 설정하게 되면 맨위에 있는 푸른 상자 크기가 늘어난다.

노래의 범위를 정하는것이다.

<1초를 클릭하면 현재 지정된 범위에서 전체적으로 1초 앞당기는 것이고 1초>를 클릭하면

전체적으로 1초 늦추는 것이다.

여기서 아쉬운 점이라면 1초간격으로 이동하기 때문에 미세한 조절은 불가능 하다.

재생버튼, 정지버튼, 노래선택버튼이 있다.

화음은 40, 64화음 밖에 선택을 하지 못한다. 최근 128화음 핸드폰이 점점 나오고 있는데

128화음으로 제작하려면 사운드 편집프로그램을 통해서 제작하면 된다.(시간나면 올려야지--;)


볼륨평준화는 내가 테스트를 해보니 체크를 하는게 좋은 것 같았다.

체크를 하지 않으면 지나치게 고음인 부분에서 살짝 찢어지는 느낌을 받을 수 있기 때문이다.

점점 크게는 처음 도입부분에 소리를 점점 키워서 재생시키는 것이다. (Fade In 같은거)

점점 작게는 마지막 끝날 때 소리를 점점 작게 하여 재생시키는 것이다.(Fade Out 같은거)

스테레오와 모노 설정 하는 것이 있는데 모노로 해야한다-_-; 스테레오로하면 소리가 이상하다.

내 핸드폰은 투스피커로 스테레오인데도 이상했다. 모노로 해야한다-_-;



사용자 삽입 이미지



위와 같이 설정하면 핸드폰에서도 무리없이 재생 될 것이다.

여러가지 테스트를 거쳐서 자신의 핸드폰에 가장 잘 맞는 음질로 해서 저장하면 된다.

간혹가다가 핸드폰에 파일크기 제약이 있는 핸드폰에 있는데 그것을 위해 친절하게

파일 크기가 얼마가 나오는지도 보여준다. 자신의 핸드폰의 한계용량으로 해서 넣으면 된다.

 
Posted by 머드초보

댓글을 달아 주세요