linux에서 제공하는 표준 API는 존재하지 않아
C++에서도 클래스를 만들어 쓰거나, 별도의 함수를 만들어 써야 한다고 한다.

일단 Encoding은 isalnum() 이 아닐경우에는 %02X로 출력해주면 될 것으로 보이고
Decoding은 %[0-9a-f][0-9a-f] 일 경우에는 %c로 출력해주면 될 것으로 보인다.

Encoding은 한글자만 보면 되지만
Decoding은 두글자를 보면서 해야 해서 귀찮을듯..

아래는 소스가 있는 페이지 이지만, 검증은 아직 해보지 않았음
  [링크 :인코딩, 디코딩 클래스]
  [링크 :]
  [링크 :]
  [링크 :]
Posted by 구차니
Posted by 구차니
wget은 HTTP나 FTP 등의 프로토콜을 통해 웹페이지나 파일을 다운받는 유틸리티이다.
아무튼 youtube에서 파일로 다운로드 받기위해 주소를 변환해서 시도를 해도
403 Forbidden 에러만 날뿐 다운로드 되지 않는다.

아무튼 쿠키를 저장하고, 이를 다시 불러들여 다운로드를 시도하면 제대로 받아진다.
쿠키를 이용해서 세션이 달라지면, 이전의 내용은 무효화 되서 그런것으로 생각된다.

Disable the use of cookies. Cookies are a mechanism for maintaining server-side state. The server sends the client a cookie using the Set-Cookie header, and the client responds with the same cookie upon further requests. Since cookies allow the server owners to keep track of visitors and for sites to exchange this information, some consider them a breach of privacy. The default is to use cookies; however, storing cookies is not on by default.

--load-cookies file
Load cookies from file before the first HTTP retrieval. file is a textual file in the format originally used by Netscape's cookies.txt file.

You will typically use this option when mirroring sites that require that you be logged in to access some or all of their content. The login process typically works by the web server issuing an http cookie upon receiving and verifying your credentials. The cookie is then resent by the browser when accessing that part of the site, and so proves your identity.

Mirroring such a site requires Wget to send the same cookies your browser sends when communicating with the site. This is achieved by ‘--load-cookies’—simply point Wget to the location of the cookies.txt file, and it will send the same cookies your browser would send in the same situation. Different browsers keep textual cookie files in different locations:

Netscape 4.x.
The cookies are in ~/.netscape/cookies.txt.
Mozilla and Netscape 6.x.
Mozilla's cookie file is also named cookies.txt, located somewhere under ~/.mozilla, in the directory of your profile. The full path usually ends up looking somewhat like ~/.mozilla/default/some-weird-string/cookies.txt.
Internet Explorer.
You can produce a cookie file Wget can use by using the File menu, Import and Export, Export Cookies. This has been tested with Internet Explorer 5; it is not guaranteed to work with earlier versions.
Other browsers.
If you are using a different browser to create your cookies, ‘--load-cookies’ will only work if you can locate or produce a cookie file in the Netscape format that Wget expects.

If you cannot use ‘--load-cookies’, there might still be an alternative. If your browser supports a “cookie manager”, you can use it to view the cookies used when accessing the site you're mirroring. Write down the name and value of the cookie, and manually instruct Wget to send those cookies, bypassing the “official” cookie support:

          wget --no-cookies --header "Cookie: name=value"

--save-cookies file
Save cookies to file before exiting. This will not save cookies that have expired or that have no expiry time (so-called “session cookies”), but also see ‘--keep-session-cookies’.

When specified, causes ‘--save-cookies’ to also save session cookies. Session cookies are normally not saved because they are meant to be kept in memory and forgotten when you exit the browser. Saving them is useful on sites that require you to log in or to visit the home page before you can access some pages. With this option, multiple Wget runs are considered a single browser session as far as the site is concerned.

Since the cookie file format does not normally carry session cookies, Wget marks them with an expiry timestamp of 0. Wget's ‘--load-cookies’ recognizes those as session cookies, but it might confuse other browsers. Also note that cookies so loaded will be treated as other session cookies, which means that if you want ‘--save-cookies’ to preserve them again, you must use ‘--keep-session-cookies’ again.

[링크 :]

