From 63f9c12367d7b1ebb195f7135f1ce87fededcc01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Tue, 28 Apr 2015 17:51:24 +0200 Subject: [PATCH 01/10] Point badges to the develop branch --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4fef28f4..e4ea946c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## About -[![Build Status](https://img.shields.io/travis/0xced/XCDYouTubeKit/master.svg?style=flat)](https://travis-ci.org/0xced/XCDYouTubeKit) -[![Coverage Status](https://img.shields.io/coveralls/0xced/XCDYouTubeKit/master.svg?style=flat)](https://coveralls.io/r/0xced/XCDYouTubeKit?branch=master) +[![Build Status](https://img.shields.io/travis/0xced/XCDYouTubeKit/develop.svg?style=flat)](https://travis-ci.org/0xced/XCDYouTubeKit) +[![Coverage Status](https://img.shields.io/coveralls/0xced/XCDYouTubeKit/develop.svg?style=flat)](https://coveralls.io/r/0xced/XCDYouTubeKit?branch=develop) [![Platform](https://img.shields.io/cocoapods/p/XCDYouTubeKit.svg?style=flat)](http://cocoadocs.org/docsets/XCDYouTubeKit/) [![Pod Version](https://img.shields.io/cocoapods/v/XCDYouTubeKit.svg?style=flat)](http://cocoadocs.org/docsets/XCDYouTubeKit/) [![Carthage Compatibility](https://img.shields.io/badge/carthage-✓-f2a77e.svg?style=flat)](https://github.com/Carthage/Carthage/) From cb8915a4db99834c5a724ad507c94e7ad72ed9d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Wed, 29 Apr 2015 17:04:37 +0200 Subject: [PATCH 02/10] Add unit test for the `presentInView:` method --- .../testPresentInView.json | 1 + .../XCDYouTubeVideoPlayerViewControllerTestCase.m | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 XCDYouTubeKit Tests/Cassettes/XCDYouTubeVideoPlayerViewControllerTestCase/testPresentInView.json diff --git a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeVideoPlayerViewControllerTestCase/testPresentInView.json b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeVideoPlayerViewControllerTestCase/testPresentInView.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeVideoPlayerViewControllerTestCase/testPresentInView.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/XCDYouTubeKit Tests/XCDYouTubeVideoPlayerViewControllerTestCase.m b/XCDYouTubeKit Tests/XCDYouTubeVideoPlayerViewControllerTestCase.m index cd6282f6..b70cbcc4 100644 --- a/XCDYouTubeKit Tests/XCDYouTubeVideoPlayerViewControllerTestCase.m +++ b/XCDYouTubeKit Tests/XCDYouTubeVideoPlayerViewControllerTestCase.m @@ -77,4 +77,15 @@ - (void) testRestrictedPlaybackErrorNotification [self waitForExpectationsWithTimeout:5 handler:nil]; } +- (void) testPresentInView +{ + UIView *view = [UIView new]; + XCDYouTubeVideoPlayerViewController *videoPlayerViewController = [[XCDYouTubeVideoPlayerViewController alloc] initWithVideoIdentifier:@"EdeVaT-zZt4"]; + XCTAssertNil(videoPlayerViewController.moviePlayer.view.superview); + [videoPlayerViewController presentInView:view]; + XCTAssertEqualObjects(videoPlayerViewController.moviePlayer.view.superview, view); + XCTAssertEqual(videoPlayerViewController.moviePlayer.controlStyle, MPMovieControlStyleEmbedded); + XCTAssertFalse(videoPlayerViewController.moviePlayer.currentPlaybackRate > 0.0f); +} + @end From bee34673459ac4e285cb3113efb550200f683f75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Wed, 6 May 2015 17:45:36 +0200 Subject: [PATCH 03/10] Simplify coveralls script --- .travis.yml | 2 +- Scripts/create-coveralls-script.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 18ec5b24..622cc2e3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,7 +6,7 @@ script: - export LC_CTYPE=en_US.UTF-8 - set -o pipefail - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit iOS Static Library' -destination 'platform=iOS Simulator,name=iPhone Retina (4-inch)' | xcpretty -c - - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit iOS Static Library' -destination 'platform=iOS Simulator,name=iPhone Retina (4-inch 64-bit)' OBJROOT=XCDYouTubeKit/build | xcpretty -c + - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit iOS Static Library' -destination 'platform=iOS Simulator,name=iPhone Retina (4-inch 64-bit)' OBJROOT=build | xcpretty -c - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit OS X' | xcpretty -c after_success: - ./Scripts/coveralls.sh diff --git a/Scripts/create-coveralls-script.sh b/Scripts/create-coveralls-script.sh index ffe10ed1..d9afbf01 100755 --- a/Scripts/create-coveralls-script.sh +++ b/Scripts/create-coveralls-script.sh @@ -13,7 +13,7 @@ for file in *.gcda; do gcov "\${file}" done -coveralls --root "${SRCROOT}/XCDYouTubeKit" --no-gcov --extension ".m" +coveralls --no-gcov --extension ".m" EOF chmod +x "${COVERALLS_SCRIPT_PATH}" From 4c3a9d7728037a0b9a15f94e1b0b32fefc204228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Wed, 6 May 2015 20:38:38 +0200 Subject: [PATCH 04/10] Fix coveralls script --- Scripts/create-coveralls-script.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Scripts/create-coveralls-script.sh b/Scripts/create-coveralls-script.sh index d9afbf01..ac7269d6 100755 --- a/Scripts/create-coveralls-script.sh +++ b/Scripts/create-coveralls-script.sh @@ -8,10 +8,11 @@ COVERALLS_SCRIPT_PATH="${SRCROOT}/Scripts/coveralls.sh" cat > "${COVERALLS_SCRIPT_PATH}" < Date: Thu, 14 May 2015 02:35:16 +0200 Subject: [PATCH 05/10] Simplify coveralls integration Now that cpp-coveralls properly handle spaces in paths thanks to https://github.com/eddyxu/cpp-coveralls/pull/85 we can let it run gcov for us. --- .travis.yml | 2 +- Scripts/create-coveralls-script.sh | 20 -------------------- XCDYouTubeKit.xcodeproj/project.pbxproj | 15 --------------- 3 files changed, 1 insertion(+), 36 deletions(-) delete mode 100755 Scripts/create-coveralls-script.sh diff --git a/.travis.yml b/.travis.yml index 622cc2e3..f0d61bf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,4 @@ script: - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit iOS Static Library' -destination 'platform=iOS Simulator,name=iPhone Retina (4-inch 64-bit)' OBJROOT=build | xcpretty -c - xcodebuild test -project XCDYouTubeKit.xcodeproj -scheme 'XCDYouTubeKit OS X' | xcpretty -c after_success: - - ./Scripts/coveralls.sh + - coveralls --include XCDYouTubeKit diff --git a/Scripts/create-coveralls-script.sh b/Scripts/create-coveralls-script.sh deleted file mode 100755 index ac7269d6..00000000 --- a/Scripts/create-coveralls-script.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -e - -if [[ -z "${TRAVIS_JOB_ID}" ]]; then - exit 0 -fi - -COVERALLS_SCRIPT_PATH="${SRCROOT}/Scripts/coveralls.sh" -cat > "${COVERALLS_SCRIPT_PATH}" < Date: Thu, 14 May 2015 09:49:03 +0200 Subject: [PATCH 06/10] Add a fake window.navigator object in the JavaScript context The JavaScript execution of the player script would fail with `TypeError: undefined is not an object (evaluating 'window.navigator.j')` before it could evaluate the parts required to descramble the signature. Fixes #144 --- CHANGELOG.md | 4 ++++ README.md | 2 +- .../project.pbxproj | 4 ++-- XCDYouTubeKit.podspec | 2 +- XCDYouTubeKit/XCDYouTubePlayerScript.m | 17 +++++++++++------ 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50463460..5b4d3359 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +#### Version 2.1.3 + +* Adaptation to YouTube API change. (#144) + #### Version 2.1.2 * Fixed playback of some protected videos. (#122) diff --git a/README.md b/README.md index e4ea946c..e910c4a6 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ These steps will ensure that `#import ` will work **Warning**: If you use the iOS static library and you are targeting iOS 7, add the JavaScriptCore framework. If you are targeting iOS 5 or 6, you must add the following *Other Linker Flags* instead to your app: ``` --Wl,-U,_JSContextGetGlobalObject -Wl,-U,_JSEvaluateScript -Wl,-U,_JSGlobalContextCreate -Wl,-U,_JSGlobalContextRelease -Wl,-U,_JSObjectCallAsFunction -Wl,-U,_JSObjectGetPrototype -Wl,-U,_JSObjectIsFunction -Wl,-U,_JSObjectSetProperty -Wl,-U,_JSStringCopyCFString -Wl,-U,_JSStringCreateWithCFString -Wl,-U,_JSStringRelease -Wl,-U,_JSValueIsObject -Wl,-U,_JSValueIsString -Wl,-U,_JSValueMakeString -Wl,-U,_JSValueToStringCopy +-Wl,-U,_JSContextGetGlobalObject -Wl,-U,_JSEvaluateScript -Wl,-U,_JSGlobalContextCreate -Wl,-U,_JSGlobalContextRelease -Wl,-U,_JSObjectCallAsFunction -Wl,-U,_JSObjectIsFunction -Wl,-U,_JSObjectMake -Wl,-U,_JSObjectSetProperty -Wl,-U,_JSStringCopyCFString -Wl,-U,_JSStringCreateWithCFString -Wl,-U,_JSStringRelease -Wl,-U,_JSValueIsObject -Wl,-U,_JSValueIsString -Wl,-U,_JSValueMakeString -Wl,-U,_JSValueToStringCopy ``` See my [JavaScriptCore framework availability on iOS](http://stackoverflow.com/questions/23514579/javascriptcore-framework-availability-on-ios/23514580#23514580) answer on Stack Overflow for a complete explanation. diff --git a/XCDYouTubeKit Demo/XCDYouTubeKit Demo.xcodeproj/project.pbxproj b/XCDYouTubeKit Demo/XCDYouTubeKit Demo.xcodeproj/project.pbxproj index 556e4eab..27b3a28a 100644 --- a/XCDYouTubeKit Demo/XCDYouTubeKit Demo.xcodeproj/project.pbxproj +++ b/XCDYouTubeKit Demo/XCDYouTubeKit Demo.xcodeproj/project.pbxproj @@ -507,8 +507,8 @@ "-Wl,-U,_JSGlobalContextCreate", "-Wl,-U,_JSGlobalContextRelease", "-Wl,-U,_JSObjectCallAsFunction", - "-Wl,-U,_JSObjectGetPrototype", "-Wl,-U,_JSObjectIsFunction", + "-Wl,-U,_JSObjectMake", "-Wl,-U,_JSObjectSetProperty", "-Wl,-U,_JSStringCopyCFString", "-Wl,-U,_JSStringCreateWithCFString", @@ -538,8 +538,8 @@ "-Wl,-U,_JSGlobalContextCreate", "-Wl,-U,_JSGlobalContextRelease", "-Wl,-U,_JSObjectCallAsFunction", - "-Wl,-U,_JSObjectGetPrototype", "-Wl,-U,_JSObjectIsFunction", + "-Wl,-U,_JSObjectMake", "-Wl,-U,_JSObjectSetProperty", "-Wl,-U,_JSStringCopyCFString", "-Wl,-U,_JSStringCreateWithCFString", diff --git a/XCDYouTubeKit.podspec b/XCDYouTubeKit.podspec index daa93ccf..e90a8b27 100644 --- a/XCDYouTubeKit.podspec +++ b/XCDYouTubeKit.podspec @@ -14,7 +14,7 @@ Pod::Spec.new do |s| s.public_header_files = "XCDYouTubeKit/XCDYouTube{Client,Error,Kit,Operation,Video,VideoOperation,VideoPlayerViewController}.h" s.osx.exclude_files = "XCDYouTubeKit/XCDYouTubeVideoPlayerViewController.{h,m}" s.ios.frameworks = "MediaPlayer" - s.ios.xcconfig = { "OTHER_LDFLAGS" => "-Wl,-U,_JSContextGetGlobalObject -Wl,-U,_JSEvaluateScript -Wl,-U,_JSGlobalContextCreate -Wl,-U,_JSGlobalContextRelease -Wl,-U,_JSObjectCallAsFunction -Wl,-U,_JSObjectGetPrototype -Wl,-U,_JSObjectIsFunction -Wl,-U,_JSObjectSetProperty -Wl,-U,_JSStringCopyCFString -Wl,-U,_JSStringCreateWithCFString -Wl,-U,_JSStringRelease -Wl,-U,_JSValueIsObject -Wl,-U,_JSValueIsString -Wl,-U,_JSValueMakeString -Wl,-U,_JSValueToStringCopy" } + s.ios.xcconfig = { "OTHER_LDFLAGS" => "-Wl,-U,_JSContextGetGlobalObject -Wl,-U,_JSEvaluateScript -Wl,-U,_JSGlobalContextCreate -Wl,-U,_JSGlobalContextRelease -Wl,-U,_JSObjectCallAsFunction -Wl,-U,_JSObjectIsFunction -Wl,-U,_JSObjectMake -Wl,-U,_JSObjectSetProperty -Wl,-U,_JSStringCopyCFString -Wl,-U,_JSStringCreateWithCFString -Wl,-U,_JSStringRelease -Wl,-U,_JSValueIsObject -Wl,-U,_JSValueIsString -Wl,-U,_JSValueMakeString -Wl,-U,_JSValueToStringCopy" } s.osx.frameworks = "JavaScriptCore" s.requires_arc = true end diff --git a/XCDYouTubeKit/XCDYouTubePlayerScript.m b/XCDYouTubeKit/XCDYouTubePlayerScript.m index 326f185e..3373fda4 100644 --- a/XCDYouTubeKit/XCDYouTubePlayerScript.m +++ b/XCDYouTubeKit/XCDYouTubePlayerScript.m @@ -33,13 +33,18 @@ - (instancetype) initWithString:(NSString *)string _context = JSGlobalContextCreate(NULL); - for (NSString *propertyName in @[ @"window", @"document", @"navigator" ]) + for (NSString *propertyPath in @[ @"window.navigator", @"document", @"navigator" ]) { - JSObjectRef globalObject = JSContextGetGlobalObject(_context); - JSStringRef propertyNameRef = JSStringCreateWithCFString((__bridge CFStringRef)propertyName); - JSValueRef dummyValueRef = JSObjectGetPrototype(_context, globalObject); - JSObjectSetProperty(_context, globalObject, propertyNameRef, dummyValueRef, 0, NULL); - JSStringRelease(propertyNameRef); + JSObjectRef object = JSContextGetGlobalObject(_context); + for (NSString *propertyName in [propertyPath componentsSeparatedByString:@"."]) + { + JSStringRef propertyNameRef = JSStringCreateWithCFString((__bridge CFStringRef)propertyName); + JSObjectRef defaultObject = JSObjectMake(_context, NULL, NULL); + JSObjectSetProperty(_context, object, propertyNameRef, defaultObject, 0, NULL); + JSStringRelease(propertyNameRef); + + object = defaultObject; + } } JSStringRef scriptRef = JSStringCreateWithCFString((__bridge CFStringRef)script); From 6bb54dc069906f4ccc4692ba417577e215511f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81dric=20Luthi?= Date: Thu, 14 May 2015 09:56:27 +0200 Subject: [PATCH 07/10] Update all unit test cassettes --- .../testDVRVideo.json | 28 ++-- .../testFrenchClient.json | 22 +-- .../testGeoblockedVideo.json | 54 ++++---- .../testInvalidVideoIdentifier.json | 34 ++--- .../testLiveVideo.json | 10 +- .../testMobileRestrictedVideo.json | 20 +-- .../testNilVideoIdentifier.json | 32 ++--- .../testNonExistentVideoIdentifier.json | 22 +-- .../testRemovedVideo.json | 26 ++-- .../testRestrictedVideo.json | 60 ++++---- .../testSpaceVideoIdentifier.json | 32 ++--- .../testThatVideoHasMetadata.json | 10 +- ...ideoIsAvailalbeOnDetailPageEventLabel.json | 20 +-- .../testUsingClientOnNonMainThread.json | 10 +- .../testAgeRestrictedUnratedVideo.json | 74 +++++----- .../testAgeRestrictedVEVOVideo.json | 52 +++---- .../testAgeRestrictedVideo.json | 10 +- .../testProtectedVEVOIsPlayable.json | 62 +++++---- .../testProtectedVEVOVideo1.json | 60 ++------ .../testProtectedVEVOVideo2.json | 38 +++-- .../testProtectedVEVOVideo3.json | 40 +++--- .../testAsynchronousVideoNotification.json | 10 +- ...estNoStreamAvailableErrorNotification.json | 30 +++- ...stRestrictedPlaybackErrorNotification.json | 131 ++++++++++-------- .../testVideoNotification.json | 10 +- 25 files changed, 477 insertions(+), 420 deletions(-) diff --git a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testDVRVideo.json b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testDVRVideo.json index 25255ee8..078271c1 100644 --- a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testDVRVideo.json +++ b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testDVRVideo.json @@ -1,35 +1,39 @@ [ { - "body" : "atc=a%3D3%26b%3DYXdRdQLzmfemxBiudTihOXgr13I%26c%3D1424265188%26d%3D1%26e%3DH7iQ4sAf0OE%26c3a%3D20%26hh%3DzYVgbrlHgS-0oe8OYD3TksFWNm8&errordetail=0&status=fail&eventid=5I_kVL-iDsblcpbPgegH&csi_page_type=embed&c=WEB&errorcode=150&enablecsi=1&reason=This+video+contains+content+from+International+Olympic+Committee.+It+is+restricted+from+playback+on+certain+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href%3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DH7iQ4sAf0OE%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu%3E", + "body" : "c=WEB&reason=This+video+contains+content+from+International+Olympic+Committee.+It+is+restricted+from+playback+on+certain+sites.%3Cbr%2F%3E%3Cu%3E%3Ca+href%3D%27http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DH7iQ4sAf0OE%26feature%3Dplayer_embedded%27+target%3D%27_blank%27%3EWatch+on+YouTube%3C%2Fa%3E%3C%2Fu%3E&csi_page_type=embed&status=fail&enablecsi=1&errordetail=0&atc=a%3D3%26b%3D8L7l4v-6H11DLtBVmKZxU6672V0%26c%3D1431590114%26d%3D1%26e%3DH7iQ4sAf0OE%26c3a%3D13%26hh%3D0WMC-8d3ChlkOe_jXhAm4hRzHlU&eventid=4lRUVZ77DYiJcfrjgOAM&errorcode=150", "headers" : { - "x-content-type-options" : "nosniff", "Content-Type" : "application\/x-www-form-urlencoded", - "Server" : "gwiseguy\/2.0", - "Set-Cookie" : "YSC=_CQPf0VZyeE; path=\/; domain=.youtube.com; HttpOnly", "p3p" : "CP=\"This is not a P3P policy! See http:\/\/support.google.com\/accounts\/answer\/151657?hl=en for more info.\"", - "Date" : "Wed, 18 Feb 2015 13:13:08 GMT", - "x-frame-options" : "SAMEORIGIN", + "alternate-protocol" : "443:quic,p=1", + "Set-Cookie" : "YSC=4k9Snxkngwo; path=\/; domain=.youtube.com; httponly", + "Server" : "gwiseguy\/2.0", "x-xss-protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", - "alternate-protocol" : "443:quic,p=0.08", "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", - "Cache-Control" : "no-store" + "Cache-Control" : "no-store", + "Date" : "Thu, 14 May 2015 07:55:14 GMT", + "x-content-type-options" : "nosniff", + "Accept-Ranges" : "none", + "Vary" : "Accept-Encoding", + "x-frame-options" : "SAMEORIGIN" }, "method" : "GET", "status" : 200, "uri" : "https:\/\/www.youtube.com\/get_video_info?el=embedded&hl=en&ps=default&video_id=H7iQ4sAf0OE" }, { - "body" : "hl=en_US&allow_ratings=1&url_encoded_fmt_stream_map=&host_language=en&status=ok&c=WEB&watermark=%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_watermark-vflHX6b6E.png%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_hd_watermark-vflAzLcD6.png&focEnabled=1&streaminglib_module=1&iv_module=https%3A%2F%2Fs.ytimg.com%2Fyts%2Fswfbin%2Fplayer-vflryLPRn%2Fiv_module.swf&probe_url=http%3A%2F%2Fr3---sn-h5q7dn7z.googlevideo.com%2Fvideogoodput%3Fid%3Do-ANWIplLyqagjH-gbVG4A1dfYQDMygX6UEwazuRzpD5fU%26source%3Dgoodput%26range%3D0-99999%26expire%3D1424268788%26ip%3D213.173.175.4%26ms%3Dpm%26mm%3D35%26pl%3D24%26nh%3DIgpwcjAxLm1hZDA2KgkxMjcuMC4wLjE%26sparams%3Did%2Csource%2Crange%2Cexpire%2Cip%2Cms%2Cmm%2Cpl%2Cnh%26signature%3D44456F1DC679188DEA329AFCE344D0E43252D7C5.70453C496736AFDA9AE3C6334ECF7A6BFD8F756F%26key%3Dcms1&eventid=5I_kVJKIEofEcae7gpAF&allow_embed=1&oid=bF27niETo0K-_oQcWo7tsw&live_storyboard_spec=http%3A%2F%2Fi.ytimg.com%2Fsb%2FH7iQ4sAf0OE%2Fstoryboard_live_60_3x3%2FM%24M.jpg%3Fsigh%3DwI8vJ2F9C9bbK7Jsl3yaFIOzgBw%23106%2360%233%233×tamp=1424265188&plid=AAUPXJSeC1O-ISMD&title=Beach+Volleyball+-+Men+Gold+Final+-+London+2012+Olympic+Games&hlsdvr=1&iurlsd=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fsddefault_live.jpg&rvs=title%3DMen%2527s%2BVolleyball%2BQuarterfinals%2B-%2BITA%2Bvs%2BUSA%2B%257C%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26id%3DSKq9IUO8J2E%26length_seconds%3D6546%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DBasketball%2B-%2BMen%2B-%2B%2BTUN-USA%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DYydhPZSGwS0%26length_seconds%3D6551%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DBeach%2BVolleyball%2BMen%2527s%2BQuarterfinals%2B-%2BBrazil%2Bv%2BPoland%2BFull%2BReplay%2B-%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26id%3DS3v7qAwkNtE%26length_seconds%3D3851%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DWomen%2527s%2BVolleyball%2BUSA%2Bv%2BTurkey%2B-%2BPool%2BB%2B%257C%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26id%3Dso6vcZZLhLQ%26length_seconds%3D6128%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DBeach%2BVolleyball%2B-%2BWomen%2BFinal%2BGold%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3Dm9PdBs6ub1M%26length_seconds%3D4497%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DMen%2527s%2BVolleyball%2BPreliminary%2B-%2BBRA%2Bv%2BGER%2B%257C%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26id%3DSy50f6sVgRw%26length_seconds%3D6068%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DVolleyball%2B-%2BWomen%2BGold%2BFinal%2BBRA-USA%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DCW0mQbgYlF4%26length_seconds%3D10425%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DUSA%2Bv%2BAUS%2B-%2BMen%2527s%2BBasketball%2BQuarterfinal%2B%257C%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26id%3DAiem1w_TvaA%26length_seconds%3D7187%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DFootball%2B-%2BWomen%2BGold%2Bmatch%2B%2526%2BVC%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DEAmApzeCFCM%26length_seconds%3D8969%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DVolleyball%2B-%2BMen%2BSF%2B2%2BBRA-ITA%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DD59_0LPdNSs%26length_seconds%3D5998%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DEquestrian%2B-%2BDressage%2BGPS%2BFinals%2B%2526%2BVC%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DQTOpW8GqNVk%26length_seconds%3D13222%26session_data%3Dfeature%253Dendscreen%2Ctitle%3DVolleyball%2B-%2BMen%2BGold%2BFinal%2B-%2BLondon%2B2012%2BOlympic%2BGames%26author%3DOlympics%26id%3DHUFj2r755NE%26length_seconds%3D11959%26session_data%3Dfeature%253Dendscreen&iurlhq=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fhqdefault_live.jpg&tmi=1&author=Olympics&ptchn=Tl3QQTvqHFjurroKxexy2Q&hlsvp=http%3A%2F%2Fmanifest.googlevideo.com%2Fapi%2Fmanifest%2Fhls_variant%2Fmm%2F31%2Fhfr%2F1%2Fupn%2FFDk4LASqEA8%2Fmt%2F1424265117%2Fmv%2Fm%2Fms%2Fau%2Fsignature%2FB15D9F6CFE2460DDEC9388C27AEC712E65609629.A9C4F20987BFC26E97C7F6097D37E1E9E525FEEE%2Fpmbypass%2Fyes%2Fhls_chunk_host%2Fr3---sn-2apm-f5fe7.googlevideo.com%2Fsver%2F3%2Fitag%2F0%2Fexpire%2F1424286788%2Fkey%2Fyt5%2Fipbits%2F0%2Fplaylist_type%2FDVR%2Fpl%2F24%2Fsource%2Fyoutube%2Fgcr%2Fch%2Fip%2F213.173.175.4%2Fsparams%2Fgcr%252Chfr%252Chls_chunk_host%252Cid%252Cip%252Cipbits%252Citag%252Cmm%252Cms%252Cmv%252Cpl%252Cplaylist_type%252Cpmbypass%252Csource%252Cexpire%2Ffexp%2F905657%252C907263%252C912332%252C927622%252C931397%252C934960%252C9405982%252C943917%252C947225%252C947249%252C948124%252C948703%252C952302%252C952605%252C952612%252C952901%252C955301%252C957201%252C959701%2Fid%2Fo-AIf13Vp2DxiMhqXuIUVX2G4HUs4yhQBJXyik4spnUN4Z%2Fkeepalive%2Fyes%2Ffile%2Findex.m3u8&ps=live&ldpj=-18&iurlmaxres=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fmaxresdefault_live.jpg&video_id=H7iQ4sAf0OE&avg_rating=4.85714292526&videostats_playback_base_url=https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fplayback%3Fof%3D9FOZ8ZNL5_3kpbsW6Gn7ag%26len%3D5017%26docid%3DH7iQ4sAf0OE%26fexp%3D905657%252C907263%252C912332%252C927622%252C931397%252C934960%252C9405982%252C943917%252C947225%252C947249%252C948124%252C948703%252C952302%252C952605%252C952612%252C952901%252C955301%252C957201%252C959701%26ei%3D5I_kVJKIEofEcae7gpAF%26cl%3D86530151%26ns%3Dyt%26plid%3DAAUPXJSeC1O-ISMD&csi_page_type=watch%2Cwatch7&iv_load_policy=1&ppv_remarketing_url=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F1010345782%2F%3Fcname%3D1%26data%3Dbackend%253Dinnertube%253Bcname%253D1%253Bcver%253D20150216%253Bexperiment%253D912332%253Bptype%253Dppv%253Btype%253Dview%253Butuid%253DTl3QQTvqHFjurroKxexy2Q%253Butvid%253DH7iQ4sAf0OE%26ptype%3Dppv%26cver%3D20150216%26backend%3Dinnertube&iv3_module=1&vq=auto&iv_invideo_url=https%3A%2F%2Fwww.youtube.com%2Fannotations_invideo%3Fcap_hist%3D1%26cta%3D2%26video_id%3DH7iQ4sAf0OE&no_get_video_log=1&cr=CH&keywords=Beach+Volleyball%2C2012-08-09%2C09+August+2012%2CHorse+Guards+Parade%2CSession%2COlympics%2COlympic+Games%2CLondon+2012%2C2012+Summer+Olympics%2CSummer+Games&cl=86530151&vid=H7iQ4sAf0OE&uid=Tl3QQTvqHFjurroKxexy2Q&ptk=IOC&fexp=905657%2C907263%2C912332%2C927622%2C931397%2C934960%2C9405982%2C943917%2C947225%2C947249%2C948124%2C948703%2C952302%2C952605%2C952612%2C952901%2C955301%2C957201%2C959701&ytfocHistoryEnabled=1&thumbnail_url=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fdefault.jpg&ytfocEnabled=1&pltype=content&ucid=UCTl3QQTvqHFjurroKxexy2Q&t=1&iurlmq=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fmqdefault_live.jpg&token=1&remarketing_url=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F962985656%2F%3Faid%3DP93B2tl3HUw%26label%3Dfollowon_view%26ptype%3Dno_rmkt%26cver%3D20150216%26backend%3Dinnertube%26foc_id%3DTl3QQTvqHFjurroKxexy2Q%26cname%3D1&enablecsi=1&aid=P93B2tl3HUw&atc=a%3D3%26b%3DYXdRdQLzmfemxBiudTihOXgr13I%26c%3D1424265188%26d%3D1%26e%3DH7iQ4sAf0OE%26c3a%3D26%26c1a%3D1%26hh%3DtvnNmskeeCwzxZ5taBiy1-14TZ4&fmt_list=&of=9FOZ8ZNL5_3kpbsW6Gn7ag&view_count=106982&iurl=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fhqdefault_live.jpg&account_playback_token=QUFFLUhqbWJZQVU1czBBalJSUlk4d21xR19aVFgyd0dvUXxBQ3Jtc0trNXoxcjkzbTVQeVhEelhGTVNlMGtoV0pBZ0JLQm9UTTZ4UDd0LTlYYTJqbVRPYnlYU3locTBYZEdScTkwZURLYVRGX1NqZ0Q1SVNBSzV2d0NYSkNkY2NMYzR0dzFNZ3I4Q0ZMZnJ5Q0tYX293MF9UNA%3D%3D&baseUrl=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F962985656%2F&length_seconds=5017&idpj=-6", + "body" : "video_id=H7iQ4sAf0OE&legacy_behavior=1&length_seconds=5017&is_listed=1&rvs=length_seconds%3D3933%26title%3DBeach%2BVolleyball%2BMen%2527s%2BQuarterfinals%2B-%2BLatvia%2Bv%2BUSA%2BFull%2BReplay%2B-%2BLondon%2B2012%2BOlympics%26author%3DOlympics%26endscreen_autoplay_session_data%3Dfeature%253Drelated-auto%2526autonav%253D1%2526playnext%253D0%26id%3D9NbvfbfysFw%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%2Cauthor%3DOlympics%26id%3Dz9bcVz5IPGg%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D10477%26title%3DVolleyball%2B-%2BMen%2BGold%2BFinal%2B%2526%2BVC%2BRUS-BRA%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3Dm9PdBs6ub1M%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D4497%26title%3DBeach%2BVolleyball%2B-%2BWomen%2BFinal%2BGold%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DosVIRIw-c74%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D4956%26title%3DSerena%2BWilliams%2BWins%2BWomen%2527s%2BSingles%2BGold%2B-%2BLondon%2B2012%2BOlympics%2Cauthor%3DOlympics%26id%3DXyQ_bUUwby0%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D7135%26title%3DVolleyball%2B-%2BMen%2B-%2B%2BUSA-GER%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DcYut8kBqBMw%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D6565%26title%3DHockey%2B-%2BMen%2BGold%2BMedal%2BFinal%2B%2526%2BVC%2BGER-NED%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3D1AgIZ1NH5H4%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D7983%26title%3DVolleyball%2B-%2BMen%2BBronze%2BFinal%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DsPcTJlQ6c8w%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D5484%26title%3DWeightlifting%2B-%2BMen%2B%252B105kg%2BGroup%2BA%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DEAmApzeCFCM%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D8969%26title%3DFootball%2B-%2BWomen%2BGold%2Bmatch%2B%2526%2BVC%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DTGi3HqYrWHE%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D8749%26title%3DTriathlon%2B-%2BMen%2B-%2BLondon%2B2012%2BOlympic%2BGames%2Cauthor%3DOlympics%26id%3DyH91WaU2F-E%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D5979%26title%3DMike%2B%2526%2BBob%2BBryan%2BWin%2BTennis%2BDoubles%2BGold%2BV%2BTsonga%2B%2526%2BLlodra%2B-%2BLondon%2B2012%2BOlympics%2Cauthor%3DOlympics%26id%3DhqRtwEZoiF4%26session_data%3Ditct%253DMgllbmRzY3JlZW5I4aH_gKycpNwf%26length_seconds%3D3956%26title%3DMen%2527s%2BBeach%2BVolleyball%2BPreliminary%2BRound%2B-%2BUSA%2Bv%2BESP%2B%257C%2BLondon%2B2012%2BOlympics&probe_url=http%3A%2F%2Fr20---sn-5hn7ym7e.googlevideo.com%2Fvideogoodput%3Fid%3Do-AFdMvCXx5yvNCy1I0frQoflyKDSvGDxjwqRNdpg_tIqs%26source%3Dgoodput%26range%3D0-4999%26expire%3D1431593714%26ip%3D84.74.248.239%26ms%3Dpm%26mm%3D35%26pl%3D24%26nh%3DEAI%26sparams%3Did%2Csource%2Crange%2Cexpire%2Cip%2Cms%2Cmm%2Cpl%2Cnh%26signature%3D4C47C401CA6F7D2FC2DC186050F26649566EAAA4.4C76BF52AF7E3EFA949E1A3428AF08DB314E0D83%26key%3Dcms1&iv3_module=1&eventid=4lRUVdiJE8KbcN6HgPgL&host_language=en&of=9FOZ8ZNL5_3kpbsW6Gn7ag&ptchn=Tl3QQTvqHFjurroKxexy2Q&thumbnail_url=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fdefault.jpg&apiary_host=&plid=AAUWBgw7Qn89QPXv&enablecsi=1&apiary_host_firstparty=&hlsdvr=1&vid=H7iQ4sAf0OE&t=1&atc=a%3D3%26b%3D8L7l4v-6H11DLtBVmKZxU6672V0%26c%3D1431590114%26d%3D1%26e%3DH7iQ4sAf0OE%26c3a%3D19%26c1a%3D1%26hh%3DWAYJg9k4KWqYqQEWLNA3WkQnczY&baseUrl=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F962985656%2F&token=1&innertube_api_key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8×tamp=1431590114&no_get_video_log=1&innertube_api_version=v1&url_encoded_fmt_stream_map=&cl=93552737&ldpj=-13&iv_load_policy=1&cr=CH&iurlmaxres=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fmaxresdefault_live.jpg&view_count=119990&pltype=content&ytfocEnabled=1&avg_rating=4.85964918137&ucid=UCTl3QQTvqHFjurroKxexy2Q&iurlhq=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fhqdefault_live.jpg&iurlmq=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fmqdefault_live.jpg&innertube_context_client_version=20150512&aid=P4kvqsNpN8A&iurlsd=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fsddefault_live.jpg&hlsvp=http%3A%2F%2Fmanifest.googlevideo.com%2Fapi%2Fmanifest%2Fhls_variant%2Fratebypass%2Fyes%2Fipbits%2F0%2Fmaudio%2F1%2Fip%2F84.74.248.239%2Fkeepalive%2Fyes%2Ffexp%2F901802%252C9407060%252C9408142%252C9408710%252C945137%252C948124%252C952612%252C952637%252C952642%2Fmm%2F31%2Fhfr%2F1%2Fsource%2Fyoutube%2Fid%2Fo-AFddS7Bz1q49oXYmSEh-fdT9NDwO7iLawCZ77RQpn8sw%2Fms%2Fau%2Fmt%2F1431590077%2Fpl%2F21%2Fmv%2Fm%2Fsver%2F3%2Fsignature%2FC29771A560CB856EB865A4BC25FFD1C2A6322141.07EF5FB495409D6CE58A112B7A0C25EA9A6E79C9%2Fkey%2Fyt5%2Fgcr%2Fch%2Fpmbypass%2Fyes%2Fhls_chunk_host%2Fr16---sn-1gi7znee.googlevideo.com%2Fupn%2Ffj0eKLN6HJ4%2Fsparams%2Fgcr%252Chfr%252Chls_chunk_host%252Cid%252Cip%252Cipbits%252Citag%252Cmaudio%252Cmm%252Cms%252Cmv%252Cpl%252Cplaylist_type%252Cpmbypass%252Cratebypass%252Csource%252Cexpire%2Fexpire%2F1431611714%2Fplaylist_type%2FDVR%2Fitag%2F0%2Ffile%2Findex.m3u8&allow_ratings=1&ppv_remarketing_url=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F1010345782%2F%3Fcver%3D20150512%26ptype%3Dppv%26data%3Dbackend%253Dinnertube%253Bcname%253D1%253Bcver%253D20150512%253Bptype%253Dppv%253Btype%253Dview%253Butuid%253DTl3QQTvqHFjurroKxexy2Q%253Butvid%253DH7iQ4sAf0OE%26backend%3Dinnertube%26cname%3D1&csi_page_type=watch%2Cwatch7&iv_invideo_url=https%3A%2F%2Fwww.youtube.com%2Fannotations_invideo%3Fcap_hist%3D1%26video_id%3DH7iQ4sAf0OE&remarketing_url=https%3A%2F%2Fgoogleads.g.doubleclick.net%2Fpagead%2Fviewthroughconversion%2F962985656%2F%3Flabel%3Dfollowon_view%26cname%3D1%26ptype%3Dno_rmkt%26cver%3D20150512%26aid%3DP4kvqsNpN8A%26backend%3Dinnertube%26foc_id%3DTl3QQTvqHFjurroKxexy2Q&c=WEB&watermark=%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_watermark-vflHX6b6E.png%2Chttps%3A%2F%2Fs.ytimg.com%2Fyts%2Fimg%2Fwatermark%2Fyoutube_hd_watermark-vflAzLcD6.png&account_playback_token=QUFFLUhqbmpxQXRaclVjX0F0ZnNPc2tOY1I4bmNpVks2d3xBQ3Jtc0tteVN2ak95dXpNTmM0elBIcTlTMFIyOVRDRVFBUWI3MFFuUTVCYmlJYjAzaklwbTR6cnhwZnhkSFhRZUQxRVRFWmtBMVBJS3hNOGU0MVhRRW9fam1FdF9XTTRBdDhodEQ0cGs1dUhfZUh0NWZDd2hUMA%3D%3D&player_error_log_fraction=1.0&ps=live&hl=en_US&uid=Tl3QQTvqHFjurroKxexy2Q&tmi=1&streaminglib_module=1&status=ok&keywords=Beach+Volleyball%2C2012-08-09%2C09+August+2012%2CHorse+Guards+Parade%2CSession%2COlympics%2COlympic+Games%2CLondon+2012%2C2012+Summer+Olympics%2CSummer+Games&videostats_playback_base_url=https%3A%2F%2Fs.youtube.com%2Fapi%2Fstats%2Fplayback%3Fof%3D9FOZ8ZNL5_3kpbsW6Gn7ag%26plid%3DAAUWBgw7Qn89QPXv%26len%3D5017%26ns%3Dyt%26cl%3D93552737%26ei%3D4lRUVdiJE8KbcN6HgPgL%26docid%3DH7iQ4sAf0OE%26fexp%3D901802%252C9407060%252C9408142%252C9408710%252C945137%252C948124%252C952612%252C952637%252C952642&title=Beach+Volleyball+-+Men+Gold+Final+-+London+2012+Olympic+Games&live_storyboard_spec=http%3A%2F%2Fi.ytimg.com%2Fsb%2FH7iQ4sAf0OE%2Fstoryboard_live_60_3x3%2FM%24M.jpg%3Fsigh%3DwI8vJ2F9C9bbK7Jsl3yaFIOzgBw%23106%2360%233%233&ytfocHistoryEnabled=1&ptk=IOC&iurl=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH7iQ4sAf0OE%2Fhqdefault_live.jpg&gapi_hint_params=m%3B%2F_%2Fscs%2Fabc-static%2F_%2Fjs%2Fk%3Dgapi.gapi.en.7rOxC4EUJrE.O%2Fm%3D__features__%2Fam%3DAAQ%2Frt%3Dj%2Fd%3D1%2Frs%3DAItRSTO4gz1Nv8SUg2RgiKkyXhOlRYFsWw&iv_module=https%3A%2F%2Fs.ytimg.com%2Fyts%2Fswfbin%2Fplayer-vflzutSP7%2Fiv_module.swf&author=Olympics&oid=bF27niETo0K-_oQcWo7tsw&fexp=901802%2C9407060%2C9408142%2C9408710%2C945137%2C948124%2C952612%2C952637%2C952642&idpj=-4&fmt_list=&allow_embed=1&focEnabled=1", "headers" : { "x-content-type-options" : "nosniff", "Content-Type" : "application\/x-www-form-urlencoded", "Server" : "gwiseguy\/2.0", - "Date" : "Wed, 18 Feb 2015 13:13:08 GMT", + "Cache-Control" : "no-store", + "Accept-Ranges" : "none", + "Date" : "Thu, 14 May 2015 07:55:14 GMT", "x-frame-options" : "SAMEORIGIN", + "alternate-protocol" : "443:quic,p=1", "x-xss-protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", - "alternate-protocol" : "443:quic,p=0.08", "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", - "Cache-Control" : "no-store" + "Vary" : "Accept-Encoding" }, "method" : "GET", "status" : 200, diff --git a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testFrenchClient.json b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testFrenchClient.json index fa5b0d43..78447f9e 100644 --- a/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testFrenchClient.json +++ b/XCDYouTubeKit Tests/Cassettes/XCDYouTubeClientTestCase/testFrenchClient.json @@ -1,31 +1,33 @@ [ { - "body" : "c=WEB&csi_page_type=embed&reason=Cette+vid%C3%A9o+n%27existe+pas.&enablecsi=1&errorcode=100&status=fail&atc=a%3D3%26b%3D7gIA0EP3QqPx_6RcExNe46xP3BM%26c%3D1424265188%26d%3D1%26e%3Dxxxxxxxxxxx%26c3a%3D26%26hh%3DIYjf6azw14PvmUNepPIiujD8x48&eventid=5I_kVIbPHdHScs6ihOAE", + "body" : "c=WEB&status=fail&errorcode=100&reason=Cette+vid%C3%A9o+n%27existe+pas.&atc=a%3D3%26b%3DL_VjUUtUjwwiSXoVFsySDBGzp0s%26c%3D1431590114%26d%3D1%26e%3Dxxxxxxxxxxx%26c3a%3D24%26hh%3DI96WXQX8FTHGFQMSgJvFsbxbhhE&csi_page_type=embed&enablecsi=1&eventid=4lRUVeidHYqEcqL3gLAE", "headers" : { "x-content-type-options" : "nosniff", "Content-Type" : "application\/x-www-form-urlencoded", "Server" : "gwiseguy\/2.0", - "Date" : "Wed, 18 Feb 2015 13:13:08 GMT", + "Cache-Control" : "no-store", + "Accept-Ranges" : "none", + "Date" : "Thu, 14 May 2015 07:55:14 GMT", "x-frame-options" : "SAMEORIGIN", + "alternate-protocol" : "443:quic,p=1", "x-xss-protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", - "alternate-protocol" : "443:quic,p=0.08", "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", - "Cache-Control" : "no-store" + "Vary" : "Accept-Encoding" }, "method" : "GET", "status" : 200, "uri" : "https:\/\/www.youtube.com\/get_video_info?el=embedded&hl=fr&ps=default&video_id=xxxxxxxxxxx" }, { - "body" : "status=fail&reason=Cette+vid%C3%A9o+n%27est+pas+disponible.&errorcode=150&errordetail=0", + "body" : "reason=Cette+vid%C3%A9o+n%27est+pas+disponible.&errordetail=0&errorcode=150&status=fail", "headers" : { "x-content-type-options" : "nosniff", "Content-Type" : "application\/x-www-form-urlencoded", "Server" : "gwiseguy\/2.0", - "Date" : "Wed, 18 Feb 2015 13:13:08 GMT", + "Date" : "Thu, 14 May 2015 07:55:14 GMT", "x-frame-options" : "SAMEORIGIN", "x-xss-protection" : "1; mode=block; report=https:\/\/www.google.com\/appserve\/security-bugs\/log\/youtube", - "alternate-protocol" : "443:quic,p=0.08", + "alternate-protocol" : "443:quic,p=1", "Content-Length" : "87", "Expires" : "Tue, 27 Apr 1971 19:44:06 EST", "Cache-Control" : "no-store" @@ -35,16 +37,16 @@ "uri" : "https:\/\/www.youtube.com\/get_video_info?el=detailpage&hl=fr&ps=default&video_id=xxxxxxxxxxx" }, { - "body" : "