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

전에 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  댓글주소  수정/삭제  댓글쓰기

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

  11. BlogIcon 뚜뚜월드 2021.03.04 19:11 신고  댓글주소  수정/삭제  댓글쓰기

    mp3 서버에 있는거 가사나오게 하는 기술 좀 나왔으면

    개발자님 신박한 물건 개발하시면

    저도 사용할 수 있게 해주세여 ㅋㅋ

    공짜루~~~

 
컴퓨터를 포맷을 해서 알송을 다시 설치하려고 사이트에 가니까 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  댓글주소  수정/삭제

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