--save-cookies 로 저장한 youtube 쿠키이다. 음.. 무슨 의미지 -ㅁ-?
$ cat yt.cookie
# HTTP cookie file.
# Generated by Wget on 2010-04-10 11:57:59.
# Edit at your own risk.    TRUE    /       FALSE   1586228278      PREF    f1=50000000&f2=8000000    TRUE    /       FALSE   1291604278      VISITOR_INFO1_LIVE      FNfBrJzTQY

$ wget "" --save-cookies yt.cookie
$ wget --load-cookies=yt.cookie "
tag%2Calgorithm%2Cburst%2Cfactor&fexp=904405%2C900037&algorithm=throttle-factor&itag=35&ipbits=8&burst=40&sver=3&expire=1270890000&key=yt1&signature=5C611E956FB97E74D3435F8815A7A2376E3C61D4.C2C593CDDE0C15671462BB13C5404EC6927F7F7D&factor=1.25&id=99d963576b84b350" -O file.mp4
--2010-04-10 12:33:26--
접속||:80... 접속됨.
HTTP request sent, awaiting response... 200 OK
Length: 15708973 (15M) [video/x-flv]
Saving to: `file.mp4'

100%[==========================================================================>] 15,708,973   105K/s   in 2m 0s

2010-04-10 12:35:27 (128 KB/s) - `file.mp4' saved [15708973/15708973]

