video_info 2.6.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/workflows/unit_test.yml +39 -0
- data/.gitignore +0 -1
- data/.rubocop.yml +242 -1
- data/CONTRIBUTING.md +11 -0
- data/Gemfile +1 -1
- data/Guardfile +2 -2
- data/README.md +29 -7
- data/lib/video_info.rb +25 -28
- data/lib/video_info/provider.rb +25 -12
- data/lib/video_info/providers/dailymotion.rb +19 -3
- data/lib/video_info/providers/vimeo.rb +3 -3
- data/lib/video_info/providers/vimeo_api.rb +20 -11
- data/lib/video_info/providers/vimeo_scraper.rb +93 -23
- data/lib/video_info/providers/wistia.rb +2 -1
- data/lib/video_info/providers/youtube.rb +16 -2
- data/lib/video_info/providers/youtube_api.rb +42 -8
- data/lib/video_info/providers/youtube_scraper.rb +64 -31
- data/lib/video_info/providers/youtubeplaylist.rb +5 -2
- data/lib/video_info/providers/youtubeplaylist_api.rb +22 -1
- data/lib/video_info/providers/youtubeplaylist_scraper.rb +16 -3
- data/lib/video_info/version.rb +1 -1
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/_available_/with_invalid_video_url/_available_/1_2_2_1_1.yml +82 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/_available_/with_valid_video/_available_/1_2_1_1_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_author/1_3_7_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_author_thumbnail/1_3_9_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_author_url/1_3_8_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_date/should_show_correct_date.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_description/1_3_10_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_duration/1_3_12_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_keywords/1_3_11_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail/1_3_21_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_large/1_3_18_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_medium/1_3_17_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_small/1_3_16_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_title/1_3_6_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_view_count/1_3_22_1.yml +91 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_password_required_video/_available_/1_2_3_1_1.yml +151 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_password_required_video/_available_/2_2_3_1_1.yml +68 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_this_video_does_not_exist_video/_available_/1_2_2_1_1.yml +127 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_this_video_does_not_exist_video/_available_/2_2_2_1_1.yml +70 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_valid_video/_available_/1_2_1_1_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_valid_video/_available_/2_2_1_1_1.yml +68 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/author/1_13_2_1.yml +130 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/author_thumbnail/1_13_3_1.yml +130 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/author_url/1_13_4_1.yml +132 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/available_/1_13_1_1.yml +130 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/date/1_13_7_1.yml +128 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/description/1_13_6_1.yml +131 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/duration/1_13_8_1.yml +130 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/height/1_13_10_1.yml +131 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/keywords/1_13_9_1.yml +128 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/thumbnail_large/1_13_14_1.yml +129 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/thumbnail_medium/1_13_13_1.yml +129 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/thumbnail_small/1_13_12_1.yml +129 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/title/1_13_5_1.yml +130 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/view_count/1_13_15_1.yml +129 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_unavailable_video/width/1_13_11_1.yml +129 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author/1_3_20_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author/2_3_20_1.yml +80 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_thumbnail/1_3_19_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_thumbnail/2_3_19_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_url/1_3_21_1.yml +159 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_url/2_3_21_1.yml +80 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_date/should_have_correct_upload_date.yml +240 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_description/1_3_7_1.yml +160 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_description/2_3_7_1.yml +80 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_duration/1_3_9_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_duration/2_3_9_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_height/1_3_11_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_height/2_3_11_1.yml +80 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_keywords/should_return_a_string_list_of_keywords.yml +240 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail/1_3_18_1.yml +236 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail/2_3_18_1.yml +82 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_large/1_3_15_1.yml +236 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_large/2_3_15_1.yml +82 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_medium/1_3_14_1.yml +235 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_medium/2_3_14_1.yml +84 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_small/1_3_13_1.yml +236 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_small/2_3_13_1.yml +84 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_title/1_3_6_1.yml +159 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_title/2_3_6_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_view_count/1_3_22_1.yml +158 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_view_count/2_3_22_1.yml +84 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_width/1_3_10_1.yml +156 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_width/2_3_10_1.yml +82 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail/1_12_1_1.yml +234 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail/2_12_1_1.yml +78 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_large/1_12_2_1.yml +233 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_large/2_12_2_1.yml +78 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_medium/1_12_3_1.yml +235 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_medium/2_12_3_1.yml +73 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_small/1_12_4_1.yml +234 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_141349194/thumbnail_small/2_12_4_1.yml +77 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/_available_/with_invalid_video/_available_/1_2_2_1_1.yml +75 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/_available_/with_valid_video/_available_/1_2_1_1_1.yml +79 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_duration/1_4_7_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_height/1_4_9_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_large/1_4_12_1.yml +86 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_medium/1_4_11_1.yml +86 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_small/1_4_10_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_title/1_4_6_1.yml +86 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_width/1_4_8_1.yml +86 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_duration/1_3_7_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_height/1_3_9_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail/1_3_15_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_large/1_3_12_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_medium/1_3_11_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_small/1_3_10_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_title/1_3_6_1.yml +85 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_width/1_3_8_1.yml +87 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_available_/1_2_2_1_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_available_/2_2_2_1_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_date/1_2_2_11_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_date/2_2_2_11_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_description/1_2_2_8_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_description/2_2_2_8_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_duration/1_2_2_10_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_duration/2_2_2_10_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_keywords/1_2_2_9_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_keywords/2_2_2_9_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_title/1_2_2_7_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_title/2_2_2_7_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_view_count/1_2_2_18_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_view_count/2_2_2_18_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_valid_video/_available_/1_2_1_1_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_valid_video/_available_/2_2_1_1_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_video_removed_because_of_copyright_claim/_available_/1_2_3_1_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_video_removed_because_of_copyright_claim/_available_/2_2_3_1_1.yml +114 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_a_video_without_description/_description/1_1_1_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_date/should_return_date_video_was_posted.yml +249 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_description/1_17_7_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_description/2_17_7_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_duration/1_17_9_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_duration/2_17_9_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_keywords/1_17_8_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_keywords/2_17_8_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_title/1_17_6_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_title/2_17_6_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_view_count/1_17_17_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_view_count/2_17_17_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author/1_3_6_1.yml +115 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author/2_3_6_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_thumbnail/1_3_7_1.yml +115 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_thumbnail/2_3_7_1.yml +335 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_url/1_3_8_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_url/2_3_8_1.yml +335 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_url/can_be_called_twice_and_receive_the_same_value.yml +391 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_date/should_return_date_video_was_posted.yml +243 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_description/1_3_10_1.yml +60 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_description/2_3_10_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_duration/1_3_12_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_duration/2_3_12_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_keywords/1_3_11_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_keywords/2_3_11_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_title/1_3_9_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_title/2_3_9_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_view_count/1_3_21_1.yml +59 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_view_count/2_3_21_1.yml +187 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_invalid_playlist/_available_/1_2_2_1_1.yml +120 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_list_url/_available_/1_2_3_1_1.yml +154 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_valid_playlist/_available_/1_2_1_1_1.yml +154 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author/1_3_21_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_thumbnail/1_3_22_1.yml +274 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_url/1_3_23_1.yml +274 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_description/1_3_7_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_keywords/1_3_8_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail/1_3_18_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_large/1_3_15_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_large_2x/1_3_16_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_maxres/1_3_17_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_medium/1_3_14_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_small/1_3_13_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_title/1_3_6_1.yml +165 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_videos/returns_list_of_videos_in_playlist.yml +112 -0
- data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_that_does_not_exist_in_embed_path/_videos/1_4_2_1.yml +114 -0
- data/spec/lib/video_info/provider_spec.rb +42 -22
- data/spec/lib/video_info/providers/dailymotion_spec.rb +75 -27
- data/spec/lib/video_info/providers/vimeo_spec.rb +270 -174
- data/spec/lib/video_info/providers/wistia_spec.rb +59 -20
- data/spec/lib/video_info/providers/youtube_playlist_spec.rb +97 -41
- data/spec/lib/video_info/providers/youtube_scraper_spec.rb +14 -0
- data/spec/lib/video_info/providers/youtube_spec.rb +441 -384
- data/spec/lib/video_info_spec.rb +27 -25
- data/spec/spec_helper.rb +6 -1
- data/tmp/rspec_guard_result +25 -0
- data/video_info.gemspec +11 -14
- metadata +358 -100
- data/.travis.yml +0 -13
- data/foo.txt +0 -33
- data/lib/video_info/providers/vkontakte.rb +0 -170
- data/spec/lib/video_info/providers/vimeo_api_spec.rb +0 -242
- data/spec/lib/video_info/providers/vkontakte_spec.rb +0 -173
- data/spec/lib/video_info/providers/youtube_api_spec.rb +0 -476
- data/spec/lib/video_info/providers/youtube_playlist_api_spec.rb +0 -187
data/.travis.yml
DELETED
data/foo.txt
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
Run options: include {:focus=>true}
|
2
|
-
|
3
|
-
All examples were filtered out; ignoring {:focus=>true}
|
4
|
-
.........F...............Document(
|
5
|
-
doctype: Doctype(name: "html")
|
6
|
-
children: NodeSet(Text("\n"), Element(name: "html" attributes: [Attribute(name: "lang" value: "en")] children: NodeSet(Text("\n "), Element(name: "head" children: NodeSet(Text("\n "), Element(name: "meta" attributes: [Attribute(name: "charset" value: "utf-8")]), Text("\n\n\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "viewport"), Attribute(name: "content" value: "width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no")]), Text("\n \n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "preconnect"), Attribute(name: "href" value: "//player.vimeo.com")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "preconnect"), Attribute(name: "href" value: "//i.vimeocdn.com")]), Text("\n"), Element(name: "meta" attributes: [Attribute(name: "property" value: "fb:app_id"), Attribute(name: "content" value: "19884028963")]), Text("\n\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:site_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:url"), Attribute(name: "content" value: "https://vimeo.com/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:type"), Attribute(name: "content" value: "video")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:title"), Attribute(name: "content" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image"), Attribute(name: "content" value: "https://i.vimeocdn.com/video/34373130_1280x720.jpg")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:image:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:url"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029?autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:secure_url"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029?autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:type"), Attribute(name: "content" value: "text/html")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:url"), Attribute(name: "content" value: "https://vimeo.com/moogaloop.swf?clip_id=898029&autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:secure_url"), Attribute(name: "content" value: "https://vimeo.com/moogaloop.swf?clip_id=898029&autoplay=1")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:type"), Attribute(name: "content" value: "application/x-shockwave-flash")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "og:video:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:app_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:app_store_id"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:ios:url"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:app_name"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:package"), Attribute(name: "content" value: "com.vimeo.android.videoapp")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:android:url"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "al:web:should_fallback"), Attribute(name: "content" value: "true")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "cherry bloom")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "secret sounds")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "king of the knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "rock")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "property" value: "video:tag"), Attribute(name: "content" value: "alternative")]), Text("\n \n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:card"), Attribute(name: "content" value: "player")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:site"), Attribute(name: "content" value: "@vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:title"), Attribute(name: "content" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:description"), Attribute(name: "content" value: "The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:image"), Attribute(name: "content" value: "https://i.vimeocdn.com/video/34373130_1280x720.jpg")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player"), Attribute(name: "content" value: "https://player.vimeo.com/video/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player:width"), Attribute(name: "content" value: "1280")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:player:height"), Attribute(name: "content" value: "720")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:iphone"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:iphone"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:iphone"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:ipad"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:ipad"), Attribute(name: "content" value: "425194759")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:ipad"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:name:googleplay"), Attribute(name: "content" value: "Vimeo")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:id:googleplay"), Attribute(name: "content" value: "com.vimeo.android.videoapp")]), Text("\n "), Element(name: "meta" attributes: [Attribute(name: "name" value: "twitter:app:url:googleplay"), Attribute(name: "content" value: "vimeo://app.vimeo.com/videos/898029")]), Text("\n\n\n\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "alternate"), Attribute(name: "href" value: "https://vimeo.com/api/oembed.json?url=https%3A%2F%2Fvimeo.com%2F898029"), Attribute(name: "type" value: "application/json+oembed"), Attribute(name: "title" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "alternate"), Attribute(name: "href" value: "https://vimeo.com/api/oembed.xml?url=https%3A%2F%2Fvimeo.com%2F898029"), Attribute(name: "type" value: "text/xml+oembed"), Attribute(name: "title" value: "Cherry Bloom - King Of The Knife")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "pingback"), Attribute(name: "href" value: "https://vimeo.com/_pingback")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "canonical"), Attribute(name: "href" value: "/898029")]), Text("\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "apple-touch-icon-precomposed"), Attribute(name: "href" value: "https://i.vimeocdn.com/favicon/main-touch_180")]), Text("\n\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "mask-icon"), Attribute(name: "href" value: "https://f.vimeocdn.com/svg/iris/iris_icon_v_64.svg"), Attribute(name: "color" value: "#17272e")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "shortcut icon"), Attribute(name: "href" value: "https://f.vimeocdn.com/images_v6/favicon.ico"), Attribute(name: "data-play" value: "https://i.vimeocdn.com/favicon/play_32"), Attribute(name: "data-pause" value: "https://i.vimeocdn.com/favicon/pause_32")]), Text("\n\n"), Element(name: "meta" attributes: [Attribute(name: "name" value: "msapplication-TileImage"), Attribute(name: "content" value: "https://i.vimeocdn.com/favicon/main-touch_144")]), Text("\n"), Element(name: "meta" attributes: [Attribute(name: "name" value: "msapplication-TileColor"), Attribute(name: "content" value: "#00adef")]), Text("\n\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "search"), Attribute(name: "type" value: "application/opensearchdescription+xml"), Attribute(name: "href" value: "/search/opensearch.xml"), Attribute(name: "title" value: "Vimeo search")]), Text("\n"), Element(name: "link" attributes: [Attribute(name: "rel" value: "logo"), Attribute(name: "type" value: "image/svg"), Attribute(name: "href" value: "https://f.vimeocdn.com/logo.svg")]), Text("\n "), Element(name: "title" children: NodeSet(Text("Cherry Bloom - King Of The Knife on Vimeo"))), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "https://f.vimeocdn.com/styles/css_opt/global/icon_fonts.min.css?ae2b7e8565")]), Text("\n\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "https://f.vimeocdn.com/styles/css_opt/clip_beta_combined.min.css?4fa63289")]), Text("\n\n\n "), Element(name: "style" children: NodeSet(Text("\n #ribbon, .body_ribbon, .svg_ribbon, .default_lightbox header>.lightbox_heading, .default_lightbox .masthead, .default_lightbox.feather:before, .upload_progress .inner .bar, .vod_lightbox:before { background:url(data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22500%22%3E%3Crect%20x%3D%220%22%20width%3D%2226%22%20height%3D%22100%25%22%20style%3D%22fill%3A%2328a1d8%22%2F%3E%3Crect%20x%3D%2226%22%20width%3D%2243%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23248bc7%22%2F%3E%3Crect%20x%3D%2269%22%20width%3D%2221%22%20height%3D%22100%25%22%20style%3D%22fill%3A%231e3955%22%2F%3E%3Crect%20x%3D%2290%22%20width%3D%2215%22%20height%3D%22100%25%22%20style%3D%22fill%3A%232f5132%22%2F%3E%3Crect%20x%3D%22105%22%20width%3D%2255%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23416828%22%2F%3E%3Crect%20x%3D%22160%22%20width%3D%2272%22%20height%3D%22100%25%22%20style%3D%22fill%3A%237eaa29%22%2F%3E%3Crect%20x%3D%22232%22%20width%3D%2214%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23dcbd42%22%2F%3E%3Crect%20x%3D%22246%22%20width%3D%229%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23dcad27%22%2F%3E%3Crect%20x%3D%22255%22%20width%3D%220%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23e39a23%22%2F%3E%3Crect%20x%3D%22255%22%20width%3D%2221%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23cc554c%22%2F%3E%3Crect%20x%3D%22276%22%20width%3D%2280%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23ca473f%22%2F%3E%3Crect%20x%3D%22356%22%20width%3D%2232%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23a72834%22%2F%3E%3Crect%20x%3D%22388%22%20width%3D%2237%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23735675%22%2F%3E%3Crect%20x%3D%22425%22%20width%3D%2253%22%20height%3D%22100%25%22%20style%3D%22fill%3A%23653e66%22%2F%3E%3Crect%20x%3D%22478%22%20width%3D%2222%22%20height%3D%22100%25%22%20style%3D%22fill%3A%233b315b%22%2F%3E%3C%2Fsvg%3E%0A) repeat-x top left; }\n "))), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "subresource"), Attribute(name: "href" value: "https://f.vimeocdn.com/p/2.11.0/js/player.js")]), Text("\n "), Element(name: "link" attributes: [Attribute(name: "rel" value: "subresource"), Attribute(name: "href" value: "https://f.vimeocdn.com/p/2.11.0/css/player.css")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n var playerAssetUrls = {\"js\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/js\\/player.js\",\"moog\":\"https:\\/\\/f.vimeocdn.com\\/p\\/flash\\/moogaloop\\/6.2.9\\/moogaloop.swf\",\"moog_js\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/js\\/moogaloop.js\",\"css\":\"https:\\/\\/f.vimeocdn.com\\/p\\/2.11.0\\/css\\/player.css\",\"player_url\":\"player.vimeo.com\"};\n "))), Text("\n \n\n\n "), Element(name: "script" children: NodeSet(Text("\nwindow.NREUM||(NREUM={}),__nr_require=function(t,e,n){function r(n){if(!e[n]){var o=e[n]={exports:{}};t[n][0].call(o.exports,function(e){var o=t[n][1][e];return r(o?o:e)},o,o.exports)}return e[n].exports}if(\"function\"==typeof __nr_require)return __nr_require;for(var o=0;o<n.length;o++)r(n[o]);return r}({QJf3ax:[function(t,e){function n(t){function e(e,n,a){t&&t(e,n,a),a||(a={});for(var c=s(e),f=c.length,u=i(a,o,r),d=0;f>d;d++)c[d].apply(u,n);return u}function a(t,e){f[t]=s(t).concat(e)}function s(t){return f[t]||[]}function c(){return n(e)}var f={};return{on:a,emit:e,create:c,listeners:s,_events:f}}function r(){return{}}var o=\"nr@context\",i=t(\"gos\");e.exports=n()},{gos:\"7eSDFh\"}],ee:[function(t,e){e.exports=t(\"QJf3ax\")},{}],3:[function(t){function e(t,e,n,i,s){try{c?c-=1:r(\"err\",[s||new UncaughtException(t,e,n)])}catch(f){try{r(\"ierr\",[f,(new Date).getTime(),!0])}catch(u){}}return\"function\"==typeof a?a.apply(this,o(arguments)):!1}function UncaughtException(t,e,n){this.message=t||\"Uncaught error with no additional information\",this.sourceURL=e,this.line=n}function n(t){r(\"err\",[t,(new Date).getTime()])}var r=t(\"handle\"),o=t(5),i=t(\"ee\"),a=window.onerror,s=!1,c=0;t(\"loader\").features.err=!0,window.onerror=e,NREUM.noticeError=n;try{throw new Error}catch(f){\"stack\"in f&&(t(1),t(4),\"addEventListener\"in window&&t(2),window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&t(3),s=!0)}i.on(\"fn-start\",function(){s&&(c+=1)}),i.on(\"fn-err\",function(t,e,r){s&&(this.thrown=!0,n(r))}),i.on(\"fn-end\",function(){s&&!this.thrown&&c>0&&(c-=1)}),i.on(\"internal-error\",function(t){r(\"ierr\",[t,(new Date).getTime(),!0])})},{1:8,2:5,3:9,4:7,5:20,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],4:[function(t){function e(){}if(window.performance&&window.performance.timing&&window.performance.getEntriesByType){var n=t(\"ee\"),r=t(\"handle\"),o=t(2);t(\"loader\").features.stn=!0,t(1),n.on(\"fn-start\",function(t){var e=t[0];e instanceof Event&&(this.bstStart=Date.now())}),n.on(\"fn-end\",function(t,e){var n=t[0];n instanceof Event&&r(\"bst\",[n,e,this.bstStart,Date.now()])}),o.on(\"fn-start\",function(t,e,n){this.bstStart=Date.now(),this.bstType=n}),o.on(\"fn-end\",function(t,e){r(\"bstTimer\",[e,this.bstStart,Date.now(),this.bstType])}),n.on(\"pushState-start\",function(){this.time=Date.now(),this.startPath=location.pathname+location.hash}),n.on(\"pushState-end\",function(){r(\"bstHist\",[location.pathname+location.hash,this.startPath,this.time])}),\"addEventListener\"in window.performance&&(window.performance.addEventListener(\"webkitresourcetimingbufferfull\",function(){r(\"bstResource\",[window.performance.getEntriesByType(\"resource\")]),window.performance.webkitClearResourceTimings()},!1),window.performance.addEventListener(\"resourcetimingbufferfull\",function(){r(\"bstResource\",[window.performance.getEntriesByType(\"resource\")]),window.performance.clearResourceTimings()},!1)),document.addEventListener(\"scroll\",e,!1),document.addEventListener(\"keypress\",e,!1),document.addEventListener(\"click\",e,!1)}},{1:6,2:8,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],5:[function(t,e){function n(t){i.inPlace(t,[\"addEventListener\",\"removeEventListener\"],\"-\",r)}function r(t){return t[1]}var o=(t(1),t(\"ee\").create()),i=t(2)(o),a=t(\"gos\");if(e.exports=o,n(window),\"getPrototypeOf\"in Object){for(var s=document;s&&!s.hasOwnProperty(\"addEventListener\");)s=Object.getPrototypeOf(s);s&&n(s);for(var c=XMLHttpRequest.prototype;c&&!c.hasOwnProperty(\"addEventListener\");)c=Object.getPrototypeOf(c);c&&n(c)}else XMLHttpRequest.prototype.hasOwnProperty(\"addEventListener\")&&n(XMLHttpRequest.prototype);o.on(\"addEventListener-start\",function(t){if(t[1]){var e=t[1];\"function\"==typeof e?this.wrapped=t[1]=a(e,\"nr@wrapped\",function(){return i(e,\"fn-\",null,e.name||\"anonymous\")}):\"function\"==typeof e.handleEvent&&i.inPlace(e,[\"handleEvent\"],\"fn-\")}}),o.on(\"removeEventListener-start\",function(t){var e=this.wrapped;e&&(t[1]=e)})},{1:20,2:21,ee:\"QJf3ax\",gos:\"7eSDFh\"}],6:[function(t,e){var n=(t(2),t(\"ee\").create()),r=t(1)(n);e.exports=n,r.inPlace(window.history,[\"pushState\"],\"-\")},{1:21,2:20,ee:\"QJf3ax\"}],7:[function(t,e){var n=(t(2),t(\"ee\").create()),r=t(1)(n);e.exports=n,r.inPlace(window,[\"requestAnimationFrame\",\"mozRequestAnimationFrame\",\"webkitRequestAnimationFrame\",\"msRequestAnimationFrame\"],\"raf-\"),n.on(\"raf-start\",function(t){t[0]=r(t[0],\"fn-\")})},{1:21,2:20,ee:\"QJf3ax\"}],8:[function(t,e){function n(t,e,n){var r=t[0];\"string\"==typeof r&&(r=new Function(r)),t[0]=o(r,\"fn-\",null,n)}var r=(t(2),t(\"ee\").create()),o=t(1)(r);e.exports=r,o.inPlace(window,[\"setTimeout\",\"setInterval\",\"setImmediate\"],\"setTimer-\"),r.on(\"setTimer-start\",n)},{1:21,2:20,ee:\"QJf3ax\"}],9:[function(t,e){function n(){c.inPlace(this,d,\"fn-\")}function r(t,e){c.inPlace(e,[\"onreadystatechange\"],\"fn-\")}function o(t,e){return e}var i=t(\"ee\").create(),a=t(1),s=t(2),c=s(i),f=s(a),u=window.XMLHttpRequest,d=[\"onload\",\"onerror\",\"onabort\",\"onloadstart\",\"onloadend\",\"onprogress\",\"ontimeout\"];e.exports=i,window.XMLHttpRequest=function(t){var e=new u(t);try{i.emit(\"new-xhr\",[],e),f.inPlace(e,[\"addEventListener\",\"removeEventListener\"],\"-\",function(t,e){return e}),e.addEventListener(\"readystatechange\",n,!1)}catch(r){try{i.emit(\"internal-error\",[r])}catch(o){}}return e},window.XMLHttpRequest.prototype=u.prototype,c.inPlace(XMLHttpRequest.prototype,[\"open\",\"send\"],\"-xhr-\",o),i.on(\"send-xhr-start\",r),i.on(\"open-xhr-start\",r)},{1:5,2:21,ee:\"QJf3ax\"}],10:[function(t){function e(t){if(\"string\"==typeof t&&t.length)return t.length;if(\"object\"!=typeof t)return void 0;if(\"undefined\"!=typeof ArrayBuffer&&t instanceof ArrayBuffer&&t.byteLength)return t.byteLength;if(\"undefined\"!=typeof Blob&&t instanceof Blob&&t.size)return t.size;if(\"undefined\"!=typeof FormData&&t instanceof FormData)return void 0;try{return JSON.stringify(t).length}catch(e){return void 0}}function n(t){var n=this.params,r=this.metrics;if(!this.ended){this.ended=!0;for(var i=0;c>i;i++)t.removeEventListener(s[i],this.listener,!1);if(!n.aborted){if(r.duration=(new Date).getTime()-this.startTime,4===t.readyState){n.status=t.status;var a=t.responseType,f=\"arraybuffer\"===a||\"blob\"===a||\"json\"===a?t.response:t.responseText,u=e(f);if(u&&(r.rxSize=u),this.sameOrigin){var d=t.getResponseHeader(\"X-NewRelic-App-Data\");d&&(n.cat=d.split(\", \").pop())}}else n.status=0;r.cbTime=this.cbTime,o(\"xhr\",[n,r,this.startTime])}}}function r(t,e){var n=i(e),r=t.params;r.host=n.hostname+\":\"+n.port,r.pathname=n.pathname,t.sameOrigin=n.sameOrigin}if(window.XMLHttpRequest&&XMLHttpRequest.prototype&&XMLHttpRequest.prototype.addEventListener&&!/CriOS/.test(navigator.userAgent)){t(\"loader\").features.xhr=!0;var o=t(\"handle\"),i=t(2),a=t(\"ee\"),s=[\"load\",\"error\",\"abort\",\"timeout\"],c=s.length,f=t(1);t(4),t(3),a.on(\"new-xhr\",function(){this.totalCbs=0,this.called=0,this.cbTime=0,this.end=n,this.ended=!1,this.xhrGuids={}}),a.on(\"open-xhr-start\",function(t){this.params={method:t[0]},r(this,t[1]),this.metrics={}}),a.on(\"open-xhr-end\",function(t,e){\"loader_config\"in NREUM&&\"xpid\"in NREUM.loader_config&&this.sameOrigin&&e.setRequestHeader(\"X-NewRelic-ID\",NREUM.loader_config.xpid)}),a.on(\"send-xhr-start\",function(t,n){var r=this.metrics,o=t[0],i=this;if(r&&o){var f=e(o);f&&(r.txSize=f)}this.startTime=(new Date).getTime(),this.listener=function(t){try{\"abort\"===t.type&&(i.params.aborted=!0),(\"load\"!==t.type||i.called===i.totalCbs&&(i.onloadCalled||\"function\"!=typeof n.onload))&&i.end(n)}catch(e){try{a.emit(\"internal-error\",[e])}catch(r){}}};for(var u=0;c>u;u++)n.addEventListener(s[u],this.listener,!1)}),a.on(\"xhr-cb-time\",function(t,e,n){this.cbTime+=t,e?this.onloadCalled=!0:this.called+=1,this.called!==this.totalCbs||!this.onloadCalled&&\"function\"==typeof n.onload||this.end(n)}),a.on(\"xhr-load-added\",function(t,e){var n=\"\"+f(t)+!!e;this.xhrGuids&&!this.xhrGuids[n]&&(this.xhrGuids[n]=!0,this.totalCbs+=1)}),a.on(\"xhr-load-removed\",function(t,e){var n=\"\"+f(t)+!!e;this.xhrGuids&&this.xhrGuids[n]&&(delete this.xhrGuids[n],this.totalCbs-=1)}),a.on(\"addEventListener-end\",function(t,e){e instanceof XMLHttpRequest&&\"load\"===t[0]&&a.emit(\"xhr-load-added\",[t[1],t[2]],e)}),a.on(\"removeEventListener-end\",function(t,e){e instanceof XMLHttpRequest&&\"load\"===t[0]&&a.emit(\"xhr-load-removed\",[t[1],t[2]],e)}),a.on(\"fn-start\",function(t,e,n){e instanceof XMLHttpRequest&&(\"onload\"===n&&(this.onload=!0),(\"load\"===(t[0]&&t[0].type)||this.onload)&&(this.xhrCbStart=(new Date).getTime()))}),a.on(\"fn-end\",function(t,e){this.xhrCbStart&&a.emit(\"xhr-cb-time\",[(new Date).getTime()-this.xhrCbStart,this.onload,e],e)})}},{1:\"XL7HBI\",2:11,3:9,4:5,ee:\"QJf3ax\",handle:\"D5DuLP\",loader:\"G9z0Bl\"}],11:[function(t,e){e.exports=function(t){var e=document.createElement(\"a\"),n=window.location,r={};e.href=t,r.port=e.port;var o=e.href.split(\"://\");return!r.port&&o[1]&&(r.port=o[1].split(\"/\")[0].split(\":\")[1]),r.port&&\"0\"!==r.port||(r.port=\"https\"===o[0]?\"443\":\"80\"),r.hostname=e.hostname||n.hostname,r.pathname=e.pathname,\"/\"!==r.pathname.charAt(0)&&(r.pathname=\"/\"+r.pathname),r.sameOrigin=!e.hostname||e.hostname===document.domain&&e.port===n.port&&e.protocol===n.protocol,r}},{}],gos:[function(t,e){e.exports=t(\"7eSDFh\")},{}],\"7eSDFh\":[function(t,e){function n(t,e,n){if(r.call(t,e))return t[e];var o=n();if(Object.defineProperty&&Object.keys)try{return Object.defineProperty(t,e,{value:o,writable:!0,enumerable:!1}),o}catch(i){}return t[e]=o,o}var r=Object.prototype.hasOwnProperty;e.exports=n},{}],D5DuLP:[function(t,e){function n(t,e,n){return r.listeners(t).length?r.emit(t,e,n):(o[t]||(o[t]=[]),void o[t].push(e))}var r=t(\"ee\").create(),o={};e.exports=n,n.ee=r,r.q=o},{ee:\"QJf3ax\"}],handle:[function(t,e){e.exports=t(\"D5DuLP\")},{}],XL7HBI:[function(t,e){function n(t){var e=typeof t;return!t||\"object\"!==e&&\"function\"!==e?-1:t===window?0:i(t,o,function(){return r++})}var r=1,o=\"nr@id\",i=t(\"gos\");e.exports=n},{gos:\"7eSDFh\"}],id:[function(t,e){e.exports=t(\"XL7HBI\")},{}],loader:[function(t,e){e.exports=t(\"G9z0Bl\")},{}],G9z0Bl:[function(t,e){function n(){var t=p.info=NREUM.info;if(t&&t.agent&&t.licenseKey&&t.applicationID&&c&&c.body){p.proto=\"https\"===d.split(\":\")[0]||t.sslForHttp?\"https://\":\"http://\",a(\"mark\",[\"onload\",i()]);var e=c.createElement(\"script\");e.src=p.proto+t.agent,c.body.appendChild(e)}}function r(){\"complete\"===c.readyState&&o()}function o(){a(\"mark\",[\"domContent\",i()])}function i(){return(new Date).getTime()}var a=t(\"handle\"),s=window,c=s.document,f=\"addEventListener\",u=\"attachEvent\",d=(\"\"+location).split(\"?\")[0],p=e.exports={offset:i(),origin:d,features:{}};c[f]?(c[f](\"DOMContentLoaded\",o,!1),s[f](\"load\",n,!1)):(c[u](\"onreadystatechange\",r),s[u](\"onload\",n)),a(\"mark\",[\"firstbyte\",i()])},{handle:\"D5DuLP\"}],20:[function(t,e){function n(t,e,n){e||(e=0),\"undefined\"==typeof n&&(n=t?t.length:0);for(var r=-1,o=n-e||0,i=Array(0>o?0:o);++r<o;)i[r]=t[e+r];return i}e.exports=n},{}],21:[function(t,e){function n(t){return!(t&&\"function\"==typeof t&&t.apply&&!t[i])}var r=t(\"ee\"),o=t(1),i=\"nr@wrapper\",a=Object.prototype.hasOwnProperty;e.exports=function(t){function e(t,e,r,a){function nrWrapper(){var n,i,s,f;try{i=this,n=o(arguments),s=r&&r(n,i)||{}}catch(d){u([d,\"\",[n,i,a],s])}c(e+\"start\",[n,i,a],s);try{return f=t.apply(i,n)}catch(p){throw c(e+\"err\",[n,i,p],s),p}finally{c(e+\"end\",[n,i,f],s)}}return n(t)?t:(e||(e=\"\"),nrWrapper[i]=!0,f(t,nrWrapper),nrWrapper)}function s(t,r,o,i){o||(o=\"\");var a,s,c,f=\"-\"===o.charAt(0);for(c=0;c<r.length;c++)s=r[c],a=t[s],n(a)||(t[s]=e(a,f?s+o:o,i,s,t))}function c(e,n,r){try{t.emit(e,n,r)}catch(o){u([o,e,n,r])}}function f(t,e){if(Object.defineProperty&&Object.keys)try{var n=Object.keys(t);return n.forEach(function(n){Object.defineProperty(e,n,{get:function(){return t[n]},set:function(e){return t[n]=e,e}})}),e}catch(r){u([r])}for(var o in t)a.call(t,o)&&(e[o]=t[o]);return e}function u(e){try{t.emit(\"internal-error\",e)}catch(n){}}return t||(t=r),e.inPlace=s,e.flag=i,e}},{1:20,ee:\"QJf3ax\"}]},{},[\"G9z0Bl\",3,10,4]);\n;NREUM.info={beacon:\"bam.nr-data.net\",errorBeacon:\"bam.nr-data.net\",licenseKey:\"689d5b4562\",applicationID:\"2011224\",sa:1,agent:\"js-agent.newrelic.com/nr-476.min.js\"}\n"))), Text("\n\n "), Element(name: "script" children: NodeSet(Text("\n var googletag = googletag || {},\n gptadslots = [];\n googletag.cmd = googletag.cmd || [];\n\n (function() {\n var gads = document.createElement('script'),\n useSSL = 'https:' == document.location.protocol,\n node;\n gads.async = true;\n gads.type = 'text/javascript';\n gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';\n node = document.getElementsByTagName('script')[0];\n node.parentNode.insertBefore(gads, node);\n })();\n\n googletag.cmd.push(function() {\n \n googletag.pubads().setTargeting('sec', ['false']);\n\n googletag.pubads().setTargeting('logged_in', ['false']);\n\n googletag.pubads().setTargeting('rpv', (Math.floor(Math.random()*100)+1).toString());\n\n googletag.pubads().enableAsyncRendering();\n googletag.enableServices();\n });\n "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n!function(){var e=\"undefined\"!=typeof window?window:exports,r=[];if(e.performance||(e.performance={}),e.performance.now||(e.performance.now=performance.now||performance.webkitNow||performance.msNow||performance.mozNow),!e.performance.now){var n=Date.now?Date.now():+new Date;performance.timing&&performance.timing&&(n=performance.timing.navigationStart),e.performance.now=function(){var e=Date.now?Date.now():+new Date;return e-n}}e.performance.mark||(e.performance.mark=e.performance.webkitMark?e.performance.webkitMark:function(n){r.forEach(function(e,r,a){e.name===n&&a.splice(r,1)}),r.push({name:n,entryType:\"mark\",startTime:e.performance.now(),duration:0})}),e.performance.getEntriesByType||(e.performance.getEntriesByType=e.performance.webkitGetEntriesByType?e.performance.webkitGetEntriesByType:function(e){var n=function(r){return r.entryType===e};return-1!==[\"mark\",\"measure\"].indexOf(e)?r.filter(n):void 0}),e.performance.getEntriesByName||(e.performance.getEntriesByName=e.performance.webkitGetEntriesByName?e.performance.webkitGetEntriesByName:function(e){return r.filter(function(r){return r.name===e})}),e.performance.clearMeasures||(e.performance.clearMeasures=e.performance.webkitClearMeasures?e.performance.webkitClearMeasures:function(){r.forEach(function(e,r,n){\"measure\"===e.entryType&&n.splice(r,1)}),r=[]}),e.performance.clearMarks||(e.performance.clearMarks=e.performance.webkitClearMarks?e.performance.webkitClearMarks:function(){r.forEach(function(e,r,n){\"mark\"===e.entryType&&n.splice(r,1)}),r=[]}),e.performance.measure||(e.performance.measure=e.performance.webkitMeasure?e.performance.webkitMeasure:function(e,n,a){var t=function(e){return function(r){return r.name===e&&\"mark\"===r.entryType}},o=r.filter(t(n))[0],m=r.filter(t(a))[0],i=m.startTime-o.startTime;r.push({name:e,entryType:\"measure\",startTime:o.startTime,duration:i})})}(),window.markUserTime=function(e){var r=window.requestAnimationFrame||function(e){setTimeout(e,0)};r(function(){window.performance.mark(e),window.console&&console.timeStamp&&console.timeStamp(e)})};\n\n(function() {\n window.markUserTime = function(label) {\n window._gaq = window._gaq || [];\n\n // Exit early if the browser can't handle new things\n if (typeof performance === 'undefined' || typeof performance.mark !== 'function' || typeof performance.getEntriesByName !== 'function' || typeof performance.clearMarks !== 'function') {\n return;\n }\n\n var uid = parseInt(Math.random().toString().split('0.')[1]) + new Date().getTime(),\n mark_name = label + '_' + uid,\n parts = label.split('|'),\n category = parts[0],\n variable = parts[1],\n label = parts[2],\n mark_time;\n\n performance.mark(mark_name);\n mark_time = performance.getEntriesByName(mark_name)[0].startTime;\n\n window._gaq.push(['_trackTiming', category, variable, mark_time / 1000, label, 0.5]);\n }\n}());\n"))), Text("\n\n\n\n\n "))), Text("\n "), Element(name: "body" attributes: [Attribute(name: "class" value: "onsite ")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "id" value: "wrap"), Attribute(name: "class" value: "outer_wrap")] children: NodeSet(Text("\n \n "), Element(name: "div" attributes: [Attribute(name: "class" value: "body_ribbon")]), Text("\n\n \n \n\n\n"), Element(name: "div" attributes: [Attribute(name: "id" value: "topnav_desktop"), Attribute(name: "class" value: "topnav_desktop "), Attribute(name: "role" value: "banner")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_desktop_wrapper")] children: NodeSet(Text("\n\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_desktop_logo"), Attribute(name: "href" value: "//vimeo.com"), Attribute(name: "alt" value: "Go to Vimeo home page"), Attribute(name: "title" value: "Go to Vimeo home page"), Attribute(name: "aria-label" value: "Go to Vimeo home page"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:vimeo_home"), Attribute(name: "data-ga-event-click" value: "top_nav|home"), Attribute(name: "data-gtm-click" value: "top_nav_home_click")] children: NodeSet(Text("\n "), Element(name: "svg" attributes: [Attribute(name: "alt" value: "Vimeo"), Attribute(name: "width" value: "100"), Attribute(name: "height" value: "40")] children: NodeSet(Element(name: "path" attributes: [Attribute(name: "d" value: "M22.448 14.575c-.104 2.17-1.618 5.146-4.544 8.912-3.03 3.942-5.59 5.912-7.686 5.912-1.297 0-2.397-1.204-3.3-3.6-.6-2.2-1.202-4.398-1.794-6.598-.664-2.396-1.38-3.6-2.147-3.6-.166 0-.747.354-1.753 1.05l-1.048-1.35c1.1-.965 2.19-1.93 3.257-2.905 1.463-1.265 2.573-1.94 3.3-2.002 1.732-.166 2.8 1.017 3.205 3.558.435 2.74.736 4.44.902 5.115.498 2.27 1.048 3.402 1.65 3.402.466 0 1.172-.737 2.105-2.21.934-1.473 1.432-2.593 1.504-3.37.133-1.277-.365-1.91-1.506-1.91-.53 0-1.08.125-1.65.364 1.1-3.59 3.186-5.333 6.277-5.23 2.273.073 3.35 1.556 3.227 4.46m13.755 7.034c-.933 1.764-2.22 3.37-3.86 4.803-2.24 1.93-4.47 2.905-6.7 2.905-1.037.002-1.826-.33-2.376-.994-.55-.663-.81-1.535-.777-2.603.03-1.1.372-2.8 1.025-5.104.654-2.303.976-3.537.976-3.703 0-.86-.3-1.297-.902-1.297-.198 0-.77.353-1.702 1.048l-1.152-1.35c1.07-.962 2.137-1.927 3.206-2.902 1.43-1.266 2.5-1.94 3.205-2.002 1.1-.103 1.91.23 2.428.976.518.747.705 1.722.58 2.915-.435 2.034-.902 4.607-1.4 7.73-.03 1.43.488 2.146 1.556 2.146.467 0 1.297-.498 2.5-1.483.996-.82 1.815-1.598 2.45-2.324l.942 1.244m-4.357-17.8c-.03.83-.446 1.628-1.255 2.395-.9.86-1.97 1.296-3.204 1.296-1.9 0-2.822-.83-2.75-2.49.032-.86.54-1.69 1.526-2.49.985-.797 2.074-1.19 3.278-1.19.705 0 1.286.27 1.753.82.467.54.684 1.1.653 1.66m35.612 17.8c-.933 1.763-2.22 3.37-3.86 4.802-2.24 1.93-4.47 2.904-6.7 2.904-2.168.002-3.216-1.202-3.153-3.598.03-1.07.238-2.355.622-3.85.384-1.503.59-2.665.623-3.505.03-1.265-.353-1.898-1.152-1.898-.87 0-1.91 1.036-3.112 3.1-1.276 2.168-1.96 4.274-2.064 6.308-.073 1.43.072 2.54.425 3.298-2.324.064-3.963-.32-4.886-1.15-.83-.737-1.212-1.95-1.15-3.652.03-1.068.198-2.137.488-3.205.29-1.07.457-2.023.488-2.853.062-1.234-.384-1.857-1.35-1.857-.84 0-1.74.955-2.706 2.853-.966 1.9-1.505 3.89-1.61 5.956-.06 1.867.053 3.174.364 3.9-2.293.062-3.92-.415-4.876-1.452-.798-.86-1.16-2.18-1.1-3.942.032-.86.188-2.075.457-3.62.28-1.546.425-2.75.457-3.62.062-.603-.083-.903-.446-.903-.197 0-.768.34-1.702 1.015l-1.203-1.348c.168-.135 1.216-1.1 3.156-2.905 1.4-1.297 2.354-1.97 2.852-2.002.872-.073 1.567.29 2.106 1.08.53.787.8 1.69.8 2.727 0 .332-.032.654-.105.954.497-.766 1.08-1.43 1.752-2 1.537-1.34 3.26-2.086 5.157-2.252 1.64-.135 2.8.25 3.505 1.152.57.736.83 1.784.8 3.153.237-.198.486-.416.746-.654.767-.903 1.514-1.62 2.25-2.148 1.235-.902 2.52-1.4 3.86-1.504 1.597-.135 2.75.25 3.454 1.152.602.726.87 1.774.8 3.143-.032.933-.26 2.28-.675 4.065-.416 1.773-.624 2.8-.624 3.07-.03.695.03 1.182.197 1.442.166.27.57.394 1.203.394.467 0 1.297-.497 2.5-1.482.996-.82 1.816-1.598 2.45-2.324l.963 1.254m18.765-.052c-.965 1.598-2.874 3.195-5.706 4.793-3.538 2.032-7.127 3.05-10.758 3.05-2.706 0-4.636-.904-5.808-2.7-.83-1.233-1.234-2.696-1.203-4.407.03-2.698 1.234-5.27 3.6-7.71 2.603-2.665 5.674-4.003 9.21-4.003 3.27 0 5 1.328 5.208 3.994.135 1.702-.798 3.445-2.8 5.24-2.137 1.96-4.824 3.215-8.06 3.744.6.83 1.504 1.245 2.707 1.245 2.396 0 5.02-.613 7.863-1.837 2.033-.86 3.63-1.753 4.803-2.676l.945 1.265m-11.36-5.228c.032-.892-.33-1.35-1.1-1.35-.994 0-2.01.686-3.048 2.066-1.038 1.38-1.567 2.697-1.598 3.962-.02 0-.02.218 0 .643 1.63-.6 3.05-1.514 4.242-2.738.966-1.058 1.463-1.92 1.505-2.583m24.946 1.868c-.135 3.072-1.265 5.717-3.402 7.947-2.135 2.23-4.79 3.35-7.955 3.35-2.635 0-4.637-.85-6.006-2.55-.997-1.267-1.557-2.854-1.65-4.752-.166-2.863.86-5.498 3.1-7.894 2.408-2.665 5.427-3.993 9.057-3.993 2.334 0 4.098.788 5.3 2.344 1.132 1.443 1.65 3.29 1.557 5.55m-5.664-.185c.03-.903-.094-1.733-.374-2.48-.28-.747-.695-1.13-1.224-1.13-1.702 0-3.102.923-4.202 2.76-.933 1.503-1.43 3.11-1.504 4.812-.03.84.114 1.577.446 2.21.364.736.882 1.1 1.556 1.1 1.505 0 2.79-.883 3.86-2.656.892-1.472 1.38-3.008 1.44-4.615h.002z"), Attribute(name: "fill" value: "#112233")]))), Text("\n "))), Text("\n \n "), Element(name: "nav" attributes: [Attribute(name: "class" value: "topnav_desktop_menu"), Attribute(name: "role" value: "navigation"), Attribute(name: "aria-label" value: "Main menu")] children: NodeSet(Text("\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_menu_desktop_main"), Attribute(name: "role" value: "menubar")] children: NodeSet(Text("\n\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_menu_join"), Attribute(name: "data-ga-event-click" value: "top_nav|join"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:join"), Attribute(name: "data-gtm-click" value: "top_nav_join_click"), Attribute(name: "href" value: "/join"), Attribute(name: "title" value: "Become a Vimeo member"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_join")] children: NodeSet(Text("\n Join "))), Text("\n\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-lightbox"), Attribute(name: "data-lightbox-options" value: "id=registration_modal|cache=false"), Attribute(name: "data-ga-event-click" value: "top_nav|login"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:login"), Attribute(name: "data-gtm-click" value: "top_nav_login_click"), Attribute(name: "href" value: "/log_in"), Attribute(name: "title" value: "Log in to your account"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_login")] children: NodeSet(Text("\n Log in "))), Text("\n\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|create|create"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:create"), Attribute(name: "data-gtm-click" value: "top_nav_create_click"), Attribute(name: "href" value: "/create"), Attribute(name: "title" value: ""), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_create")] children: NodeSet(Text("\n Create "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_create")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|membership_options"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:membership_options"), Attribute(name: "data-gtm-click" value: "top_nav_create_membership_options_click"), Attribute(name: "href" value: "/upgrade"), Attribute(name: "title" value: "Upgrade, or compare our plans")] children: NodeSet(Text("Membership options"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|sell"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:sell"), Attribute(name: "data-gtm-click" value: "top_nav_create_sell_click"), Attribute(name: "href" value: "/ondemand/startselling"), Attribute(name: "title" value: "Sell directly to your fans with Vimeo On Demand")] children: NodeSet(Text("Sell videos"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|video_school"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:video_school"), Attribute(name: "data-gtm-click" value: "top_nav_create_video_school_click"), Attribute(name: "href" value: "/videoschool"), Attribute(name: "title" value: "Learn how to make better videos")] children: NodeSet(Text("Video School"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|cameo"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:cameo"), Attribute(name: "data-gtm-click" value: "top_nav_create_cameo_click"), Attribute(name: "href" value: "/cameo"), Attribute(name: "title" value: "Create cinematic videos on your phone")] children: NodeSet(Text("Cameo"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|create|more"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:create|keyword:more"), Attribute(name: "data-gtm-click" value: "top_nav_create_more_click"), Attribute(name: "href" value: "/create"), Attribute(name: "title" value: "Discover more tools for video creators")] children: NodeSet(Text("More…"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|watch|watch"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:watch"), Attribute(name: "data-gtm-click" value: "top_nav_watch_click"), Attribute(name: "href" value: "/watch"), Attribute(name: "title" value: ""), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_watch")] children: NodeSet(Text("\n Watch "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_watch")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|staff_picks"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:staff_picks"), Attribute(name: "data-gtm-click" value: "top_nav_watch_staff_picks_click"), Attribute(name: "href" value: "/channels/staffpicks"), Attribute(name: "title" value: "The best videos on Vimeo, curated daily by our team")] children: NodeSet(Text("Staff Picks"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|categories"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:categories"), Attribute(name: "data-gtm-click" value: "top_nav_watch_categories_click"), Attribute(name: "href" value: "/categories"), Attribute(name: "title" value: "Browse videos by interest, genre, and more")] children: NodeSet(Text("Categories"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|channels"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:channels"), Attribute(name: "data-gtm-click" value: "top_nav_watch_channels_click"), Attribute(name: "href" value: "/channels"), Attribute(name: "title" value: "View video playlists created and curated by other members")] children: NodeSet(Text("Channels"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|groups"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:groups"), Attribute(name: "data-gtm-click" value: "top_nav_watch_groups_click"), Attribute(name: "href" value: "/groups"), Attribute(name: "title" value: "Watch and discuss videos with others")] children: NodeSet(Text("Groups"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|apps"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:app"), Attribute(name: "data-gtm-click" value: "top_nav_watch_apps_click"), Attribute(name: "href" value: "/everywhere"), Attribute(name: "title" value: "Watch Vimeo videos on TVs, phones, tablets, and more")] children: NodeSet(Text("Apps"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|watch|more"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:watch|keyword:more"), Attribute(name: "data-gtm-click" value: "top_nav_watch_more_click"), Attribute(name: "href" value: "/watch"), Attribute(name: "title" value: "Discover more ways to watch on Vimeo")] children: NodeSet(Text("More…"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_has_dropdown topnav_is_ondemand topnav_icon_chevron_a"), Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|ondemand"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:on_demand"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_click"), Attribute(name: "href" value: "/ondemand"), Attribute(name: "title" value: "Watch movies, series, and more"), Attribute(name: "tabindex" value: "0"), Attribute(name: "rel" value: "toggle"), Attribute(name: "role" value: "button"), Attribute(name: "aria-owns" value: "topnav_ondemand")] children: NodeSet(Text("\n On Demand "))), Text("\n\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown"), Attribute(name: "role" value: "menu"), Attribute(name: "aria-hidden" value: "true"), Attribute(name: "id" value: "topnav_ondemand")] children: NodeSet(Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|whats_new"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:whats_new"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_whats_new_click"), Attribute(name: "href" value: "/ondemand"), Attribute(name: "title" value: "See new and noteworthy titles added to On Demand")] children: NodeSet(Text("What’s new"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|discover"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:discover"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_discover_click"), Attribute(name: "href" value: "/ondemand/discover"), Attribute(name: "title" value: "Discover titles our team recommends")] children: NodeSet(Text("Discover"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|genres"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:genres"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_genres_click"), Attribute(name: "href" value: "/ondemand/browse"), Attribute(name: "title" value: "Browse titles by genre")] children: NodeSet(Text("Genres"))), Text("\n "))), Text("\n \n "), Element(name: "li" attributes: [Attribute(name: "class" value: "topnav_desktop_menu_items_dropdown_item"), Attribute(name: "role" value: "menuitem"), Attribute(name: "tabindex" value: "-1")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-ga-event-click" value: "top_nav|ondemand|start_selling"), Attribute(name: "data-fatal-attraction" value: "container:top_nav|component:on_demand|keyword:start_selling"), Attribute(name: "data-gtm-click" value: "top_nav_ondemand_sell_click"), Attribute(name: "href" value: "/ondemand/startselling"), Attribute(name: "title" value: "Sell directly to your fans with Vimeo On Demand")] children: NodeSet(Text("Start selling"))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n "))), Text("\n "))), Comment(" /.topnav_desktop_menu "), Text("\n \n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_menu_right")] children: NodeSet(Text("\n\n "), Element(name: "form" attributes: [Attribute(name: "class" value: "topnav_menu_search"), Attribute(name: "action" value: "/search"), Attribute(name: "method" value: "get"), Attribute(name: "role" value: "search"), Attribute(name: "data-ds-protection")] children: NodeSet(Text("\n "), Element(name: "input" attributes: [Attribute(name: "class" value: "topnav_menu_search_input js-topnav_menu_search_input js-search_autocomplete"), Attribute(name: "type" value: "text"), Attribute(name: "name" value: "q"), Attribute(name: "value" value: ""), Attribute(name: "aria-label" value: "Search videos, people, and more"), Attribute(name: "placeholder" value: "Search videos, people, and more"), Attribute(name: "autocomplete" value: "off")]), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_menu_search_submit topnav_icon_search_b"), Attribute(name: "type" value: "submit")]), Text("\n "))), Text("\n \n \n \n "), Element(name: "a" attributes: [Attribute(name: "class" value: "topnav_desktop_upload topnav_icon_upload_b"), Attribute(name: "href" value: "/upload"), Attribute(name: "title" value: "Upload your videos"), Attribute(name: "role" value: "button"), Attribute(name: "data-fatal-attraction" value: "component:top_nav|keyword:upload"), Attribute(name: "data-ga-event-click" value: "button|navbar_upload"), Attribute(name: "data-gtm-click" value: "top_nav_upload_click")] children: NodeSet(Element(name: "span" children: NodeSet(Text("Upload"))))), Text("\n "))), Comment(" /.topnav_menu_right "), Text("\n "))), Comment(" /.topnav_desktop_wrapper "), Text("\n"))), Text("\n\n "), Element(name: "nav" attributes: [Attribute(name: "id" value: "topnav_mobile"), Attribute(name: "class" value: "topnav_mobile "), Attribute(name: "role" value: "banner")] children: NodeSet(Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left topnav_mobile_header_logo js-topnav_mobile_header_logo topnav_icon_mobile_vlogo_b")] children: NodeSet(Text("\n "))), Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/search"), Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_right topnav_mobile_header_search topnav_icon_mobile_search_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "h1" attributes: [Attribute(name: "class" value: "topnav_mobile_header_title")]), Text("\n "))), Text("\n\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "topnav_mobile_menu js-topnav_mobile_menu_main")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left js-topnav_mobile_header_close topnav_icon_mobile_x_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_right js-topnav_mobile_header_settings topnav_icon_mobile_gear_b")] children: NodeSet(Text(" "))), Text("\n "))), Text("\n\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: "topnav_icon_mobile_channel_b "), Attribute(name: "href" value: "/")] children: NodeSet(Text("\n Staff Picks "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "last_page"), Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_avatar_b "), Attribute(name: "href" value: "/join")] children: NodeSet(Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "menu_auth")] children: NodeSet(Text("Join or log in"))), Text(" "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_star_b"), Attribute(name: "href" value: "/watch")] children: NodeSet(Text("\n Watch "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "onclick" value: "vimeo.mobile.desktop_shared._upload(this); return false;"), Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_upload_b"), Attribute(name: "href" value: "/upload")] children: NodeSet(Text("\n Upload "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-breeze-ignore"), Attribute(name: "class" value: "topnav_icon_mobile_vod_b "), Attribute(name: "href" value: "/ondemand")] children: NodeSet(Text("\n On Demand "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: "topnav_icon_mobile_forgot_b "), Attribute(name: "href" value: "/help/faq")] children: NodeSet(Text("\n Help "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "topnav_mobile_menu topnav_mobile_menu_settings js-topnav_mobile_menu_settings")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_bar")] children: NodeSet(Text("\n "), Element(name: "button" attributes: [Attribute(name: "class" value: "topnav_mobile_button topnav_mobile_pull_left js-topnav_mobile_header_settins_close topnav_icon_mobile_arrowleft_b")] children: NodeSet(Text(" "))), Text("\n "), Element(name: "h2" attributes: [Attribute(name: "class" value: "topnav_mobile_header_title")] children: NodeSet(Text("More stuff"))), Text("\n "))), Text("\n\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/terms")] children: NodeSet(Text("\n Terms of Service "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/privacy")] children: NodeSet(Text("\n Privacy Policy "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/dmca")] children: NodeSet(Text("\n Copyright "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/cookie_policy")] children: NodeSet(Text("\n Cookies "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "desktop"), Attribute(name: "onclick" value: "vimeo.mobile.desktop_shared._s2ds(); return false"), Attribute(name: "href" value: "javascript:void(0)")] children: NodeSet(Text("\n Desktop site "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "language"), Attribute(name: "href" value: "#")] children: NodeSet(Text("\n Language "))), Text("\n "), Element(name: "select" attributes: [Attribute(name: "onchange" value: "vimeo.mobile.desktop_shared._s2l(this)"), Attribute(name: "title" value: "Choose a different language"), Attribute(name: "class" value: "topnav_mobile_menu_settings_language")] children: NodeSet(Text("\n "), Element(name: "option" attributes: [Attribute(name: "class" value: "selected"), Attribute(name: "selected"), Attribute(name: "value" value: "en"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n English "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "es"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Español "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "de-DE"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Deutsch "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "fr-FR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Français "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "ja-JP"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n 日本語 "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "pt-BR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n Português "))), Text("\n "), Element(name: "option" attributes: [Attribute(name: "value" value: "ko-KR"), Attribute(name: "name" value: "select_language")] children: NodeSet(Text("\n 한국어 "))), Text("\n "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "data-action" value: "menu.close"), Attribute(name: "class" value: " "), Attribute(name: "href" value: "/faq")] children: NodeSet(Text("\n FAQ "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "topnav_mobile_menu_copyright")] children: NodeSet(Text("TM + © 2015 Vimeo, LLC"))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n!function(e,t){e.vimeo=e.vimeo||{},vimeo.mobile=vimeo.mobile||{},Vimeo=vimeo.mobile||{},Vimeo.desktop_shared=Vimeo.desktop_shared||{};var o=t.getElementById(\"topnav_desktop\"),n=\"ontouchstart\"in e?\"touchstart\":e.PointerEvent?\"pointerdown\":e.MSPointerEvent?\"MSPointerDown\":\"click\";\"click\"!==n&&o.addEventListener(n,function(e){var t=\"img\"===e.target.tagName.toLowerCase()?e.target.parentNode:e.target;t.classList.contains(\"topnav_has_dropdown\")&&(e.preventDefault(),e.stopPropagation())},!1),Vimeo.desktop_shared._upload=function(o){if(/iPad|iPhone|iPod/.test(navigator.userAgent)){var n,a,i=\"vimeo://app.vimeo.com/upload?ref=mobileweb\",s=\"/upload\",r=[\"_trackEvent\",\"vimeo\",\"mobile_menu\",\"upload\"];return n=function(){t.webkitHidden||(e.location=s)},a=function(){e.location=i,setTimeout(n,25),e._gaq.push([\"_set\",\"hitCallback\",null])},e._gaq?(e._gaq.push([\"_set\",\"hitCallback\",a]),e._gaq.push(r)):a(),!1}e.location=o.href},Vimeo.desktop_shared._s2ds=function(){t.cookie=\"opt_out_mobile=1;expires=Fri, 31 Dec 9999 23:59:59 GMT;domain=\"+vimeo.domain,e.location.reload()},Vimeo.desktop_shared._s2l=function(t){var o=t.value,n=new XMLHttpRequest;n.open(\"POST\",\"/settings/locale\"),n.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),n.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\"),n.send(\"locale=\"+o+\"&token=\"+vimeo.xsrft),n.onload=function(){200===n.status&&e.location.reload()}};var a=\"click\",i=\"block\",s=\"none\",r=t.querySelector(\".js-topnav_mobile_header_logo\");r&&r.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault();var o=t.querySelector(\".js-topnav_mobile_menu_main\");o.style.display=i;var n=t.querySelector(\".js-topnav_mobile_header_close\");n.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),o.style.display=s});var r=t.querySelector(\".js-topnav_mobile_menu_settings\"),l=t.querySelector(\".js-topnav_mobile_header_settings\");l.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),r.style.display=i,o.style.display=s;var n=t.querySelector(\".js-topnav_mobile_header_settins_close\");n.addEventListener(a,function(e){e.stopPropagation(),e.preventDefault(),r.style.display=s,o.style.display=i})})},!1),setTimeout(function(){function e(e){var t=new XMLHttpRequest;t.open(\"POST\",\"/settings/nav\"),t.setRequestHeader(\"X-Requested-With\",\"XMLHttpRequest\"),t.setRequestHeader(\"Content-type\",\"application/x-www-form-urlencoded\"),t.send(\"message_state=\"+e+\"&token=\"+vimeo.xsrft),t.onload=function(){}}var o=t.getElementById(\"topnav_menu_avatar\");if(o){var n=o.querySelector(\".topnav_menu_avatar_bubble\"),a=(o.querySelector(\"#topnav_user_dropdown\"),!1);n&&n.classList.add(\"on\"),o.addEventListener(\"mouseover\",function(){a||(a=!0,n&&n.classList.remove(\"on\"),e(1))},!1)}},1e3)}(window,document);\n"))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "wrap_content")] children: NodeSet(Text("\n \n"), Element(name: "script" children: NodeSet(Text("\n!function(i){if(void 0===i.vimeo||void 0===i.vimeo.clips){i.vimeo=i.vimeo||{},i.vimeo.clips=i.vimeo.clips||{};var e=new XMLHttpRequest;e.open(\"GET\",\"https://player.vimeo.com/video/898029/config?autoplay=0&byline=0&collections=1&context=clip.main_beta&default_to_hd=1&outro=beginning&portrait=0&title=0&watch_trailer=0&s=4011bdbdf85ab88f7a2543448d3a3bf0d767d9da\",!0),e.onload=function(){i.vimeo.clips[\"898029\"]=JSON.parse(e.responseText)},e.withCredentials=!0,e.send()}}(window);\n"))), Text("\n\n\n"), Element(name: "main" attributes: [Attribute(name: "id" value: "main"), Attribute(name: "class" value: "is_loading")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "player_area")] children: NodeSet(Text("\n "), Element(name: "noscript" children: NodeSet(Text("\n "), Element(name: "img" attributes: [Attribute(name: "src" value: "https://i.vimeocdn.com/video/34373130.jpg?mw=1920&mh=1080&q=70"), Attribute(name: "alt" value: ""), Attribute(name: "style" value: "display: block; margin: 0 auto; max-height: 540px;")]), Text("\n "))), Text("\n \n "))), Text("\n\n "), Element(name: "noscript" children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip-content")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 clip-content-main columns u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row u-collapse clip-notification"), Attribute(name: "style" value: "margin-top: 1em; margin-bottom: 1.5em;")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "iris_notification iris_notification-clip iris_notification-clip--caution iris_notification--no-close clearfix"), Attribute(name: "style" value: "margin-bottom: 0;")] children: NodeSet(Text("\n "), Element(name: "p" children: NodeSet(Text("Please enable JavaScript to experience Vimeo in all of its glory."))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_info")] children: NodeSet(Text("\n "), Element(name: "h1" attributes: [Attribute(name: "class" value: "clip_info-header")] children: NodeSet(Text("Cherry Bloom - King Of The Knife"))), Text("\n "))), Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_info-subline--watch clip_info-subline--inline")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "userbyline-subline userbyline-subline--lg")] children: NodeSet(Text("\n "), Element(name: "span" children: NodeSet(Text("from"))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "userlink userlink--md")] children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/octave")] children: NodeSet(Text("Octave Zangs"))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "style" value: "display: inline-block")] children: NodeSet(Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "clip_info-time")] children: NodeSet(Element(name: "time" attributes: [Attribute(name: "datetime" value: "2008-04-14T13:10:39-04:00"), Attribute(name: "title" value: "Monday, April 14, 2008 at 1:10 PM")] children: NodeSet(Text("7 years ago"))))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_details iris_divider--dark iris_divider-top iris_divider-top--m iris_divider-bot iris_divider-bot--m u-collapse clearfix")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row u-collapse")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "medium-24 columns")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "clip_details-description description-wrapper iris_desc")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "first")] children: NodeSet(Text("The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout "), Element(name: "a" attributes: [Attribute(name: "href" value: "http://www.cherrybloom.net"), Attribute(name: "target" value: "_blank"), Attribute(name: "rel" value: "nofollow")] children: NodeSet(Text("cherrybloom.net"))))), Text(" "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n "))), Text("\n \n "), Element(name: "script" children: NodeSet(Text("\n window.vimeo = window.vimeo || {};\n window.vimeo.clip_page_config = {\"clip\":{\"id\":898029,\"title\":\"Cherry Bloom - King Of The Knife\",\"description\":\"<p class=\\\"first\\\">The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout <a href=\\\"http:\\/\\/www.cherrybloom.net\\\" target=\\\"_blank\\\" rel=\\\"nofollow\\\">cherrybloom.net<\\/a><\\/p>\",\"uploaded_on\":\"2008-04-14 13:10:39\",\"uploaded_on_relative\":\"7 years ago\",\"uploaded_on_full\":\"Monday, April 14, 2008 at 1:10 PM EST\",\"privacy\":{\"is_public\":true,\"type\":\"anybody\",\"description\":\"Public\"},\"duration\":{\"raw\":175,\"formatted\":\"02:55\"},\"is_liked\":false},\"owner\":{\"id\":206215,\"display_name\":\"Octave Zangs\",\"account_type\":\"\",\"badge\":null,\"portrait\":{\"src\":\"https:\\/\\/i.vimeocdn.com\\/portrait\\/2577152_75x75.jpg\",\"src_2x\":\"https:\\/\\/i.vimeocdn.com\\/portrait\\/2577152_150x150.jpg\"},\"url\":\"\\/octave\",\"is_following\":false},\"ondemand\":null,\"brand_channel\":null,\"cur_user\":null,\"status\":{\"state\":\"ready\"},\"copyright_status\":{\"is_blocked\":false,\"title\":null,\"message\":null,\"infringements\":null},\"content_block_status\":{\"is_blocked\":false,\"message\":null,\"continuous_play_enabled\":false},\"player\":{\"config_url\":\"https:\\/\\/player.vimeo.com\\/video\\/898029\\/config?autoplay=0&byline=0&collections=1&context=clip.main_beta&default_to_hd=1&outro=beginning&portrait=0&title=0&watch_trailer=0&s=4011bdbdf85ab88f7a2543448d3a3bf0d767d9da\",\"player_url\":\"player.vimeo.com\",\"dimensions\":{\"height\":540,\"width\":960},\"poster\":{\"url\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130.jpg?mw=2000&mh=1080&q=70\"}},\"continuous_play_enabled\":true,\"thumbnail\":{\"src\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130_190x107.jpg\",\"src_2x\":\"https:\\/\\/i.vimeocdn.com\\/video\\/34373130_380x214.jpg\",\"width\":190,\"height\":107},\"ads\":{\"sponsored_links\":{\"pub_id\":\"iwon-vimeo\",\"keywords\":\"cherry bloom secret sounds king of the knife rock alternative\"},\"display_ad\":{\"network_id\":\"54549544\",\"unit_name\":\"clip\",\"sizes\":[300,250],\"custom_targeting\":{\"content_rating\":{}}}},\"content_rating\":null,\"stat_counts\":{\"total_likes\":{\"raw\":11,\"formatted\":\"11\"},\"total_credits\":{\"raw\":1,\"formatted\":\"1\"},\"total_collections\":{\"raw\":1,\"formatted\":\"1\"},\"total_plays\":{\"raw\":4707,\"formatted\":\"4,707\"}},\"notifications\":[],\"categories_config\":{\"categories\":null,\"total_categories\":0},\"music_track\":null,\"credits\":{\"total_credits\":0},\"tags\":[\"cherry bloom\",\"secret sounds\",\"king of the knife\",\"rock\",\"alternative\"],\"api_app\":null,\"cc_license\":null,\"additional_content\":{\"clips\":[],\"context_name\":\"\",\"context_url\":\"\",\"view_all_url\":\"\"}};\n "))), Text("\n"))), Text("\n\n"), Element(name: "div" attributes: [Attribute(name: "class" value: "hide")] children: NodeSet(Text("\n "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\nconsole.log('%c \\n\\\n⎜ @@@& @@@@@@\\n\\\n⎜ \#@@@@@@@ &@@@@@@@@ Built using:\\n\\\n⎜ \#@@@@@@@@@. %%&@@@@@@@ • React + Flux\\n\\\n⎜ &@@@@@% (@@@@@( • ES6\\n\\\n⎜ @@@@@@ @@@@@@ • Fetch API\\n\\\n⎜ %@@@@@( .@@@@@( • Flexbox\\n\\\n⎜ @@@@@@(@@@@@@\\n\\\n⎜ /@@@@@@@@@@% Like playing with new technology, too?\\n\\\n⎜ &@@@@@@@% https://vimeo.com/jobs\\n\\\n⎜ @@@@@#\\n\\\n\\n\\\n', 'color: #00adef;');\n"))), Text("\n "))), Text("\n\n "), Element(name: "footer" attributes: [Attribute(name: "id" value: "mobile_footer_container"), Attribute(name: "class" value: "site_footer js-comment_scroller_floor")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row l-clearfix")] children: NodeSet(Text("\n "), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column l-collapse-lts")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "blue js-footer_heading")] children: NodeSet(Text("Vimeo"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/about"), Attribute(name: "data-ga-event-click" value: "footer|about_vimeo"), Attribute(name: "data-gtm-click" value: "footer_link_about_click")] children: NodeSet(Text("\n About Vimeo "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/blog"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_blog"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_blog_click")] children: NodeSet(Text("\n Vimeo Blog "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help/guidelines"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_guidelines"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_guidelines_click")] children: NodeSet(Text("\n Vimeo Guidelines "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "http://developer.vimeo.com"), Attribute(name: "data-ga-event-click" value: "footer|developers"), Attribute(name: "data-gtm-click" value: "footer_link_developers_click")] children: NodeSet(Text("\n Developers "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/jobs"), Attribute(name: "data-ga-event-click" value: "footer|jobs"), Attribute(name: "data-gtm-click" value: "footer_link_jobs_click")] children: NodeSet(Text("\n Jobs "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "yellow js-footer_heading")] children: NodeSet(Text("Help"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help"), Attribute(name: "data-ga-event-click" value: "footer|help_center"), Attribute(name: "data-gtm-click" value: "footer_link_help_center_click")] children: NodeSet(Text("\n Help Center "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "))), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool"), Attribute(name: "data-ga-event-click" value: "footer|video_school"), Attribute(name: "data-gtm-click" value: "footer_link_video_school_click")] children: NodeSet(Text("\n Video School "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/help/faq"), Attribute(name: "data-ga-event-click" value: "footer|faq"), Attribute(name: "data-gtm-click" value: "footer_link_faq_click")] children: NodeSet(Text("\n FAQ "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/forums"), Attribute(name: "data-ga-event-click" value: "footer|forums"), Attribute(name: "data-gtm-click" value: "footer_link_forums_click")] children: NodeSet(Text("\n Forums "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "green js-footer_heading")] children: NodeSet(Element(name: "span" children: NodeSet(Text("More"))))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/ondemand"), Attribute(name: "data-ga-event-click" value: "footer|on_demand"), Attribute(name: "data-gtm-click" value: "footer_link_on_demand_click")] children: NodeSet(Text("\n On Demand "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/everywhere"), Attribute(name: "data-ga-event-click" value: "footer|everywhere"), Attribute(name: "data-gtm-click" value: "footer_link_everywhere_click")] children: NodeSet(Text("\n Everywhere "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/upload"), Attribute(name: "data-ga-event-click" value: "footer|upload"), Attribute(name: "data-gtm-click" value: "footer_link_upload_click")] children: NodeSet(Text("\n Upload "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/site_map"), Attribute(name: "data-ga-event-click" value: "footer|site_map"), Attribute(name: "data-gtm-click" value: "footer_link_site_map_click")] children: NodeSet(Text("\n Site Map "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n"), Element(name: "section" attributes: [Attribute(name: "class" value: "footer_pillar medium-4 column")] children: NodeSet(Text("\n "), Element(name: "h4" attributes: [Attribute(name: "class" value: "pink js-footer_heading")] children: NodeSet(Text("Upgrade"))), Text("\n "), Element(name: "ul" children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/plus?v=footer"), Attribute(name: "data-ga-conversion-id" value: "9295"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_plus"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_plus_click")] children: NodeSet(Text("\n Vimeo Plus "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/pro?v=footer"), Attribute(name: "data-ga-conversion-id" value: "9296"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_pro"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_pro_click")] children: NodeSet(Text("\n Vimeo PRO "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/business"), Attribute(name: "data-ga-conversion-id" value: "9297"), Attribute(name: "data-ga-event-click" value: "footer|vimeo_for_business"), Attribute(name: "data-gtm-click" value: "footer_link_vimeo_for_business_click")] children: NodeSet(Text("\n Vimeo for Business "))), Text("\n "))), Text("\n "))), Text("\n"))), Text("\n\n "), Element(name: "aside" attributes: [Attribute(name: "id" value: "footer_tip"), Attribute(name: "class" value: "footer_tip medium-8 column"), Attribute(name: "aria-live" value: "polite")] children: NodeSet(Text("\n "), Element(name: "h4" children: NodeSet(Text("Did you know?"))), Text("\n "), Element(name: "button" attributes: [Attribute(name: "type" value: "button"), Attribute(name: "class" value: "iconify_resume_b get_tip"), Attribute(name: "data-ga-event-click" value: "button|refresh|did_you_know"), Attribute(name: "data-gtm-click" value: "footer_tip_refresh_click"), Attribute(name: "id" value: "get_tip")] children: NodeSet(Element(name: "span" attributes: [Attribute(name: "class" value: "offstage")] children: NodeSet(Text("Show another tip"))))), Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "active")] children: NodeSet(Text("Your video’s thumbnail and description matter. "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool/lesson/272/vimeo-curator-tips-your-thumbnails-and-descriptions")] children: NodeSet(Text("Our curators tell you why."))))), Text("\n "), Element(name: "p" children: NodeSet(Text("Frame rate and shutter speed are commonly confused. It’s time to "), Element(name: "a" attributes: [Attribute(name: "href" value: "/videoschool/lesson/56/frame-rate-vs-shutter-speed-setting-the-record-straight")] children: NodeSet(Text("set the record straight"))), Text("!"))), Text("\n"))), Text("\n "))), Text("\n"))), Text("\n \n \n "), Element(name: "footer" attributes: [Attribute(name: "class" value: "footers_footer")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "row")] children: NodeSet(Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "legal small-24 medium-16 column")] children: NodeSet(Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "footer_copyright")] children: NodeSet(Text("TM + © 2015 "), Element(name: "a" attributes: [Attribute(name: "href" value: "/")] children: NodeSet(Text("Vimeo"))), Text(", LLC. All rights reserved."))), Text("\n "), Element(name: "ul" attributes: [Attribute(name: "class" value: "inline_list dot_list")] children: NodeSet(Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/terms"), Attribute(name: "title" value: "Terms & Conditions")] children: NodeSet(Text("\n Terms "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/privacy"), Attribute(name: "title" value: "Privacy Policy")] children: NodeSet(Text("\n Privacy "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/dmca"), Attribute(name: "title" value: "Copyright Information")] children: NodeSet(Text("\n Copyright "))), Text("\n "))), Text("\n "), Element(name: "li" children: NodeSet(Text("\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "/cookie_policy"), Attribute(name: "title" value: "Learn more about how Vimeo uses cookies")] children: NodeSet(Text("\n Cookies "))), Text("\n "))), Text("\n\n "))), Text("\n "), Element(name: "p" attributes: [Attribute(name: "class" value: "with_love")] children: NodeSet(Text("\n Made with "), Element(name: "a" attributes: [Attribute(name: "href" value: "/love"), Attribute(name: "class" value: "iconify loveo"), Attribute(name: "title" value: "Love")] children: NodeSet(Text("k"))), Text(" in "), Element(name: "abbr" attributes: [Attribute(name: "title" value: "New York City")] children: NodeSet(Text("NYC"))), Text(". "))), Text("\n "))), Text("\n "), Element(name: "div" attributes: [Attribute(name: "class" value: "column small-24 medium-8")] children: NodeSet(Text("\n "), Element(name: "span" attributes: [Attribute(name: "class" value: "contentfilter iconify_lens_b")] children: NodeSet(Text("Mature content filter: "), Element(name: "a" attributes: [Attribute(name: "href" value: "javascript:void(0)"), Attribute(name: "onclick" value: "vimeo.Modal.create({content: '/settings/contentrating'})"), Attribute(name: "title" value: "Change your mature content filter")] children: NodeSet(Text("None"))))), Text("\n \n "), Element(name: "span" attributes: [Attribute(name: "class" value: "language")] children: NodeSet(Text("\n Language:\n "), Element(name: "a" attributes: [Attribute(name: "href" value: "#language"), Attribute(name: "onclick" value: "vimeo.Modal.create({content: '/settings/locale', size: 'small'}); return false;"), Attribute(name: "title" value: "Choose a different language")] children: NodeSet(Text("\n English "))), Text("\n "))), Text("\n\n "))), Text("\n "))), Text("\n"))), Text("\n\n "))), Text("\n\n \n \n "), Element(name: "script" attributes: [Attribute(name: "type" value: "application/ld+json")] children: NodeSet(Text("\n [{\"url\":\"https://vimeo.com/898029\",\"thumbnailUrl\":\"https://i.vimeocdn.com/video/34373130_1280x720.jpg\",\"embedUrl\":\"https://player.vimeo.com/video/898029\",\"name\":\"Cherry Bloom - King Of The Knife\",\"description\":\"The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net\",\"height\":360,\"width\":640,\"playerType\":\"HTML5 Flash\",\"videoQuality\":\"SD\",\"duration\":\"PT00H02M55S\",\"uploadDate\":\"2008-04-14T13:10:39-04:00\",\"interactionCount\":4707,\"thumbnail\":{\"@type\":\"ImageObject\",\"url\":\"https://i.vimeocdn.com/video/34373130_1280x720.jpg\",\"width\":1280,\"height\":720},\"author\":{\"@type\":\"Person\",\"name\":\"Octave Zangs\",\"url\":\"https://vimeo.com/octave\"},\"potentialAction\":{\"@type\":\"ViewAction\",\"target\":\"vimeo://app.vimeo.com/videos/898029\"},\"keywords\":[\"cherry bloom\",\"secret sounds\",\"king of the knife\",\"rock\",\"alternative\"],\"@type\":\"VideoObject\",\"@context\":\"http://schema.org\"},{\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@id\":\"https://vimeo.com/octave\",\"name\":\"Octave Zangs\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"https://vimeo.com/octave/videos\",\"name\":\"Videos\"}}],\"@type\":\"BreadcrumbList\",\"@context\":\"http://schema.org\"}] "))), Text("\n\n"), Element(name: "script" children: NodeSet(Text("\n var __fa = __fa || [];\n __fa.push(['trackPageview']);\n\n // Analytics Setup\n var _comscore = _comscore || [],\n _gaq = _gaq || [],\n _gtm = _gtm || [],\n _initial_gtm_state = {\"clip_id\":898029,\"creator_id\":206215,\"category\":\"\",\"staff_pick\":\"no\",\"language\":\"en\",\"user_status\":\"logged_out\",\"ga_universal_id\":\"UA-76641-64\",\"ga_classic_id\":\"UA-76641-8\"};\n\n _comscore.push({\n c1: \"2\",\n c2: \"10348289\"\n });\n\n _gaq.push(['_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js']);\n _gaq.push(['_setAccount', \"UA-76641-8\"]);\n _gaq.push(['_gat._anonymizeIp']);\n\n _gaq.push(['_setDomainName', 'vimeo.com']);\n \n _gaq.push(['_setAllowLinker', true]);\n _gaq.push(['_setAllowAnchor', true]);\n\n \n function trackHouseAd() {\n var ga_l = document.location;\n var ga_r = document.referrer;\n var ga_s = ga_l.search;\n\n if (ga_s.indexOf('house_ad') > -1) {\n var house_ad_value = ga_s.match(/house_ad=([^&]+)/)[1];\n\n _gaq.push(['_trackEvent', 'engagement:house-ad', house_ad_value, ga_r, undefined, true]);\n _gaq.push(['_setCustomVar', 8, 'house_ad', house_ad_value, 1]);\n }\n }\n\n trackHouseAd();\n\n \n _gaq.push(['_setCustomVar', 1, 'user_status', 'logged_out', 3]);\n _gaq.push(['_setCustomVar', 4, 'language', 'en', 3]);\n _gaq.push(['_setCustomVar', 3, 'ms', '0', 1]);\n _gaq.push(['_setCustomVar', 10, 'vuid', document.cookie.replace(/(?:(?:^|.*;\\s*)vuid\\s*\\=\\s*([^;]*).*$)|^.*$/, \"$1\"), 1]);\n\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n _gaq.push(['_setCustomVar', 44, 'clip_redesign', '2', 1]);\n \n _gaq.push(['_trackPageview']);\n\n \n \n _initial_gtm_state['vuid'] = document.cookie.replace(/(?:(?:^|.*;\\s*)vuid\\s*\\=\\s*([^;]*).*$)|^.*$/, \"$1\");\n _initial_gtm_state['gtm.start'] = new Date().getTime();\n _initial_gtm_state['event'] = 'gtm.js';\n _gtm.push(_initial_gtm_state);\n \n var _extend = function(){for(var r=arguments[0],n=1,e=arguments.length;e>n;n++){var t=arguments[n];for(var a in t)t.hasOwnProperty(a)&&(r[a]=t[a])}return r};\n\n\n var CSS_DIR = 'https://f.vimeocdn.com/styles/css_opt/',\n JS_DIR = 'https://f.vimeocdn.com/js_opt/',\n IMAGE_DIR = 'https://f.vimeocdn.com/images_v6/',\n SVG_DIR = 'https://f.vimeocdn.com/svg/',\n BUILD_HASH = 'ba7be';\n\n var vimeo = _extend((window.vimeo || {}), {\"app_version\":\"v6\",\"domain\":\"vimeo.com\",\"url\":\"vimeo.com\",\"cur_user\":false,\"is_mobile\":false,\"config\":{\"autocomplete_enabled\":true}});\n\n vimeo.config = _extend((vimeo.config || {}), []);\n\n\n var localeConfig = {\n lang: 'en',\n 'Date': {\n months: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],\n months_abbr: [\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],\n days: [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],\n days_abbr: [\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"],\n\n // Culture's date order: MM/DD/YYYY\n dateOrder: ['date', 'month', 'year'],\n shortDate: '%d/%m/%Y',\n shortTime: '%I:%M%p',\n AM: 'AM',\n PM: 'PM',\n firstDayOfWeek: 0,\n\n // Date.Extras\n ordinal: function(dayOfMonth){\n return dayOfMonth;\n }\n },\n 'DatePicker': {\n select_a_time: \"Select a time\",\n use_mouse_wheel: \"Use the mouse wheel to quickly change value\",\n time_confirm_button: \"OK\",\n apply_range: \"Apply\",\n cancel: \"Cancel\",\n week: \"Wk\" },\n 'Number': {\n decimal: '.',\n group: ',',\n currency: {\n prefix: '$'\n }\n },\n 'FormValidator': {\"required\":\"This field is required.\",\"requiredChk\":\"This field is required.\"} };\n\n var fullLocale = '';\n\n \n var Copy = {translate:function(t,i,u){var e='object'!=typeof this.dict[t]?this.dict[t]:i?this.dict[t].plural:this.dict[t].singular;return'object'==typeof u&&(e=this.substitute(e,u)),e},substitute:function(t,i){return void 0!==t.substitute?t.substitute(i):t.replace(/\\\\?\\{([^{}]+)\\}/g,function(t,u){return'\\\\'==t.charAt(0)?t.slice(1):null!=i[u]?i[u]:''})},dict:{}};\n Copy.dict = {\"did_you_mean_email\":\"Did you mean <em>{SUGGEST}<\\/em>?\",\"email_password_mismatch\":\"Email and password do not match\",\"just_now\":\"just now\",\"seconds_ago\":{\"singular\":\"{COUNT} second ago\",\"plural\":\"{COUNT} seconds ago\"},\"minutes_ago\":{\"singular\":\"{COUNT} minute ago\",\"plural\":\"{COUNT} minutes ago\"},\"hours_ago\":{\"singular\":\"{COUNT} hour ago\",\"plural\":\"{COUNT} hours ago\"},\"open_comment_box\":\"Add new comment instead »\",\"url_unavailable\":\"Sorry, this url is unavailable.\",\"unsaved_changes_generic\":\"You have unsaved changes, are you sure you wish to leave?\",\"add\":\"Add\",\"remove\":\"Remove\",\"select\":\"Select\",\"no_followers_for_letter\":\"You don’t follow anyone that begin with the letter “{PAGE_LETTER}”\",\"share_limit_reached\":\"You have reached the maximum number of users to share with.\",\"old_code\":\"Use old embed code\",\"new_code\":\"Use new embed code\",\"at_least_one\":\"There must be at least one user.\",\"available\":\"Available\",\"unavailable\":\"Unavailable\",\"browse_error_generic\":\"Sorry, there was an error\",\"browse_error_no_videos\":\"Sorry, no videos found\",\"follow\":\"Follow\",\"following\":\"Following\",\"unfollow\":\"Unfollow\",\"unfollowing\":\"Unfollowing\",\"count_comments\":{\"singular\":\"{COUNT} comment\",\"plural\":\"{COUNT} comments\"},\"first_comment\":\"Be the first to comment…\",\"no_comments_for_you\":\"Forbidden. You cannot post comments on this page.\",\"oops\":\"Oops!\",\"player_try_again\":\"That wasn't supposed to happen. Please try again in a few minutes.\",\"duration_input_min_duration\":\"The duration cannot be less than {MIN_DURATION}.\",\"duration_input_max_duration\":\"The duration cannot be greater than {MAX_DURATION}.\",\"duration_input_invalid_characters\":\"0-9 and : are the only acceptable inputs.\",\"close\":\"Close\",\"expand\":\"Expand\",\"loading\":\"Loading...\",\"top\":\"top\",\"advanced_search\":\"Advanced Search\",\"no_suggestions\":\"No suggestions\",\"recent_searches\":\"Recent Searches\",\"search_all\":\"Search All of Vimeo\",\"1 Track\":\"1 Track\",\"About this video\":\"About this video\",\"Add comment\":\"Add comment\",\"Add reply\":\"Add reply\",\"Add to collections\":\"Add to collections\",\"Add\":\"Add\",\"Albums\":\"Albums\",\"Approximate Time Remaining\":\"Approximate Time Remaining\",\"Are you sure you want delete this comment permanently?\":\"Are you sure you want delete this comment permanently?\",\"Autoplay off\":\"Autoplay off\",\"Autoplay on\":\"Autoplay on\",\"Buy {DISPLAY_PRICE}\":\"Buy {DISPLAY_PRICE}\",\"by {ARTIST_NAME}\":\"by {ARTIST_NAME}\",\"Cancel\":\"Cancel\",\"Change settings.\":\"Change settings.\",\"Change your content filter preference\":\"Change your content filter preference\",\"Channels\":\"Channels\",\"Click here to add a new comment\":\"Click here to add a new comment\",\"Collection name\":\"Collection name\",\"Comments are disabled.\":\"Comments are disabled.\",\"Creative Commons License:\":\"Creative Commons License:\",\"Delete comment\":\"Delete comment\",\"Delete\":\"Delete\",\"Dimensions\":\"Dimensions\",\"Download Link\":\"Download Link\",\"Download\":\"Download\",\"Edit Settings\":\"Edit Settings\",\"Edit\":\"Edit\",\"Exit fullscreen\":\"Exit fullscreen\",\"Fetch\":\"Fetch\",\"File Size\":\"File Size\",\"File\":\"File\",\"Finishes\":\"Finishes\",\"Follow\":\"Follow\",\"Following\":\"Following\",\"from {USER_NAME}\":\"from {USER_NAME}\",\"from {VOD_TITLE}\":\"from {VOD_TITLE}\",\"Get me out of here!\":\"Get me out of here!\",\"Groups\":\"Groups\",\"Incorrect rating\":\"Incorrect rating\",\"Learn about other violations\":\"Learn about other violations\",\"Learn more\":\"Learn more\",\"Leave the first comment:\":\"Leave the first comment:\",\"Like what you saw? See the full title.\":\"Like what you saw? See the full title.\",\"Like\":\"Like\",\"Liked\":\"Liked\",\"Likes\":\"Likes\",\"Load {COUNT} previous comment\":{\"singular\":\"Load {COUNT} previous comment\",\"plural\":\"Load {COUNT} previous comments\"},\"Loading\":\"Loading\",\"Moneymaker\":\"Moneymaker\",\"more\":\"more\",\"Next video\":\"Next video\",\"Not playing nice\":\"Not playing nice\",\"Only visible to you\":\"Only visible to you\",\"Original file is in the archive\":\"Original file is in the archive\",\"Permalink to this comment\":\"Permalink to this comment\",\"Plays\":\"Plays\",\"Portfolios\":\"Portfolios\",\"Presented by {BRAND_NAME}\\u2019s {CAMPAIGN_TITLE}\":\"Presented by {BRAND_NAME}\\u2019s {CAMPAIGN_TITLE}\",\"Previous video\":\"Previous video\",\"Public Domain Dedication\":\"Public Domain Dedication\",\"Read more\\u2026\":\"Read more\\u2026\",\"Remember to be cool and play nice!\":\"Remember to be cool and play nice!\",\"Remove credit\":\"Remove credit\",\"Rent {DISPLAY_PRICE}\":\"Rent {DISPLAY_PRICE}\",\"Reply to this comment\":\"Reply to this comment\",\"Reply\":\"Reply\",\"Report this video\":\"Report this video\",\"Report this video?\":\"Report this video?\",\"Retry upload\":\"Retry upload\",\"Settings\":\"Settings\",\"Share\":\"Share\",\"Show me the video\":\"Show me the video\",\"Show more\\u2026\":\"Show more\\u2026\",\"Source files not accessed for 30 days are automatically stored in our secret underground storage archive. As such, it may take a few hours to retrieve the file. Still want the original source file?\":\"Source files not accessed for 30 days are automatically stored in our secret underground storage archive. As such, it may take a few hours to retrieve the file. Still want the original source file?\",\"Spam\":\"Spam\",\"Sponsored Links\":\"Sponsored Links\",\"Stats\":\"Stats\",\"Subscribe {DISPLAY_PRICE}\\/{BILLING_PERIOD}\":\"Subscribe {DISPLAY_PRICE}\\/{BILLING_PERIOD}\",\"The original source file is hosted on Dropbox.\":\"The original source file is hosted on Dropbox.\",\"The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.\":\"The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission.\",\"The person who uploaded this video obviously didn\\u2019t make it (it\\u2019s a TV show, movie trailer, or ripped from elsewhere the web.)\":\"The person who uploaded this video obviously didn\\u2019t make it (it\\u2019s a TV show, movie trailer, or ripped from elsewhere the web.)\",\"This license allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to you.\":\"This license allows for redistribution, commercial and non-commercial, as long as it is passed along unchanged and in whole, with credit to you.\",\"This license is the most restrictive of our six main licenses, only allowing others to download your works and share them with others as long as they credit you, but they can\\u2019t change them in any way or use them commercially.\":\"This license is the most restrictive of our six main licenses, only allowing others to download your works and share them with others as long as they credit you, but they can\\u2019t change them in any way or use them commercially.\",\"This license lets others distribute, remix, tweak, and build upon your work, even commercially, as long as they credit you for the original creation. This is the most accommodating of licenses offered. Recommended for maximum dissemination and use of licensed materials.\":\"This license lets others distribute, remix, tweak, and build upon your work, even commercially, as long as they credit you for the original creation. This is the most accommodating of licenses offered. Recommended for maximum dissemination and use of licensed materials.\",\"This license lets others remix, tweak, and build upon your work even for commercial purposes, as long as they credit you and license their new creations under the identical terms. This license is often compared to “copyleft” free and open source software licenses. All new works based on yours will carry the same license, so any derivatives will also allow commercial use. This is the license used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licensed projects.\":\"This license lets others remix, tweak, and build upon your work even for commercial purposes, as long as they credit you and license their new creations under the identical terms. This license is often compared to “copyleft” free and open source software licenses. All new works based on yours will carry the same license, so any derivatives will also allow commercial use. This is the license used by Wikipedia, and is recommended for materials that would benefit from incorporating content from Wikipedia and similarly licensed projects.\",\"This license lets others remix, tweak, and build upon your work non-commercially, and although their new works must also acknowledge you and be non-commercial, they don\\u2019t have to license their derivative works on the same terms.\":\"This license lets others remix, tweak, and build upon your work non-commercially, and although their new works must also acknowledge you and be non-commercial, they don\\u2019t have to license their derivative works on the same terms.\",\"This license lets others remix, tweak, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.\":\"This license lets others remix, tweak, and build upon your work non-commercially, as long as they credit you and license their new creations under the identical terms.\",\"This source file has been lovingly stored in our archive.\":\"This source file has been lovingly stored in our archive.\",\"This video contains harassment, incites hatred, or depicts extreme or real-life violence.\":\"This video contains harassment, incites hatred, or depicts extreme or real-life violence.\",\"This video contains pornography, advertises a product or service of an erotic nature, or seems primarily focused on sexual stimulation.\":\"This video contains pornography, advertises a product or service of an erotic nature, or seems primarily focused on sexual stimulation.\",\"This video is an advertisement, commercial, or is a video that actively sells a product or service.\":\"This video is an advertisement, commercial, or is a video that actively sells a product or service.\",\"This video is primarily designed to drive traffic to third party sites, use Search Engine Optimization (SEO) to manipulate search rankings, or otherwise deceive or mislead the audience.\":\"This video is primarily designed to drive traffic to third party sites, use Search Engine Optimization (SEO) to manipulate search rankings, or otherwise deceive or mislead the audience.\",\"This video should be marked as \\u201cMature\\u201d due to nudity, profanity, violence, or drug\\/alcohol use.\":\"This video should be marked as \\u201cMature\\u201d due to nudity, profanity, violence, or drug\\/alcohol use.\",\"Unfollow\":\"Unfollow\",\"Unlike\":\"Unlike\",\"Up next\":\"Up next\",\"update your content rating preferences\":\"update your content rating preferences\",\"Upgrade and we\\u2019ll hold on to your original video files.\":\"Upgrade and we\\u2019ll hold on to your original video files.\",\"Uploaded by {USER}\":\"Uploaded by {USER}\",\"Uploader did not make this\":\"Uploader did not make this\",\"via {APP_NAME}\":\"via {APP_NAME}\",\"via {CAMEO}\":\"via {CAMEO}\",\"View all\":\"View all\",\"View channel\":\"View channel\",\"View stats dashboard\":\"View stats dashboard\",\"View title\":\"View title\",\"Viewer downloading for this video is disabled.\":\"Viewer downloading for this video is disabled.\",\"Watch it again\":\"Watch it again\",\"We\\u2019re on it! Please check back later, as it could take a few hours.\":\"We\\u2019re on it! Please check back later, as it could take a few hours.\",\"When you add this private video to a collection, the video will be viewable within that album, group, etc.\":\"When you add this private video to a collection, the video will be viewable within that album, group, etc.\",\"Why are you reporting this video?\":\"Why are you reporting this video?\",\"XXX-rated\":\"XXX-rated\",\"Yes, fetch original file\":\"Yes, fetch original file\",\"You can {UPDATE_YOUR_PREFERENCES_LINK} at any time.\":\"You can {UPDATE_YOUR_PREFERENCES_LINK} at any time.\",\"{COUNT} Category\":{\"singular\":\"{COUNT} Category\",\"plural\":\"{COUNT} Categories\"},\"{COUNT} Collection\":{\"singular\":\"{COUNT} Collection\",\"plural\":\"{COUNT} Collections\"},\"{COUNT} Comment\":{\"singular\":\"{COUNT} Comment\",\"plural\":\"{COUNT} Comments\"},\"{COUNT} Credit\":{\"singular\":\"{COUNT} Credit\",\"plural\":\"{COUNT} Credits\"},\"{COUNT} Like\":{\"singular\":\"{COUNT} Like\",\"plural\":\"{COUNT} Likes\"},\"{COUNT} Photo\":{\"singular\":\"{COUNT} Photo\",\"plural\":\"{COUNT} Photos\"},\"{COUNT} Play\":{\"singular\":\"{COUNT} Play\",\"plural\":\"{COUNT} Plays\"}};\n"))), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/utils/player_manager/player_manager.min.js?bd8b4bb2")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n if (typeof playerAssetUrls !== 'undefined') {\n PlayerManager.run(playerAssetUrls);\n }\n "))), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/logging_combined.min.js?2fc31521")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/ablincoln_combined.min.js?baae8e04")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/clip_beta_libs_prod_combined.min.js?79a7a4b5")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "src" value: "https://f.vimeocdn.com/js_opt/_bundles/clip.bundle.min.js?3bbac8ac")]), Text("\n\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//sb.scorecardresearch.com/beacon.js")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//www.googletagmanager.com/gtm.js?id=GTM-RBKK&l=_gtm")]), Text("\n "), Element(name: "script" attributes: [Attribute(name: "async"), Attribute(name: "src" value: "//stats.g.doubleclick.net/dc.js")]), Text("\n "), Element(name: "script" children: NodeSet(Text("\n function onVimeoDomReady(e) {\n \n window.CE_SNAPSHOT_NAME = 'clip_new';\n \n setTimeout(function() {\n var a = document.createElement('script'),\n b = document.getElementsByTagName('script')[0];\n\n a.src = document.location.protocol + '//script.crazyegg.com/pages/scripts/0014/1514.js?' + Math.floor(new Date().getTime() / 3600000);\n a.async = true;\n a.type = 'text/javascript';\n b.parentNode.insertBefore(a, b);\n }, 1);\n \n if (!vimeo.bypass_player_responsive_delegates) {\n vimeo.player_responsive_delegates = vimeo.player_responsive_delegates || {};\n vimeo.player_responsive_delegates.willOpenShareOverlay = vimeo.player_responsive_delegates.willOpenShareOverlay || function(id) {\n PlayerManager.pauseAllPlayers();\n vimeo.share.Popup(id);\n return false;\n };\n\n vimeo.player_responsive_delegates.willOpenLoginForm = vimeo.player_responsive_delegates.willOpenLoginForm || function(id, context) {\n PlayerManager.pauseAllPlayers();\n\n new vimeo.ui.Lightbox({\n url: '/log_in' + (context ? '?player=1&clip_id=' + id + '&context=' + context : ''),\n max_width: 500,\n onOpen: function() {\n vimeo.Global.insertAssets();\n }\n }).open();\n\n return false;\n };\n\n if (PlayerManager) {\n PlayerManager.setDefaultDelegate(vimeo.player_responsive_delegates);\n }\n }\n \n if (PlayerManager) {\n PlayerManager.dispatchReadySignals();\n }\n \n }\n\n $(document).ready(onVimeoDomReady);\n "))), Text("\n\n\n "))), Text("\n"))), Text("\n"))
|
7
|
-
)
|
8
|
-
F.................
|
9
|
-
|
10
|
-
Failures:
|
11
|
-
|
12
|
-
1) VideoInfo::Providers::Vimeo#available? with 'password required' video #available? should not be available
|
13
|
-
Failure/Error: it { is_expected.to_not be_available }
|
14
|
-
expected `#<VideoInfo:0x000000031b0578 @provider=#<VideoInfo::Providers::Vimeo:0x000000031aff38 @options={"User-Agent"=>"VideoInfo/2.5.0"}, @url="http://vimeo.com/74636562", @video_id="74636562">>.available?` to return false, got true
|
15
|
-
# ./spec/lib/video_info/providers/vimeo_spec.rb:68:in `block (5 levels) in <top (required)>'
|
16
|
-
|
17
|
-
2) VideoInfo::Providers::Vimeo with video 898029 #author_thumbnail should eq "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
|
18
|
-
Failure/Error: it { is_expected.to eq 'https://i.vimeocdn.com/portrait/2577152_75x75.jpg' }
|
19
|
-
|
20
|
-
expected: "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
|
21
|
-
got: []
|
22
|
-
|
23
|
-
(compared using ==)
|
24
|
-
# ./spec/lib/video_info/providers/vimeo_spec.rb:153:in `block (4 levels) in <top (required)>'
|
25
|
-
|
26
|
-
Finished in 1.57 seconds (files took 0.36192 seconds to load)
|
27
|
-
43 examples, 2 failures
|
28
|
-
|
29
|
-
Failed examples:
|
30
|
-
|
31
|
-
rspec ./spec/lib/video_info/providers/vimeo_spec.rb:68 # VideoInfo::Providers::Vimeo#available? with 'password required' video #available? should not be available
|
32
|
-
rspec ./spec/lib/video_info/providers/vimeo_spec.rb:153 # VideoInfo::Providers::Vimeo with video 898029 #author_thumbnail should eq "https://i.vimeocdn.com/portrait/2577152_75x75.jpg"
|
33
|
-
|
@@ -1,170 +0,0 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
require 'htmlentities'
|
3
|
-
require 'net/http'
|
4
|
-
|
5
|
-
class VideoInfo
|
6
|
-
module Providers
|
7
|
-
class Vkontakte < Provider
|
8
|
-
attr_accessor :video_owner
|
9
|
-
|
10
|
-
def initialize(url, options = {})
|
11
|
-
super(url, options)
|
12
|
-
@url.strip!
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.usable?(url)
|
16
|
-
url.strip!
|
17
|
-
vkontakte = !!(url =~ /\A(http|https):\/\/(vk\.com)|(vkontakte\.ru)\z/)
|
18
|
-
valid = !!(url =~ /\A#{URI::regexp(['http', 'https'])}\z/)
|
19
|
-
vkontakte && valid
|
20
|
-
end
|
21
|
-
|
22
|
-
def provider
|
23
|
-
'Vkontakte'
|
24
|
-
end
|
25
|
-
|
26
|
-
def description
|
27
|
-
content = data[/"desc":"(.*?)",/, 1]
|
28
|
-
HTMLEntities.new.decode(content)
|
29
|
-
end
|
30
|
-
alias_method :keywords, :description
|
31
|
-
|
32
|
-
def width
|
33
|
-
{ 240 => 320,
|
34
|
-
360 => 480,
|
35
|
-
480 => 640,
|
36
|
-
720 => 1280
|
37
|
-
}[height].to_i
|
38
|
-
end
|
39
|
-
|
40
|
-
def height
|
41
|
-
data[/url(\d+)/,1].to_i
|
42
|
-
end
|
43
|
-
|
44
|
-
def title
|
45
|
-
data[/\="mv_title">(.*)<\/div>/, 1].gsub(' | ВКонтакте', '')
|
46
|
-
end
|
47
|
-
|
48
|
-
def view_count
|
49
|
-
data[/mv_views_count_number\">.*?(\d+)/, 1].to_i
|
50
|
-
end
|
51
|
-
|
52
|
-
def embed_url
|
53
|
-
iframe_src = data[
|
54
|
-
/iframe\ id=\"video_player\".*src=\"([^\"]*)\".*frameborder=/, 1
|
55
|
-
]
|
56
|
-
if iframe_src
|
57
|
-
# it may be youtube video
|
58
|
-
VideoInfo::Providers::Youtube.new(
|
59
|
-
URI.unescape(iframe_src.gsub(/\\/, ''))
|
60
|
-
).embed_url
|
61
|
-
else
|
62
|
-
"//vk.com/video_ext.php?oid=#{video_owner}" +
|
63
|
-
"&id=#{video_id}&hash=#{_data_hash}"
|
64
|
-
end
|
65
|
-
rescue
|
66
|
-
# or rutube video
|
67
|
-
iframe_src
|
68
|
-
end
|
69
|
-
|
70
|
-
def duration
|
71
|
-
data[/"duration":(\d+)/, 1].to_i
|
72
|
-
end
|
73
|
-
|
74
|
-
def available?
|
75
|
-
!%w[403 404 302 401].include?(_response_code)
|
76
|
-
end
|
77
|
-
|
78
|
-
private
|
79
|
-
|
80
|
-
def _make_request(url, options)
|
81
|
-
request = Net::HTTP::Post.new(url.path)
|
82
|
-
request.body = URI.encode_www_form(options)
|
83
|
-
conn = Net::HTTP.new(url.host, url.port)
|
84
|
-
conn.use_ssl = true
|
85
|
-
resp = conn.request(request)
|
86
|
-
resp.body.force_encoding('cp1251').encode('UTF-8', undef: :replace)
|
87
|
-
end
|
88
|
-
|
89
|
-
def _set_data_from_api_impl(api_url)
|
90
|
-
options['act'] = 'show'
|
91
|
-
options['al'] = '1'
|
92
|
-
options['video'] = "#{@video_owner}_#{@video_id}"
|
93
|
-
data = _make_request(api_url, options)
|
94
|
-
if data.index('Ошибка доступа')
|
95
|
-
# try second time
|
96
|
-
_make_request(api_url, options)
|
97
|
-
else
|
98
|
-
data
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def _error_found?(response)
|
103
|
-
title = response.body[
|
104
|
-
/<title>(.*)<\/title>/, 1
|
105
|
-
].force_encoding(
|
106
|
-
'cp1251'
|
107
|
-
).encode(
|
108
|
-
'UTF-8', undef: :replace
|
109
|
-
)
|
110
|
-
!!title.index('Error | VK')
|
111
|
-
end
|
112
|
-
|
113
|
-
def _get_response_code(response)
|
114
|
-
if response.header['location'] == '/'
|
115
|
-
'401'
|
116
|
-
elsif response.code == '302'
|
117
|
-
'302'
|
118
|
-
elsif _error_found? response
|
119
|
-
'403'
|
120
|
-
else
|
121
|
-
response.code
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def _response_code
|
126
|
-
response = Net::HTTP.get_response(_api_base, _api_path, 80)
|
127
|
-
code = _get_response_code response
|
128
|
-
if code == '302'
|
129
|
-
_get_response_code Net::HTTP.get_response(
|
130
|
-
URI.parse(response.header['location'])
|
131
|
-
)
|
132
|
-
else
|
133
|
-
code
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
def _api_base
|
138
|
-
URI.parse(url).host
|
139
|
-
end
|
140
|
-
|
141
|
-
def _api_path
|
142
|
-
URI.parse(url).path
|
143
|
-
end
|
144
|
-
|
145
|
-
def _data_hash
|
146
|
-
data[/"hash2":"(\w+)/, 1]
|
147
|
-
end
|
148
|
-
|
149
|
-
def _set_video_id_from_url
|
150
|
-
url.gsub(_url_regex) { @video_owner, @video_id = $1.split('_') }
|
151
|
-
end
|
152
|
-
|
153
|
-
def _url_regex
|
154
|
-
/(?:vkontakte\.ru\/video|vk\.com\/video|vk\.com\/.*?video)(-?\d+_\d+)/i
|
155
|
-
end
|
156
|
-
|
157
|
-
def _default_iframe_attributes
|
158
|
-
{ allowfullscreen: 'allowfullscreen' }
|
159
|
-
end
|
160
|
-
|
161
|
-
def _default_url_attributes
|
162
|
-
{}
|
163
|
-
end
|
164
|
-
|
165
|
-
def _api_url
|
166
|
-
URI('https://vk.com/al_video.php')
|
167
|
-
end
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
@@ -1,242 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe VideoInfo::Providers::Vimeo do
|
4
|
-
before(:all) do
|
5
|
-
VideoInfo.provider_api_keys = { vimeo: '6b66b015a3504793b4f541d878f46ff6' }
|
6
|
-
end
|
7
|
-
|
8
|
-
describe '.usable?' do
|
9
|
-
subject { VideoInfo::Providers::Vimeo.usable?(url) }
|
10
|
-
|
11
|
-
context 'with vimeo url' do
|
12
|
-
let(:url) { 'http://www.vimeo.com/898029' }
|
13
|
-
it { is_expected.to be_truthy }
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'with Vimeo OnDemand url' do
|
17
|
-
let(:url) { 'https://vimeo.com/ondemand/less/101677664' }
|
18
|
-
it { is_expected.to be_truthy }
|
19
|
-
end
|
20
|
-
|
21
|
-
context 'with Vimeo Channels url' do
|
22
|
-
let(:url) { 'https://vimeo.com/channels/any_channel/111431415' }
|
23
|
-
it { is_expected.to be_truthy }
|
24
|
-
end
|
25
|
-
|
26
|
-
context "with Vimeo Review url" do
|
27
|
-
let(:url) { 'https://vimeo.com/user39798190/review/126641548/8a56234e32' }
|
28
|
-
it { is_expected.to be_truthy }
|
29
|
-
end
|
30
|
-
|
31
|
-
context 'with vimeo album url' do
|
32
|
-
let(:url) { 'http://vimeo.com/album/2755718' }
|
33
|
-
it { is_expected.to be_falsey }
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'with vimeo hubnub embed url' do
|
37
|
-
let(:url) { 'http://player.vimeo.com/hubnut/album/2755718' }
|
38
|
-
it { is_expected.to be_falsey }
|
39
|
-
end
|
40
|
-
|
41
|
-
context 'with other url' do
|
42
|
-
let(:url) { 'http://www.youtube.com/898029' }
|
43
|
-
it { is_expected.to be_falsey }
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
describe '#available?' do
|
48
|
-
context 'with valid video', :vcr do
|
49
|
-
subject { VideoInfo.new('http://www.vimeo.com/898029') }
|
50
|
-
|
51
|
-
describe '#available?' do
|
52
|
-
it { is_expected.to be_available }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
context "with 'this video does not exist' video", :vcr do
|
57
|
-
subject { VideoInfo.new('http://vimeo.com/59312311') }
|
58
|
-
|
59
|
-
describe '#available?' do
|
60
|
-
it { is_expected.to_not be_available }
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "with 'password required' video", :vcr do
|
65
|
-
subject { VideoInfo.new('http://vimeo.com/74636562') }
|
66
|
-
|
67
|
-
describe '#available?' do
|
68
|
-
it { is_expected.to_not be_available }
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
context 'with video 898029', :vcr do
|
74
|
-
subject { VideoInfo.new('http://www.vimeo.com/898029') }
|
75
|
-
|
76
|
-
describe '#provider' do
|
77
|
-
subject { super().provider }
|
78
|
-
it { is_expected.to eq 'Vimeo' }
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '#video_id' do
|
82
|
-
subject { super().video_id }
|
83
|
-
it { is_expected.to eq '898029' }
|
84
|
-
end
|
85
|
-
|
86
|
-
describe '#url' do
|
87
|
-
subject { super().url }
|
88
|
-
it { is_expected.to eq 'http://www.vimeo.com/898029' }
|
89
|
-
end
|
90
|
-
|
91
|
-
describe '#embed_url' do
|
92
|
-
subject { super().embed_url }
|
93
|
-
it { is_expected.to eq '//player.vimeo.com/video/898029' }
|
94
|
-
end
|
95
|
-
|
96
|
-
describe '#embed_code' do
|
97
|
-
subject { super().embed_code }
|
98
|
-
it { is_expected.to eq '<iframe src="//player.vimeo.com/video/898029?autoplay=0&byline=0&portrait=0&title=0" frameborder="0"></iframe>' }
|
99
|
-
end
|
100
|
-
|
101
|
-
describe '#title' do
|
102
|
-
subject { super().title }
|
103
|
-
it { is_expected.to eq 'Cherry Bloom - King Of The Knife' }
|
104
|
-
end
|
105
|
-
|
106
|
-
describe '#description' do
|
107
|
-
subject { super().description }
|
108
|
-
it { is_expected.to eq 'The first video from the upcoming album Secret Sounds, to download in-stores April 14. Checkout http://www.cherrybloom.net' }
|
109
|
-
end
|
110
|
-
|
111
|
-
describe '#keywords' do
|
112
|
-
subject { super().keywords }
|
113
|
-
it { is_expected.to eq 'cherry bloom, secret sounds, king of the knife, rock, alternative' }
|
114
|
-
end
|
115
|
-
|
116
|
-
describe '#duration' do
|
117
|
-
subject { super().duration }
|
118
|
-
it { is_expected.to eq 175 }
|
119
|
-
end
|
120
|
-
|
121
|
-
describe '#width' do
|
122
|
-
subject { super().width }
|
123
|
-
it { is_expected.to eq 640 }
|
124
|
-
end
|
125
|
-
|
126
|
-
describe '#height' do
|
127
|
-
subject { super().height }
|
128
|
-
it { is_expected.to eq 360 }
|
129
|
-
end
|
130
|
-
|
131
|
-
describe '#date' do
|
132
|
-
subject { super().date }
|
133
|
-
it { is_expected.to eq Time.parse('2008-04-14T17:10:39+00:00', Time.now.utc).utc }
|
134
|
-
end
|
135
|
-
|
136
|
-
describe '#thumbnail_small' do
|
137
|
-
subject { super().thumbnail_small }
|
138
|
-
it { is_expected.to eq 'https://i.vimeocdn.com/video/34373130_100x75.jpg' }
|
139
|
-
end
|
140
|
-
|
141
|
-
describe '#thumbnail_medium' do
|
142
|
-
subject { super().thumbnail_medium }
|
143
|
-
it { is_expected.to eq 'https://i.vimeocdn.com/video/34373130_200x150.jpg' }
|
144
|
-
end
|
145
|
-
|
146
|
-
describe '#thumbnail_large' do
|
147
|
-
subject { super().thumbnail_large }
|
148
|
-
it { is_expected.to eq 'https://i.vimeocdn.com/video/34373130_640.jpg' }
|
149
|
-
end
|
150
|
-
|
151
|
-
describe '#author_thumbnail' do
|
152
|
-
subject { super().author_thumbnail }
|
153
|
-
it { is_expected.to eq 'https://i.vimeocdn.com/portrait/2577152_75x75.jpg' }
|
154
|
-
end
|
155
|
-
|
156
|
-
describe '#author' do
|
157
|
-
subject { super().author }
|
158
|
-
it { is_expected.to eq 'Octave Zangs' }
|
159
|
-
end
|
160
|
-
|
161
|
-
describe '#view_count' do
|
162
|
-
subject { super().view_count }
|
163
|
-
it { is_expected.to be > 4000 }
|
164
|
-
end
|
165
|
-
end
|
166
|
-
|
167
|
-
context 'with video 898029 and url_attributes', :vcr do
|
168
|
-
subject { VideoInfo.new('http://www.vimeo.com/898029') }
|
169
|
-
|
170
|
-
it { expect(subject.embed_code(url_attributes: { autoplay: 1 })).to match(/autoplay=1/) }
|
171
|
-
end
|
172
|
-
|
173
|
-
context 'with video 898029 and iframe_attributes', :vcr do
|
174
|
-
subject { VideoInfo.new('http://www.vimeo.com/898029') }
|
175
|
-
|
176
|
-
it { expect(subject.embed_code(iframe_attributes: { width: 800, height: 600 })).to match(/width="800"/) }
|
177
|
-
it { expect(subject.embed_code(iframe_attributes: { width: 800, height: 600 })).to match(/height="600"/) }
|
178
|
-
end
|
179
|
-
|
180
|
-
context 'with video 898029 in /group/ url', :vcr do
|
181
|
-
subject { VideoInfo.new('http://vimeo.com/groups/1234/videos/898029') }
|
182
|
-
|
183
|
-
describe '#provider' do
|
184
|
-
subject { super().provider }
|
185
|
-
it { is_expected.to eq 'Vimeo' }
|
186
|
-
end
|
187
|
-
|
188
|
-
describe '#video_id' do
|
189
|
-
subject { super().video_id }
|
190
|
-
it { is_expected.to eq '898029' }
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
context 'with video 898029 in /group/ url', :vcr do
|
195
|
-
subject { VideoInfo.new('http://player.vimeo.com/video/898029') }
|
196
|
-
|
197
|
-
describe '#provider' do
|
198
|
-
subject { super().provider }
|
199
|
-
it { is_expected.to eq 'Vimeo' }
|
200
|
-
end
|
201
|
-
|
202
|
-
describe '#video_id' do
|
203
|
-
subject { super().video_id }
|
204
|
-
it { is_expected.to eq '898029' }
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
context 'with video 898029 in text', :vcr do
|
209
|
-
subject { VideoInfo.new('<a href="http://www.vimeo.com/898029">http://www.vimeo.com/898029</a>') }
|
210
|
-
|
211
|
-
describe '#provider' do
|
212
|
-
subject { super().provider }
|
213
|
-
it { is_expected.to eq 'Vimeo' }
|
214
|
-
end
|
215
|
-
|
216
|
-
describe '#video_id' do
|
217
|
-
subject { super().video_id }
|
218
|
-
it { is_expected.to eq '898029' }
|
219
|
-
end
|
220
|
-
end
|
221
|
-
|
222
|
-
context 'with video 101677664 in /ondemand/ url', :vcr do
|
223
|
-
subject { VideoInfo.new('https://vimeo.com/ondemand/less/101677664') }
|
224
|
-
|
225
|
-
its(:provider) { should eq 'Vimeo' }
|
226
|
-
its(:video_id) { should eq '101677664' }
|
227
|
-
end
|
228
|
-
|
229
|
-
context 'with video 111431415 in /channels/*/ url', :vcr do
|
230
|
-
subject { VideoInfo.new('https://vimeo.com/channels/some_channel1/111431415') }
|
231
|
-
|
232
|
-
its(:provider) { should eq 'Vimeo' }
|
233
|
-
its(:video_id) { should eq '111431415' }
|
234
|
-
end
|
235
|
-
|
236
|
-
context "with video 126641548 in /user*/review/126641548/* url", :vcr do
|
237
|
-
subject { VideoInfo.new('http://www.vimeo.com/user39798190/review/126641548/8a56234e32') }
|
238
|
-
|
239
|
-
its(:provider) { should eq 'Vimeo' }
|
240
|
-
its(:video_id) { should eq '126641548' }
|
241
|
-
end
|
242
|
-
end
|