video_info 2.6.0 → 2.6.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/.rubocop.yml +242 -1
  4. data/.travis.yml +9 -8
  5. data/CONTRIBUTING.md +11 -0
  6. data/Gemfile +1 -1
  7. data/Guardfile +1 -1
  8. data/README.md +34 -1
  9. data/lib/video_info.rb +22 -26
  10. data/lib/video_info/provider.rb +8 -10
  11. data/lib/video_info/providers/dailymotion.rb +6 -3
  12. data/lib/video_info/providers/vimeo.rb +3 -3
  13. data/lib/video_info/providers/vimeo_api.rb +13 -4
  14. data/lib/video_info/providers/vimeo_scraper.rb +33 -13
  15. data/lib/video_info/providers/vkontakte.rb +38 -14
  16. data/lib/video_info/providers/wistia.rb +2 -1
  17. data/lib/video_info/providers/youtube.rb +4 -2
  18. data/lib/video_info/providers/youtube_api.rb +38 -3
  19. data/lib/video_info/providers/youtube_scraper.rb +26 -12
  20. data/lib/video_info/providers/youtubeplaylist.rb +5 -2
  21. data/lib/video_info/providers/youtubeplaylist_api.rb +8 -1
  22. data/lib/video_info/providers/youtubeplaylist_scraper.rb +16 -3
  23. data/lib/video_info/version.rb +1 -1
  24. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/_available_/with_invalid_video_url/_available_/1_2_2_1_1.yml +89 -0
  25. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/_available_/with_valid_video/_available_/1_2_1_1_1.yml +92 -0
  26. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_date/should_show_correct_date.yml +95 -0
  27. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_description/1_3_7_1.yml +95 -0
  28. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_duration/1_3_9_1.yml +95 -0
  29. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_keywords/1_3_8_1.yml +95 -0
  30. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_large/1_3_15_1.yml +95 -0
  31. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_medium/1_3_14_1.yml +95 -0
  32. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_thumbnail_small/1_3_13_1.yml +95 -0
  33. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_title/1_3_6_1.yml +95 -0
  34. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Dailymotion/with_video_x7lni3/_view_count/1_3_16_1.yml +95 -0
  35. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_password_required_video/_available_/1_2_3_1_1.yml +964 -0
  36. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_password_required_video/_available_/2_2_3_1_1.yml +59 -0
  37. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_this_video_does_not_exist_video/_available_/1_2_2_1_1.yml +936 -0
  38. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_this_video_does_not_exist_video/_available_/2_2_2_1_1.yml +61 -0
  39. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_valid_video/_available_/1_2_1_1_1.yml +2692 -0
  40. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/_available_/with_valid_video/_available_/2_2_1_1_1.yml +119 -0
  41. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author/1_3_17_1.yml +1530 -0
  42. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author/2_3_17_1.yml +68 -0
  43. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_thumbnail/1_3_16_1.yml +1530 -0
  44. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_thumbnail/2_3_16_1.yml +68 -0
  45. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_url/1_3_18_1.yml +1529 -0
  46. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_author_url/2_3_18_1.yml +68 -0
  47. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_date/should_have_correct_upload_date.yml +1595 -0
  48. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_description/1_3_7_1.yml +1602 -0
  49. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_description/2_3_7_1.yml +68 -0
  50. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_duration/1_3_9_1.yml +1530 -0
  51. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_duration/2_3_9_1.yml +68 -0
  52. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_height/1_3_11_1.yml +1529 -0
  53. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_height/2_3_11_1.yml +68 -0
  54. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_keywords/should_return_a_string_list_of_keywords.yml +1595 -0
  55. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_large/1_3_15_1.yml +1530 -0
  56. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_large/2_3_15_1.yml +68 -0
  57. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_medium/1_3_14_1.yml +1530 -0
  58. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_medium/2_3_14_1.yml +68 -0
  59. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_small/1_3_13_1.yml +1530 -0
  60. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_thumbnail_small/2_3_13_1.yml +68 -0
  61. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_title/1_3_6_1.yml +1602 -0
  62. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_title/2_3_6_1.yml +68 -0
  63. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_view_count/1_3_19_1.yml +1530 -0
  64. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_view_count/2_3_19_1.yml +68 -0
  65. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_width/1_3_10_1.yml +1530 -0
  66. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_136971428/_width/2_3_10_1.yml +68 -0
  67. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author/1_3_17_1.yml +2559 -0
  68. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author/2_3_17_1.yml +159 -0
  69. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author_thumbnail/1_3_16_1.yml +2559 -0
  70. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author_thumbnail/2_3_16_1.yml +159 -0
  71. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author_url/1_3_18_1.yml +2559 -0
  72. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_author_url/2_3_18_1.yml +159 -0
  73. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_date/should_have_correct_upload_date.yml +2714 -0
  74. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_description/1_3_7_1.yml +2692 -0
  75. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_description/2_3_7_1.yml +159 -0
  76. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_duration/1_3_9_1.yml +2829 -0
  77. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_duration/2_3_9_1.yml +159 -0
  78. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_height/1_3_11_1.yml +2828 -0
  79. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_height/2_3_11_1.yml +159 -0
  80. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_keywords/should_return_a_string_list_of_keywords.yml +2716 -0
  81. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_large/1_3_15_1.yml +2560 -0
  82. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_large/2_3_15_1.yml +159 -0
  83. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_medium/1_3_14_1.yml +2558 -0
  84. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_medium/2_3_14_1.yml +159 -0
  85. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_small/1_3_13_1.yml +2558 -0
  86. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_thumbnail_small/2_3_13_1.yml +159 -0
  87. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_title/1_3_6_1.yml +2961 -0
  88. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_title/2_3_6_1.yml +159 -0
  89. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_view_count/1_3_19_1.yml +2560 -0
  90. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_view_count/2_3_19_1.yml +159 -0
  91. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_width/1_3_10_1.yml +2560 -0
  92. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vimeo/with_video_898029/_width/2_3_10_1.yml +159 -0
  93. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_hashes/available_/1_2_6_1_1.yml +2996 -0
  94. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_invalid_video/available_/1_2_2_1_1.yml +46 -0
  95. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_private_video/available_/1_2_3_1_1.yml +865 -0
  96. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_redirect/available_/1_2_4_1_1.yml +666 -0
  97. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_redirect_to_main_page_for_auth/available_/1_2_5_1_1.yml +46 -0
  98. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/_available_/with_valid_video/available_/1_2_1_1_1.yml +2118 -0
  99. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/author/1_5_14_1.yml +518 -0
  100. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/author_thumbnail/1_5_15_1.yml +519 -0
  101. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/author_url/1_5_16_1.yml +520 -0
  102. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/description/1_5_8_1.yml +518 -0
  103. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/duration/1_5_10_1.yml +517 -0
  104. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/embed_code/1_5_6_1.yml +517 -0
  105. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/embed_url/1_5_5_1.yml +519 -0
  106. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/height/1_5_12_1.yml +517 -0
  107. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/title/1_5_7_1.yml +517 -0
  108. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/view_count/1_5_13_1.yml +521 -0
  109. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_from_kirill_lyanoi_z_video2152699_168591741_2F56fd229a9dfe2dcdbe/width/1_5_11_1.yml +517 -0
  110. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_https_/vk_com/id44052340_z_video61291456_159590018_2F2521d92730a272a9ea/author/1_3_7_1.yml +399 -0
  111. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_https_/vk_com/id44052340_z_video61291456_159590018_2F2521d92730a272a9ea/embed_code/1_3_6_1.yml +399 -0
  112. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_https_/vk_com/id44052340_z_video61291456_159590018_2F2521d92730a272a9ea/embed_url/1_3_5_1.yml +399 -0
  113. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_https_/vk_com/id44052340_z_video61291456_159590018_2F2521d92730a272a9ea/title/1_3_4_1.yml +399 -0
  114. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video-54799401_165822734/title/1_7_4_1.yml +682 -0
  115. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video3552522_171340713/embed_url/1_10_1_1.yml +501 -0
  116. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/description/1_6_8_1.yml +449 -0
  117. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/duration/1_6_10_1.yml +449 -0
  118. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/embed_code/1_6_6_1.yml +449 -0
  119. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/embed_url/1_6_5_1.yml +449 -0
  120. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/height/1_6_12_1.yml +449 -0
  121. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/title/1_6_7_1.yml +449 -0
  122. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/view_count/1_6_13_1.yml +449 -0
  123. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_video39576223_108370515/width/1_6_11_1.yml +449 -0
  124. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_videos43640822_/video43640822_168790809/author/1_4_5_1.yml +527 -0
  125. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_videos43640822_/video43640822_168790809/author_thumbnail/1_4_6_1.yml +527 -0
  126. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_videos43640822_/video43640822_168790809/author_url/1_4_7_1.yml +527 -0
  127. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Vkontakte/with_video_videos43640822_/video43640822_168790809/title/1_4_4_1.yml +527 -0
  128. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/_available_/with_invalid_video/_available_/1_2_2_1_1.yml +71 -0
  129. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/_available_/with_valid_video/_available_/1_2_1_1_1.yml +73 -0
  130. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_duration/1_4_7_1.yml +80 -0
  131. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_height/1_4_9_1.yml +80 -0
  132. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_large/1_4_12_1.yml +80 -0
  133. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_medium/1_4_11_1.yml +80 -0
  134. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_thumbnail_small/1_4_10_1.yml +80 -0
  135. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_title/1_4_6_1.yml +80 -0
  136. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_pxonqr42is/_width/1_4_8_1.yml +80 -0
  137. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_duration/1_3_7_1.yml +80 -0
  138. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_height/1_3_9_1.yml +80 -0
  139. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_large/1_3_12_1.yml +80 -0
  140. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_medium/1_3_11_1.yml +80 -0
  141. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_thumbnail_small/1_3_10_1.yml +80 -0
  142. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_title/1_3_6_1.yml +80 -0
  143. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Wistia/with_video_rs1me54mpw/_width/1_3_8_1.yml +80 -0
  144. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_available_/1_2_2_1_1.yml +516 -0
  145. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_available_/2_2_2_1_1.yml +56 -0
  146. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_date/1_2_2_11_1.yml +519 -0
  147. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_date/2_2_2_11_1.yml +56 -0
  148. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_description/1_2_2_8_1.yml +521 -0
  149. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_description/2_2_2_8_1.yml +56 -0
  150. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_duration/1_2_2_10_1.yml +519 -0
  151. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_duration/2_2_2_10_1.yml +56 -0
  152. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_keywords/1_2_2_9_1.yml +519 -0
  153. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_keywords/2_2_2_9_1.yml +56 -0
  154. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_title/1_2_2_7_1.yml +519 -0
  155. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_title/2_2_2_7_1.yml +56 -0
  156. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_view_count/1_2_2_15_1.yml +516 -0
  157. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_unavailable_video/_view_count/2_2_2_15_1.yml +56 -0
  158. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_valid_video/_available_/1_2_1_1_1.yml +3930 -0
  159. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_valid_video/_available_/2_2_1_1_1.yml +127 -0
  160. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_video_removed_because_of_copyright_claim/_available_/1_2_3_1_1.yml +578 -0
  161. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/_available_/with_video_removed_because_of_copyright_claim/_available_/2_2_3_1_1.yml +117 -0
  162. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_date/should_return_date_video_was_posted.yml +3912 -0
  163. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_description/1_17_7_1.yml +4007 -0
  164. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_description/2_17_7_1.yml +127 -0
  165. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_duration/1_17_9_1.yml +3982 -0
  166. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_duration/2_17_9_1.yml +127 -0
  167. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_keywords/1_17_8_1.yml +3984 -0
  168. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_keywords/2_17_8_1.yml +127 -0
  169. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_title/1_17_6_1.yml +3946 -0
  170. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_title/2_17_6_1.yml +127 -0
  171. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_view_count/1_17_16_1.yml +3948 -0
  172. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_full_screen_video_URLs/_view_count/2_17_16_1.yml +127 -0
  173. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author/1_3_6_1.yml +4006 -0
  174. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author/2_3_6_1.yml +127 -0
  175. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_thumbnail/1_3_7_1.yml +4027 -0
  176. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_thumbnail/2_3_7_1.yml +212 -0
  177. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_url/1_3_8_1.yml +4080 -0
  178. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_author_url/2_3_8_1.yml +212 -0
  179. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_date/should_return_date_video_was_posted.yml +3982 -0
  180. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_description/1_3_10_1.yml +3992 -0
  181. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_description/2_3_10_1.yml +127 -0
  182. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_duration/1_3_12_1.yml +3961 -0
  183. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_duration/2_3_12_1.yml +127 -0
  184. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_keywords/1_3_11_1.yml +3928 -0
  185. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_keywords/2_3_11_1.yml +127 -0
  186. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_title/1_3_9_1.yml +3974 -0
  187. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_title/2_3_9_1.yml +127 -0
  188. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_view_count/1_3_19_1.yml +3950 -0
  189. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_Youtube/with_video_mZqGqE0D0n4/_view_count/2_3_19_1.yml +127 -0
  190. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_invalid_playlist/_available_/1_2_2_1_1.yml +62 -0
  191. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_invalid_playlist/_available_/2_2_2_1_1.yml +62 -0
  192. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_list_url/_available_/1_2_3_1_1.yml +96 -0
  193. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_list_url/_available_/2_2_3_1_1.yml +96 -0
  194. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_valid_playlist/_available_/1_2_1_1_1.yml +96 -0
  195. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/_available_/with_valid_playlist/_available_/2_2_1_1_1.yml +96 -0
  196. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author/1_3_18_1.yml +107 -0
  197. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author/2_3_18_1.yml +107 -0
  198. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_thumbnail/1_3_19_1.yml +193 -0
  199. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_thumbnail/2_3_19_1.yml +193 -0
  200. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_url/1_3_20_1.yml +193 -0
  201. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_author_url/2_3_20_1.yml +193 -0
  202. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_description/1_3_7_1.yml +107 -0
  203. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_description/2_3_7_1.yml +107 -0
  204. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_keywords/1_3_8_1.yml +107 -0
  205. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_keywords/2_3_8_1.yml +107 -0
  206. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_large/1_3_15_1.yml +107 -0
  207. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_large/2_3_15_1.yml +107 -0
  208. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_medium/1_3_14_1.yml +107 -0
  209. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_medium/2_3_14_1.yml +107 -0
  210. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_small/1_3_13_1.yml +107 -0
  211. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_thumbnail_small/2_3_13_1.yml +107 -0
  212. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_title/1_3_6_1.yml +107 -0
  213. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_title/2_3_6_1.yml +107 -0
  214. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_PL9hW1uS6HUftLdHI6RIsaf/_videos/returns_list_of_videos_in_playlist.yml +267 -0
  215. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_that_does_not_exist_in_embed_path/_videos/1_4_2_1.yml +56 -0
  216. data/spec/fixtures/vcr_cassettes/VideoInfo_Providers_YoutubePlaylist/with_playlist_that_does_not_exist_in_embed_path/_videos/2_4_2_1.yml +56 -0
  217. data/spec/lib/video_info/provider_spec.rb +42 -22
  218. data/spec/lib/video_info/providers/dailymotion_spec.rb +41 -23
  219. data/spec/lib/video_info/providers/vimeo_spec.rb +212 -177
  220. data/spec/lib/video_info/providers/vkontakte_spec.rb +132 -63
  221. data/spec/lib/video_info/providers/wistia_spec.rb +34 -13
  222. data/spec/lib/video_info/providers/youtube_playlist_spec.rb +185 -139
  223. data/spec/lib/video_info/providers/youtube_spec.rb +400 -385
  224. data/spec/lib/video_info_spec.rb +27 -21
  225. data/video_info.gemspec +7 -10
  226. metadata +424 -87
  227. data/foo.txt +0 -33
  228. data/spec/lib/video_info/providers/vimeo_api_spec.rb +0 -242
  229. data/spec/lib/video_info/providers/youtube_api_spec.rb +0 -476
  230. data/spec/lib/video_info/providers/youtube_playlist_api_spec.rb +0 -187
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 &raquo;\",\"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&rsquo;t follow anyone that begin with the letter &ldquo;{PAGE_LETTER}&rdquo;\",\"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&hellip;\",\"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 &ldquo;copyleft&rdquo; 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 &ldquo;copyleft&rdquo; 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,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
@@ -1,476 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe VideoInfo::Providers::Youtube do
4
- before(:all) do
5
- VideoInfo.provider_api_keys = { youtube: 'AIzaSyA6PYwSr1EnLFUFy1cZDk3Ifb0rxeJaeZ0' }
6
- end
7
-
8
- describe ".usable?" do
9
- subject { VideoInfo::Providers::Youtube.usable?(url) }
10
-
11
- context "with youtube.com url" do
12
- let(:url) { 'http://www.youtube.com/watch?v=Xp6CXF' }
13
- it { is_expected.to be_truthy }
14
- end
15
-
16
- context "with youtu.be url" do
17
- let(:url) { 'http://youtu.be/JM9NgvjjVng' }
18
- it { is_expected.to be_truthy }
19
- end
20
-
21
- context "with other url" do
22
- let(:url) { 'http://google.com/video1' }
23
- it { is_expected.to be_falsey }
24
- end
25
-
26
- context "with playlist url" do
27
- let(:url) { 'http://www.youtube.com/playlist?p=PLA575C81A1FBC04CF' }
28
- it { is_expected.to be_falsey }
29
- end
30
- end
31
-
32
- describe "#available?" do
33
- context "with valid video", :vcr do
34
- subject { VideoInfo.new('http://www.youtube.com/watch?v=mZqGqE0D0n4') }
35
-
36
- describe '#available?' do
37
- subject { super().available? }
38
- it { is_expected.to be_truthy }
39
- end
40
- end
41
-
42
- context "with 'video is unavailable' video", :vcr do
43
- subject { VideoInfo.new('http://www.youtube.com/watch?v=SUkXvWn1m7Q') }
44
-
45
- describe '#available?' do
46
- subject { super().available? }
47
- it { is_expected.to be_falsey }
48
- end
49
-
50
- describe '#provider' do
51
- subject { super().provider }
52
- it { is_expected.to eq 'YouTube' }
53
- end
54
-
55
- describe '#video_id' do
56
- subject { super().video_id }
57
- it { is_expected.to eq 'SUkXvWn1m7Q' }
58
- end
59
-
60
- describe '#url' do
61
- subject { super().url }
62
- it { is_expected.to eq 'http://www.youtube.com/watch?v=SUkXvWn1m7Q' }
63
- end
64
-
65
- describe '#embed_url' do
66
- subject { super().embed_url }
67
- it { is_expected.to eq '//www.youtube.com/embed/SUkXvWn1m7Q' }
68
- end
69
-
70
- describe '#embed_code' do
71
- subject { super().embed_code }
72
- it { is_expected.to eq '<iframe src="//www.youtube.com/embed/SUkXvWn1m7Q" frameborder="0" allowfullscreen="allowfullscreen"></iframe>' }
73
- end
74
-
75
- describe '#title' do
76
- subject { super().title }
77
- it { is_expected.to eq nil }
78
- end
79
-
80
- describe '#description' do
81
- subject { super().description }
82
- it { is_expected.to eq nil }
83
- end
84
-
85
- describe '#keywords' do
86
- subject { super().keywords }
87
- it { is_expected.to be_nil }
88
- end
89
-
90
- describe '#duration' do
91
- subject { super().duration }
92
- it { is_expected.to eq 0 }
93
- end
94
-
95
- describe '#date' do
96
- subject { super().date }
97
- it { is_expected.to eq nil }
98
- end
99
-
100
- describe '#thumbnail_small' do
101
- subject { super().thumbnail_small }
102
- it { is_expected.to eq 'https://i.ytimg.com/vi/SUkXvWn1m7Q/default.jpg' }
103
- end
104
-
105
- describe '#thumbnail_medium' do
106
- subject { super().thumbnail_medium }
107
- it { is_expected.to eq 'https://i.ytimg.com/vi/SUkXvWn1m7Q/mqdefault.jpg' }
108
- end
109
-
110
- describe '#thumbnail_large' do
111
- subject { super().thumbnail_large }
112
- it { is_expected.to eq 'https://i.ytimg.com/vi/SUkXvWn1m7Q/hqdefault.jpg' }
113
- end
114
-
115
- describe '#view_count' do
116
- subject { super().view_count }
117
- it { is_expected.to be == 0 }
118
- end
119
- end
120
-
121
- context "with 'video no longer available due to a copyright claim' video", :vcr do
122
- subject { VideoInfo.new('http://www.youtube.com/watch?v=ffClNhwx0KU') }
123
-
124
- describe '#available?' do
125
- subject { super().available? }
126
- it { is_expected.to be_truthy }
127
- end
128
- end
129
- end
130
-
131
- context "with video mZqGqE0D0n4", :vcr do
132
- subject { VideoInfo.new('http://www.youtube.com/watch?v=mZqGqE0D0n4') }
133
-
134
- describe '#provider' do
135
- subject { super().provider }
136
- it { is_expected.to eq 'YouTube' }
137
- end
138
-
139
- describe '#video_id' do
140
- subject { super().video_id }
141
- it { is_expected.to eq 'mZqGqE0D0n4' }
142
- end
143
-
144
- describe '#url' do
145
- subject { super().url }
146
- it { is_expected.to eq 'http://www.youtube.com/watch?v=mZqGqE0D0n4' }
147
- end
148
-
149
- describe '#embed_url' do
150
- subject { super().embed_url }
151
- it { is_expected.to eq '//www.youtube.com/embed/mZqGqE0D0n4' }
152
- end
153
-
154
- describe '#embed_code' do
155
- subject { super().embed_code }
156
- it { is_expected.to eq '<iframe src="//www.youtube.com/embed/mZqGqE0D0n4" frameborder="0" allowfullscreen="allowfullscreen"></iframe>' }
157
- end
158
-
159
- describe '#title' do
160
- subject { super().title }
161
- it { is_expected.to eq 'Cherry Bloom - King Of The Knife' }
162
- end
163
-
164
- describe '#description' do
165
- subject { super().description }
166
- 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' }
167
- end
168
-
169
- describe '#keywords' do
170
- subject { super().keywords }
171
- it { is_expected.to eq %w(cherry bloom king of the knife guitar drum clip rock alternative tremplin Paris-Forum) }
172
- end
173
-
174
- describe '#duration' do
175
- subject { super().duration }
176
- it { is_expected.to eq 176 }
177
- end
178
-
179
- describe '#width' do
180
- subject { super().width }
181
- it { is_expected.to be_nil }
182
- end
183
-
184
- describe '#height' do
185
- subject { super().height }
186
- it { is_expected.to be_nil }
187
- end
188
-
189
- describe '#date' do
190
- subject { super().date }
191
- it { is_expected.to eq Time.parse('Sat Apr 12 22:25:35 UTC 2008', Time.now.utc) }
192
- end
193
-
194
- describe '#thumbnail_small' do
195
- subject { super().thumbnail_small }
196
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/default.jpg' }
197
- end
198
-
199
- describe '#thumbnail_medium' do
200
- subject { super().thumbnail_medium }
201
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/mqdefault.jpg' }
202
- end
203
-
204
- describe '#thumbnail_large' do
205
- subject { super().thumbnail_large }
206
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/hqdefault.jpg' }
207
- end
208
-
209
- describe '#view_count' do
210
- subject { super().view_count }
211
- it { is_expected.to be > 4000 }
212
- end
213
- end
214
-
215
- context "with video oQ49W_xKzKA", :vcr do
216
- subject { VideoInfo.new('http://www.youtube.com/watch?v=oQ49W_xKzKA') }
217
-
218
- it { expect(subject.embed_code(url_attributes: { autoplay: 1 })).to match(/autoplay=1/) }
219
- end
220
-
221
- context "with video oQ49W_xKzKA", :vcr do
222
- subject { VideoInfo.new('http://www.youtube.com/watch?v=oQ49W_xKzKA') }
223
-
224
- describe '#provider' do
225
- subject { super().provider }
226
- it { is_expected.to eq 'YouTube' }
227
- end
228
-
229
- describe '#video_id' do
230
- subject { super().video_id }
231
- it { is_expected.to eq 'oQ49W_xKzKA' }
232
- end
233
- end
234
-
235
- context "with video Xp6CXF-Cesg", :vcr do
236
- subject { VideoInfo.new('http://www.youtube.com/watch?v=Xp6CXF-Cesg') }
237
-
238
- describe '#provider' do
239
- subject { super().provider }
240
- it { is_expected.to eq 'YouTube' }
241
- end
242
-
243
- describe '#video_id' do
244
- subject { super().video_id }
245
- it { is_expected.to eq 'Xp6CXF-Cesg' }
246
- end
247
- end
248
-
249
- context "with video VeasFckfMHY in user url", :vcr do
250
- subject { VideoInfo.new('http://www.youtube.com/user/EducatorVids3?v=VeasFckfMHY') }
251
-
252
- describe '#provider' do
253
- subject { super().provider }
254
- it { is_expected.to eq 'YouTube' }
255
- end
256
-
257
- describe '#video_id' do
258
- subject { super().video_id }
259
- it { is_expected.to eq 'VeasFckfMHY' }
260
- end
261
-
262
- describe '#url' do
263
- subject { super().url }
264
- it { is_expected.to eq 'http://www.youtube.com/user/EducatorVids3?v=VeasFckfMHY' }
265
- end
266
- end
267
-
268
- context "with video VeasFckfMHY after params", :vcr do
269
- subject { VideoInfo.new('http://www.youtube.com/watch?feature=player_profilepage&v=VeasFckfMHY') }
270
-
271
- describe '#provider' do
272
- subject { super().provider }
273
- it { is_expected.to eq 'YouTube' }
274
- end
275
-
276
- describe '#video_id' do
277
- subject { super().video_id }
278
- it { is_expected.to eq 'VeasFckfMHY' }
279
- end
280
-
281
- describe '#url' do
282
- subject { super().url }
283
- it { is_expected.to eq 'http://www.youtube.com/watch?feature=player_profilepage&v=VeasFckfMHY' }
284
- end
285
- end
286
-
287
- context "with video VeasFckfMHY in path", :vcr do
288
- subject { VideoInfo.new('http://www.youtube.com/v/VeasFckfMHY') }
289
-
290
- describe '#provider' do
291
- subject { super().provider }
292
- it { is_expected.to eq 'YouTube' }
293
- end
294
-
295
- describe '#video_id' do
296
- subject { super().video_id }
297
- it { is_expected.to eq 'VeasFckfMHY' }
298
- end
299
- end
300
-
301
- context "with video VeasFckfMHY in e path", :vcr do
302
- subject { VideoInfo.new('http://www.youtube.com/e/VeasFckfMHY') }
303
-
304
- describe '#provider' do
305
- subject { super().provider }
306
- it { is_expected.to eq 'YouTube' }
307
- end
308
-
309
- describe '#video_id' do
310
- subject { super().video_id }
311
- it { is_expected.to eq 'VeasFckfMHY' }
312
- end
313
- end
314
-
315
- context "with video VeasFckfMHY in embed path", :vcr do
316
- subject { VideoInfo.new('http://www.youtube.com/embed/VeasFckfMHY') }
317
-
318
- describe '#provider' do
319
- subject { super().provider }
320
- it { is_expected.to eq 'YouTube' }
321
- end
322
-
323
- describe '#video_id' do
324
- subject { super().video_id }
325
- it { is_expected.to eq 'VeasFckfMHY' }
326
- end
327
- end
328
-
329
- context "with video JM9NgvjjVng in youtu.be url", :vcr do
330
- subject { VideoInfo.new('http://youtu.be/JM9NgvjjVng') }
331
-
332
- describe '#provider' do
333
- subject { super().provider }
334
- it { is_expected.to eq 'YouTube' }
335
- end
336
-
337
- describe '#video_id' do
338
- subject { super().video_id }
339
- it { is_expected.to eq 'JM9NgvjjVng' }
340
- end
341
- end
342
-
343
- context 'without http or www', :vcr do
344
- subject { VideoInfo.new('youtu.be/JM9NgvjjVng') }
345
-
346
- describe '#provider' do
347
- subject { super().provider }
348
- it { is_expected.to eq('YouTube') }
349
- end
350
-
351
- describe '#video_id' do
352
- subject { super().video_id }
353
- it { is_expected.to eq 'JM9NgvjjVng' }
354
- end
355
- end
356
-
357
- context "with video url in text", :vcr do
358
- subject { VideoInfo.new('<a href="http://www.youtube.com/watch?v=mZqGqE0D0n4">http://www.youtube.com/watch?v=mZqGqE0D0n4</a>') }
359
-
360
- describe '#provider' do
361
- subject { super().provider }
362
- it { is_expected.to eq('YouTube') }
363
- end
364
-
365
- describe '#video_id' do
366
- subject { super().video_id }
367
- it { is_expected.to eq('mZqGqE0D0n4') }
368
- end
369
- end
370
-
371
- context "with iframe attributes", :vcr do
372
- subject { VideoInfo.new('http://www.youtube.com/watch?v=mZqGqE0D0n4') }
373
-
374
- describe '#provider' do
375
- subject { super().provider }
376
- it { is_expected.to eq('YouTube') }
377
- end
378
- it { expect(subject.embed_code(iframe_attributes: { width: 800, height: 600 })).to match(/width="800"/) }
379
- it { expect(subject.embed_code(iframe_attributes: { width: 800, height: 600 })).to match(/height="600"/) }
380
- end
381
-
382
- context "with arbitrary iframe_attributes", :vcr do
383
- subject { VideoInfo.new('http://www.youtube.com/watch?v=mZqGqE0D0n4') }
384
-
385
- describe '#provider' do
386
- subject { super().provider }
387
- it { is_expected.to eq('YouTube') }
388
- end
389
- it { expect(subject.embed_code(iframe_attributes: { :'data-colorbox' => true })).to match(/data-colorbox="true"/) }
390
- end
391
-
392
- context "with full screen video URLs", :vcr do
393
- subject { VideoInfo.new('http://www.youtube.com/v/mZqGqE0D0n4') }
394
-
395
- describe '#provider' do
396
- subject { super().provider }
397
- it { is_expected.to eq 'YouTube' }
398
- end
399
-
400
- describe '#video_id' do
401
- subject { super().video_id }
402
- it { is_expected.to eq 'mZqGqE0D0n4' }
403
- end
404
-
405
- describe '#url' do
406
- subject { super().url }
407
- it { is_expected.to eq 'http://www.youtube.com/v/mZqGqE0D0n4' }
408
- end
409
-
410
- describe '#embed_url' do
411
- subject { super().embed_url }
412
- it { is_expected.to eq '//www.youtube.com/embed/mZqGqE0D0n4' }
413
- end
414
-
415
- describe '#embed_code' do
416
- subject { super().embed_code }
417
- it { is_expected.to eq '<iframe src="//www.youtube.com/embed/mZqGqE0D0n4" frameborder="0" allowfullscreen="allowfullscreen"></iframe>' }
418
- end
419
-
420
- describe '#title' do
421
- subject { super().title }
422
- it { is_expected.to eq 'Cherry Bloom - King Of The Knife' }
423
- end
424
-
425
- describe '#description' do
426
- subject { super().description }
427
- 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' }
428
- end
429
-
430
- describe '#keywords' do
431
- subject { super().keywords }
432
- it { is_expected.to eq %w(cherry bloom king of the knife guitar drum clip rock alternative tremplin Paris-Forum) }
433
- end
434
-
435
- describe '#duration' do
436
- subject { super().duration }
437
- it { is_expected.to eq 176 }
438
- end
439
-
440
- describe '#width' do
441
- subject { super().width }
442
- it { is_expected.to be_nil }
443
- end
444
-
445
- describe '#height' do
446
- subject { super().height }
447
- it { is_expected.to be_nil }
448
- end
449
-
450
- describe '#date' do
451
- subject { super().date }
452
- it { is_expected.to eq Time.parse('Sat Apr 12 22:25:35 UTC 2008', Time.now.utc) }
453
- end
454
-
455
- describe '#thumbnail_small' do
456
- subject { super().thumbnail_small }
457
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/default.jpg' }
458
- end
459
-
460
- describe '#thumbnail_medium' do
461
- subject { super().thumbnail_medium }
462
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/mqdefault.jpg' }
463
- end
464
-
465
- describe '#thumbnail_large' do
466
- subject { super().thumbnail_large }
467
- it { is_expected.to eq 'https://i.ytimg.com/vi/mZqGqE0D0n4/hqdefault.jpg' }
468
- end
469
-
470
- describe '#view_count' do
471
- subject { super().view_count }
472
- it { is_expected.to be > 4000 }
473
- end
474
- end
475
-
476
- end