URL이 너무 길어서 별도의 파일이름을 지정해주지 않으면
Cannot write to `videoplayback?ip=,expire,ip,ipbits,itag,algorithm,burst,factor&fexp=904405,900037&algorithm=throttle-factor&itag=35&ipbits=8&burst=40&sver=3&expire=1270890000&key=yt1&signature=5C611E956FB97E74D3435F8815A7A2376E3C61D4.C2C593CDDE0C15671462BB13C5404EC6927F7F7D&factor=1.25&id=99d963576b84b350' (File name too long).
주소가 255자를 넘어서는 관계로, 파일 이름으로 하기에는 너무 길다고 에러가 발생한다.
반드시 -O filename 으로 별도의 이름을 지정해 주어야 한다.

2010/04/09 - youtube 동영상 페이지 fmt_map, fmt_url_map, fmt_list, fmt_stream_map
[링크 :]

Posted by 구차니
유튜브 페이지에는 4개의 변수가 존재한다.
일단 이 녀석들을 URL decoding 해주면 아래와 같은 값으로 나오게 된다.

fmt_mapfmt_list와 내용이  유사하며
fmt_url_mapfmt_stream_map 과 내용이 유사하다.

아무튼 다운로드 주소를 얻을려면 fmt_url_map / fmt_stream_map 중에 하나에서 빼내면 된다.



하지만.. 리눅스에서 wget으로는 다운로드 되지 않는다 OTL

$ wget ""
Connecting to||:80... connected.
HTTP request sent, awaiting response... 403 Forbidden
17:55:02 ERROR 403: Forbidden.

2010/02/26 - [프로그램 사용/유튜브 (youtube)] - 유튜브 파일 다운로드 하기(download youtube as file)

Posted by 구차니
base는 웹상에서 RSS로 주어지는 URL
api는 gdata API 상에서 주어지는 URL 이다.

요녀석이 url중 api가 들어간 것의 내용(MiTeC XML Viwer)

요녀석이 url중 base가 들어간 것의 내용(MiTeC XML Viwer)

base는 각종 데이터가 웹형식이고
api는 XML 답게 데이터로 들어있다는 점이 다르다. expat 등으로 파싱을 위해서라면
api 에서 하는것이 좋을듯 하다.

2010/01/04 - [파일방] - MiTeC XML Viewer (Free!)

Posted by 구차니
만우절 이벤트로 안되게 했을리는 없고..
머가 바뀌걸까?
Posted by 구차니
유튜브의 이미지는 일반적으로

이런식으로 default.jpg로 나온다.
하지만 default.jpg 대신 hqdefault.jpg 로 하면 큰 사진으로 받아오게 된다.

default는 120x90
hqdefault는 480x360 해상도로 제공된다. 은..
YouTube IMaGe 의 약자인가?!

2010.04.09 추가
굳이 i3 이런식으로 숫자가 없어도 불려온다.
범용으로 사용하기에는[videoid]/default.jpg 혹은[videoid]/hqdefault.jpg 이 적절해 보인다.

'프로그램 사용 > 유튜브(youtube)' 카테고리의 다른 글

youtube xml / RSS 주소  (0) 2010.04.09
youTube 경로로 VLC 플레이가 안됨  (0) 2010.04.01
3D 유튜브  (6) 2010.03.15
URL encode  (2) 2010.03.02
유튜브 파일 다운로드 하기(download youtube as file)  (6) 2010.02.26
Posted by 구차니
스테레오 카메라야 머.. 가격이 2배면 간단하게 구현가능한데
음.. 아무튼 어떻게 올리고 어떤 카테고리에 들어있는건진 모르겠지만
유튜브에서 셀로판지나 매직아이 보듯 3D로 볼수 있는 컨텐츠가 있었다.

[링크 :]

여러가지 설정중에 Cross-eyed로 하면 매직아이 보듯 사파리눈 하듯 보면 보이는데
역시.. 자연스럽긴해도 눈아파 죽겠다 ㄱ-

제목이 "YouTube 3D Player Test ( yt3d:enable=true )" 이다.
[링크 :]
Posted by 구차니
파이어폭스에서 URL에 한글이 들어간걸 복사하면은
%22 이런식으로 이상한(!) 문자가 복사된다.

이런 표기를
URL encoding + UTF-8 이라고 하는거 같은데
아무튼, 유튜브에서 내부적으로 인코딩된 녀석을 풀어주기에는
적절한 서비스인것으로 보인다.

[링크 :]
[링크 :] << 웹에서 인코딩/디코딩

[링크 :] << 동시에 여러가지 보여줌

[링크 :]
Posted by 구차니
아래는 wireshark로 tcp 에서 긁어 본건데, 간단하게 URL을 빼내기는 힘들다라는 내용
[링크 :]

아래는 &t 에 &fmt 값으로 원하는 포맷으로 변경후 받는 내용
[링크 :]

하.지.만 될리가 없잖아 ㄱ-
아무튼 혼자서 또 삽질을 하면서 알아낸 것은
이 녀석을 샘플로 말하자면

이 html 페이지를 열어 보면 다음과 같은 내용이 있다.
            'VIDEO_ID': 'TMZNXW7cFCs',
            'VIDEO_TITLE': '게임테크 2010 시연 동영상  1',

            'SWF_URL': (yt.flash.canPlayV9Swf() ? (!yt.flash.canPlayH264Videos() ? "" : "") : ""),
            'SWF_ARGS': {"rv.2.thumbnailUrl": "", "rv.7.length_seconds": "600", "rv.0.url": "", "rv.0.view_count": "7243", "enablecsi": "1", "rv.2.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+8%2F14", "rv.7.thumbnailUrl": "", "rv.4.rating": "5.0", "length_seconds": "78", "rv.0.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+14%2F14", "": "junjangsoh", "rv.7.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+10%2F14", "rv.3.view_count": "6324", "allow_embed": "1", "rv.5.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+5%2F14", "rv.0.length_seconds": "564", "rv.4.thumbnailUrl": "", "fmt_url_map": "", "rv.2.rating": "5.0", "csi_page_type": "watch", "keywords": "14", "cr": "KR", "rv.1.url": "", "rv.6.thumbnailUrl": "", "": "LUs4UPyE2AI", "rv.3.rating": "5.0", "rv.6.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+13%2F14", "fmt_list": "22%2F2000000%2F9%2F0%2F115%2C35%2F640000%2F9%2F0%2F115%2C34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0", "": "2rEfw1DEtts", "rv.1.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+1%2F14", "rv.1.thumbnailUrl": "", "rv.6.length_seconds": "602", "rv.0.rating": "5.0", "watermark": "", "": "junjangsoh", "": "gfsJ3Eq_Zhs", "": "junjangsoh", "plid": "AASAfHyi-5gDThaQ", "": "POcCzju_kqk", "rv.3.length_seconds": "598", "rv.5.rating": "5.0", "rv.4.url": "", "sdetail": "p%3A%2Fvideos", "fexp": "900023%2C901802", "": "junjangsoh", "rv.1.rating": "5.0", "rv.4.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+3%2F14", "rv.5.thumbnailUrl": "", "rv.5.url": "", "rv.3.title": "%EC%97%94%EB%93%9C%EA%B2%8C%EC%9E%84+-+%EC%A7%80%EA%B5%AC+%EB%85%B8%EC%98%88%ED%99%94+%EC%B2%AD%EC%82%AC%EC%A7%84+4%2F14", "sourceid": "y", "": "junjangsoh", "rv.3.thumbnailUrl": "", "": "junjangsoh", "rv.6.url": "", "rv.7.rating": "5.0", "rv.3.url": "", "fmt_map": "22%2F2000000%2F9%2F0%2F115%2C35%2F640000%2F9%2F0%2F115%2C34%2F0%2F9%2F0%2F115%2C5%2F0%2F7%2F0%2F0", "hl": "en_US", "rv.7.url": "", "rv.2.view_count": "5454", "rv.4.length_seconds": "611", "rv.4.view_count": "7731", "rv.2.url": "", "rv.5.length_seconds": "600", "rv.0.thumbnailUrl": "", "fmt_stream_map": "", "sk": "AN-IBdoG6rDwqBQ2JAmJ7AiKj79qzYtCC", "rv.1.view_count": "25631", "rv.1.length_seconds": "596", "rv.6.rating": "5.0", "": "junjangsoh", "vq": "medium", "": "i27PAb-w0AY", "": "fmPjDH1sDfo", "rv.2.length_seconds": "600", "rv.5.view_count": "6470", "t": "vjVQa1PpcFNMsS2pAI26JfksbOObe4nVZu_ORw-B1v4%3D", "": "Cjn_lrc2b_k", "video_id": "TMZNXW7cFCs", "rv.6.view_count": "5377", "": "junjangsoh", "": "nHQokcqw2uw", "rv.7.view_count": "4854"},
            'SWF_GAM_URL': null,
            'SWF_DC_URL': null,
            'SWF_EXPRESS_URL': null,
            'SWF_AD_EURL': null,
            'SWF_IS_PLAYING_ALL': false,
            'SWF_SET_WMODE': false,

            'SHOW_AUTOSHARE': true,
            'IS_WIDESCREEN': false,
            'IS_HD_AVAILABLE': true,
            'WIDE_PLAYER_STYLES':         ["watch-wide-mode"]
            'EMBED_URL': '',
            'VIDEO_LANGUAGE': 'EN',
            'VIDEO_USERNAME': 'say2420',
            'PLAY_NEXT_FROM': '',
            'PLAY_NEXT_COUNT': '0',
            'QL_AUTOSCROLL_DEST': 0,
            'LOCALE': 'en_US',
            'AXC': '',
            'SUBSCRIBE_AXC': '',

            'PLAYER_SAVE_QUALITY': true,

            'COMMENTS_THRESHHOLD': -5,
            'COMMENTS_FILTER': 0,
            'COMMENTS_PAGE_SIZE': 10,
            'COMMENTS_MAX_PAGE': 1,
            'COMMENTS_COUNT': 4,

            'IS_BRANDED_WATCH': false

아무튼 저넘의 fmt_url_map을 들여다보자!

무언의 규칙성이 느껴지지 않는가!?
그렇다면 치환을 고고싱~

%7C 는 |
%3A 는 :
%2F 는 /
%3F 는 ?
%26 는 &
%25 는 %
%2C 는 ,
%3D 는 =

이므로 치환을 하면





의 내용이 나오게 된다.
아무튼 http:// 부터 클릭하면 다운로드를 하게 된다.
22>18 순으로 H.264를 지원하는 해상도 이므로 적절하게 다운로드!

2010/01/26 - [프로그램 사용/VLC] - VLC로 youtube 동영상 감상하기

'프로그램 사용 > 유튜브(youtube)' 카테고리의 다른 글

youtube xml / RSS 주소  (0) 2010.04.09
youTube 경로로 VLC 플레이가 안됨  (0) 2010.04.01
유튜브 썸네일 사이즈(image size of thumbnail on youtube)  (4) 2010.03.16
3D 유튜브  (6) 2010.03.15
URL encode  (2) 2010.03.02
Posted by 구차니