您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

281 行
15KB

  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "strings"
  6. )
  7. //display vimeo video in biukop brand
  8. const videoPrefix = "/v/"
  9. type vimeoPlayer struct {
  10. VideoId string
  11. Token string
  12. playsinline int
  13. autoplay int
  14. autopause int
  15. loop int
  16. background int
  17. muted int
  18. Title string
  19. ContentDescription string
  20. ThumbnailURL string
  21. FavIconURL string
  22. }
  23. func videoMain(w http.ResponseWriter, r *http.Request) {
  24. videoVimeo(w, r)
  25. }
  26. var thumbnailDataURL = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAASwAAAEsCAYAAAB5fY51AAAACXBIWX
  27. MAAC4jAAAuIwF4pT92AAAgAElEQVR4nO3dd5hU5f3+8fdzZnZhKSJSFAUD9hJ7izWaGMUeCxijxo
  28. rYY8xPpboOsIi9JYo1xhpFJcb6VREsCGpix4aFIiodpC2zu/P5/TG7ssAuOzs7M8+Zmft1XV7K7s
  29. w59x96e8pTHIYUs/5WwsaUsIISSulODT0xuuPoAWyIsRGwIY6uGGU4okAUCIBI7V/U/jnayFlqav
  30. 8CSADVgAFVQA1GFTAbmAvMJuAHjO8wZhLwHQmmM59lbEw1V1GFOf1bW6ScCqtIjLEIH9CZCF0xep
  31. FgexybY2yF0QPHJkCJ75iNMIxZOGYC0zE+I+ALAr4kwRzmMoc7XZXvkJJ9KqxCFbM2VPFLjB2BnW
  32. v/6g50Bcq8ZsucOMYcHD/imILxIQHvU82HXO0W+g4nmafCKgQxa02cjhh7ELA3sB/GthjtgFIczn
  33. fEHKoCVmB8DUwk4C1qmERr5lDulvsOJy2jwspHMQuoYhNgZ4yDgL2AXSicK6dMiwOfAm8DrxPwP3
  34. rwDefoNjLfqLDyRfIZ1PYYvQk4lATb4ehK8mG3NM9CYCrGq8DzzGeynoHlBxVWmA20jgTsDBwBHA
  35. f0oPE3cZKeGhzzMV7E8RRtmEwVcyl3Cd/BZG0qrLC5wtoTZR/gaKA30AuK6hmUb7MwJhAwFuNNKt
  36. xs34FkFRVWGMQsIM6OGCfjOAajJy60QwyKg1GDYw7wAgGPEmUC5a7ad6xip8LyJWYB1fyCBEcDp5
  37. McdiDhNQPjARxjmMdneublhwor12LWmkr2I+A0HL0xOvuOJM2yHHgDuJ9SXqTcLfIdqJiosHLCHJ
  38. fSkdacSEB/jG2BUt+ppEVqgOk4HgHuooRZelCffSqsbEre9m1Ngn61z6e6+o4kWbEMx1PAaEr4L+
  39. Uu7jtQoVJhZcsQ2wfjPJJDEjr6jiM5sRx4DcedlPCcHtJnngork2IWZSV74BgI/A5o7TuSeFENvA
  40. vcTJznuM4t8x2oUKiwMiFmUWrYmxr+SvKKSoM7JcnxIXANVTzLNW6J7zj5ToXVUslbvyuAg4E2vu
  41. NIKNUA/8O4mlb8Rw/n06fCSkfdQE/HAIzfA618R5K8UA1MJqCcHryhydfNp8JqroHWk4CLcfSrXb
  42. 5FpLlqgLFEGMkwPgCtoJoqFVaq+lsJnbkE+DOwie84UhAW4niYBFcx0s33HSYfqLCaErNSVnAoEU
  43. YB2/mOIwVpNo6rWMhD/N0t9R0mzFRY6zLItgKG4TgWjUyX7DIcE4GBVDBRG200TIXVkJiVEuci4D
  44. JgQ99xpKgswbgfo1zr0q9NhVVfzAJWsheOG4Ff+Y4jRW0mxoW04kVN9VlFhVUnZu2o4gqMi4AOvu
  45. OIACuBMTgGMcLN9B0mDFRYzhxD2ZMabgH2RKt7SvjMwHEJX/IfHnc1TX+8cBV3YcWsDXH+AgwE2v
  46. qOI9IoowrHP4Ehxbxsc/EWVsy2oopbMHr7jiKSMscUqjmfUe5131F8KL7C6msRtuRE4Hqgm+84Im
  47. lYinENldzAjW6F7zC5VFyFdaltQBlXAhegFRUk3zmepYY/c7X7xneUXCmewhpqW5PgHmAftPmoFI
  48. 6pBFzMcPei7yC5UPiF1dcibMFRBNytDR+kQMUxBrOU27jVrfQdJpsKu7AutTLaMADjcrT6pxSy5D
  49. 6KjxLnr1zn5viOky2FW1gDrAMRRmP0wRHxHUck6wzD8T8C+jLcfes7TjYUZmENtoOAe4DNfEcR8W
  50. AB8Fd25kH6FNZA08IqLGeOAZxAwN1oeo0Ut5XAKEoZUUi79xROYcWslJVciiOGloIRgeRN4v0Yfy
  51. 2UlR8Ko7Bus1b8wLU4LgA9rxL5mWEE/B8J/sRIN9d3nJbK/8IaaB2JcAvGKWjiskhj3sXRhxFuuu
  52. 8gLZHfhTXYumHcheNI31FEQs+YguMUKtwHvqOkK38LK2ZdiTOW5Mh1EUnNt0Q4hmHuY99B0pGfU1
  53. QGWk+VlUhaelHNSwyxA8Dy7hFK/l1hDbKtCPg3xra+o4jksdnASVS48b6DNEd+FdZQ60UNz+DY3n
  54. cUkQIwF8fRjHCTfQdJVf7cEg61rTGeU1mJZEwXjP8w1A7Ml9vD/LjCGmzdcDyHsYvvKCIFaDbGiY
  55. x0r/kO0pTwF1bybeCTwH6+o4gUsJkYhzDSfe47yLqE+5ZwkHUizuOorESyrQfwAlfaDr6DrEt4C+
  56. tia0XA/cCvfUcRKQqOntTwAEOtl+8ojQlnYd1lJbTnbyQ4wncUkSKzM8YDDLJOvoM0JHyFFbMoMx
  57. mOcQZOcwNFcs7YD8e9XGzr+Y6ypvAVVpz+JLhEq4SKeGQcTXuuoa+F6r/DcL0lHGSH43gSrb8uEg
  58. YJYBClXEe5S/gOA2G6whpiu+O4D5WVSFgEQIw4fwjLwNJwXGHFbCNW8hKOUL9SFSlS83AcFYYpPP
  59. 4L61Iro4yxwKGek4hI474hzt6+txDze0sYsyhlxIBDvOYQkaZsRin3E7N2PkP4Law4JwAXoaWNRf
  60. LBocQZwBh/bw79FdaVthNwB3rILpIvAozL+YA+vgL4eYYVsw2I8wKwp4ezi0jLzCXg1wx3n+X6xL
  61. m/wopZlDjDgT1yfm4RyYQu1HA7V1j7XJ8494VVxckY/dBzK5H85TiQKLFcj4TPbWENtc0xrsdRkt
  62. Pzikg2nMdmHJ7LE+ausC61MhLcCXTO2TlFJJtaE+U2YrZxrk6Ym8KKWUAZlwIH5eR8IpIbxi+Icx
  63. Mxy8nb/twUVhW7A5fl7HwikkvHEuePuThR9oc1xKw1VbyJsVuWzyQi/swmwa+42k3L5kmye8XjzF
  64. HF5SorkYK3IQE30d+y+kItu4U1mN0wLsnqOUQkLI6kc3ZHwWfvlvAya0spz6AH7SLFZAaOAxjhpm
  65. fj4Nm7wirhT2jHG5FisylQTsyy0i3ZKayYbYwjlrXji0h4JTiFquzsJZqdQolzKhogKlKcHCUYF2
  66. Zj2k7mC2uobV37oF1zBUWK19FsSe9MHzSzhRWzKAmuxLFRRo8rIvmmFTCCmK2fyYNmtrCq2Af8Le
  67. 4lIqGyE3HOyOQBMzes4S4rYTqvAXtn6Igikv/ms5JtuN7Ny8TBMneFNY0/oBVERWR1nShlKC4z+x
  68. pm5gprkHXCMQH4ZQaOJiKFxLEA49dUuE9aeqjMXGEFnIqxfUaOJSKFxdgA4/JMDHNoeWENsk4Yl+
  69. M0jEFEGuE4ni1a/sgoE1dYZwHdMnAcESlcbXAMaOlBWvYMK2ZdifMesElLg0jqWkXgmG3gqK1hcR
  70. wmTYfnpsKiSt/JRNapCseBjHBvpXuAlhXWIBuEYwQa1Z4z0QBuOBQu2Aci9a6PP/kBho+HsZ9BVc
  71. JfPpEm/JtS+lDuqtP5cvq3hINtQxxno7LKqW06wbl7r15WAL/sBg+eCM+eCjt08ZNNJAWHsJK90v
  72. 1yS55hnQ30asH3JQ0HbQaljbxrKY3AIVvBuxfCHUdCj/Vym00kBW1wXErMoul8Ob3Cusza4rggre
  73. 9Ki3Rq1/RnWkWTV2ETz4GL94L2pdnPJdIMhxNnu3S+mF5hlXAKpjeDYdejI9x4FEw4Cw7dDCK6eZ
  74. dwaA1clM4Xm19Yyaur89M5meRexMGu3eG5M+DRPrDjhnroKKHQl4HWs7lfan5hteJgYNtmf0+8ig
  75. TQZyeYcDaM+C10LvOdSIrcekQ4q7lfal5hxawU4zwgq1v5SPZ0bAMDfwPvng9n7Jwc0yXihXESl1
  76. nX5nyleYUV55doF5y854CeG8B9feCl0+G3PfV8S7zYnFKObM4XmntLeCagd04F5IDN4OnT4B/Hwq
  77. YaBiG5d1ZzNl9NvbAGWAfg5HQSSbi1LYVTd4P3LoRBB0DH1r4TSRHZm07smuqHUy+sKCdidEgrku
  78. SFTm2h4lB4/Wzou72eb0lOOBznpPrh1Aqrv5VgnKolZIpD3TSff/8Rdt7QdxopAkcQs5Q2rkmtsD
  79. qxO7B7SxJJfimNQO9tYPL58LfD4Re6tpbs6UIVR6fywRQKyxyOPiRHp0qRaRWFC/aFt/rD+XtAO7
  80. 1ykcwLMP7Abdaq6Q825RrWA47KRCrJXxt3gFuPhvFnwSGbQaCHA5JZezGLLZr6UNOFtZj9oekDSe
  81. GLBLB7d3jxLHi8L+zQFZyKSzKjDRFObOpDTRdWwB8yEkcKhgOO3xEm9INRB0OXNr4TSUFw9GXMuj
  82. eqWHdhxWx9jMMyGkoKxgZt4LIDYVL/5DSf1mmtcCRSy9ia99Y9JmvdhRXnEGD9TGaSlinJ3Na3Ge
  83. GAzTsnp/m8eBoc2DO5jLNIWgL6rPvX63ZsCp+RHOqewgJ+vvx6M3juNLjnGOilYRCSniOIWaMjEh
  84. ovo8HWDdg3G4kkfWF/O9emFE7bHd69AAbur2k+0my9qGGXxn7ZeGE5dkfbd0maOrWFkb2Tz7f6bK
  85. fnW5KyMhL0buyXjRSWOYzDG/+9SGq27goPnQhPnQS7pjT5Qoqe8dvGbgsbLqQYZcDB2cwkxaM0Co
  86. dtAxPPhVsPTy5jE/I7W/FrV6rp0dAvGi6sOFuhwaKSYa1L4KJ9YWJ/uEi7+UjjyqjhwIZ+0XBhOQ
  87. 7JZhopbt3Xh5uOglfOgEM319WWNKCRDmq4sIzjshpGil7gYM9N4cUzYWI/6L2Fxm/Jag4jZmvNoV
  88. j7X5Eh1gPYJheJRAD27gljT4GHT4DNOuqKSwBoQzX7rPnDtQsrwR5A+1wkEqnTugT67gQfXgTDfg
  89. MbtfWdSDxzJNZ+jtXQRfj+jfxcJOvatYIhv4XX+8EpO2qZ5iK3P85Wu+BevZhiVopj75xGEmnAll
  90. 3gH7XbkO3bXduQFaktuXz1weurF1Y1m+DYMqeRRBoRDZLbkL16DtxxFGy1ge9EkmNdia6+y/zqhZ
  91. VgGxJ0zGkkkSaURqDfXjC+H1yxn5ZpLiIRjL3q/2DNZ1V7amccCauN10vOT5zcH47dJllkUuAce9
  92. J31aJ+qworZgGwh49MIqkKHGy/ETxxCow5EfbYOPwrWEiLbM/2q0Yt1L/CigI75z6PSPMFDo7eHl
  93. 4+E245DDqX+U4kWWH8gko61/2xfmFthJaTkTzToQwu3Bc+uggu2EPzEwuOI0KE3er+uKqwqnQ7KP
  94. mrWwe47Rh4uXZ+ooZBFBBbtaDfqsJKsKOXMCIZ4hzstSmMPRUe6QOb6313ofi5m1YVlmt8WVKRfF
  95. JWb5rPcE3zKQQ71b4UrC2s5GvDbdf1DZF807Z2ms9r/eBPO0GZlmnOVx1ZzsZQV1i96Ia285ICtV
  96. UXuPd4eO5U+FV3DYPIQyVEkzNwgto/bgqEeAMpkZaJRuCgLeCN/nDn0cnnW+qtvBHFsTXUFZbRHd
  97. CGTFLwogGcvSe8cQ4M2B/alfhOJCmqd4VFsr1EikW39aDiUJh8Lhy3jZaxCT2rf4UFm3mMIuKFq5
  98. 3m8/jJ8MRJyWk+uk0MrR7ErDRgjEVwbOo7jYgvkQCO3Bb+70y46TDYUMMgwqgDcToGfEpbEnTxnU
  99. bEt45l8Of94P0Lof9umuYTMutjdAyI05ZAhSVSp9t6cMdxyW3ItJtPaLQnYP2AgDZatE9kdY7kNm
  100. RjT4GHjtdqpyEQAN0CjE44WvlOIxJGrUvgxJ3hfxdCxW81zccro2eASw55F5HGtWsFg36TnOZz5i
  101. 7QWsMgfOgSYHT1nUIkX2zVBe46Dp7/E+zdPTk0QnLE2CgAFZZIc0SCVdN87vu9pvnkjGODQEMa8o
  102. sm7oZHJIDTd4c3z4GB+8P6ehKcXUaHQEMa8ktXTVEPnY3Wg+GHJovr2G00DCJrHBsEGHrvkUd0hR
  103. VO9XfzeeYU7eaTJe0D0BWWSKYEDnpvndzN5+bDoJuuiDPH0TYgub2XiGRQ3W4+710I52qaT6asF+
  104. D0llAkGxywUXu4vXaaz5Fb6vlWixitA0xXWCLZVDfNZ8zJ8NAJmubTEup7kRxpXQIn7gT/vRBGHg
  105. xd2vhOlH8CtPmESE61bwUDD4KJ/eG0naBElw0pC0DDGkR82LIz3H083HYERDUEIiXqdhGPSiJwzl
  106. 4w+Ne+k+QHFZaIZ87B4VtrBYhUqLBEQiBhvhPkBxWWiGcJg6c/g8oa30nCLwASvkOIFKsag4ffg1
  107. sn+U6SH6LAD8AmvoOIFBMDvp4H174O972XLC5pmka5i+TYT5Vwx2S4eRL8uNR3mvyiwhLJkZXV8P
  108. QUuOpV+GK+HrSnI4pjHqZbQpFsSSRg0nSomAAvfOU7TR4zaqIYK33nEClUPyyGIS/DmCmwJO47TZ
  109. 4LWBjFWKAV9EUya8FyuOttuP5NmF/pO02BMKqiOJb5ziFSKFZWw3+mwFXj4dO5vtMUGGNeFJjjO4
  110. dIIfjfTBj4Erw2DeIa3Zh5ASuiwCLfOUTyVd14quteg3vf13iqLFtU95ZQRJpp0QoYPRlumQQ/6s
  111. FK9iWYHyXBXD10F0ldVQ38+xMYNh6mzAPT//BzI+CHKDDDdw6RfFCTgLdnQPk4eOUb32mKkDEnSo
  112. Q5JDDQdZZIY2YshOGvwr8+hqVVvtMUKeP7KMZSkg/eO/rOIxI2iyth9CS4cRLM0XMqvxzfRSlhGV
  113. XMw1RYInUqq+DpTyE2Dj6b7zuNAMuB+VHms4z2zAe29J1IJAzemQFDX4bx06BK46nCYjGOhQG3up
  114. XALN9pRHz7dj70ewIOvBde+kZlFTKLKGFhcnkZx7caiyXFasFyuOcduGEizFnuO400yJhNuVuaLK
  115. wEX+kdoRSjxz6AERPg03lanyrUHN9A3QJ+EaZSQxWOEq+hRHKgOpF8TnXly/DqNHRzkQ8cn8GqFU
  116. dn4VgOdPCXSCT7vpoHoybAox/D8mrfaSRFCRxfQV1hLWMGZSxFhRV6TrfuaVlSCbdMhNvfhh80ni
  117. rfVFHDl1BXWDe6FQy2r9HuOaG3UXvfCfLL8nhyHfXycTB1oe80kqZKlvI1rL4JxYfAAX7yiGSWGU
  118. ycBleNg9emJ59bSd6aWjv8ql5hGR/rTaHkOzOYtgAqxsNjn2jeX0FwvF/3j6sKK8oHaKtsyWNzl8
  119. K978K1b8JCraNeSN6r+4dVhRXhM2pYAZT5SCSSruoEPPo+XPcmfDJX61MVoP/W/UP9Z1iVGB/g2N
  120. tDIJFmq0nA5BlQ/oqeUxWw+SSYXveH4Ocfl7vq+veKImFlwFdzod+T8Lt/wLhvVVYF7HOW8lPdH1
  121. bfqt7xDsb5OY8kkqKfKuHWiXDHO/D9Ut9pJOsc79e9IYQ1CyvBuzgqgda5ziWyLsvj8J9PYegr8P
  122. VCTacpCoaR4K36P1qzsGYR4Vtg21zmEmlMwuDNb5PLE4+fpm20iorjJ5LjQ38WrPaBUW4xxge5zC
  123. TSmBkL4Zwn4cgH4ZVvVVZF6Ecq+bb+D4K1PhLwUc7iiDQgYfD6N3DmE3D/B7Ak7juRePIlN7oV9X
  124. 8QXesjCSbhiAOluUolUmfaAhg2DsZ8CktVVMXNeHXNH61dWDW8R4RFOLrmJJQIyVHqd70D178Ji1
  125. Y2/XkpeAmijFvzh2vfEl7jlhDwTk4iSdGLV8ND78FBd8PQcSor+dn3fM6na/5w7SssAMeLGEdmPZ
  126. IUrZoEvD0dhrwCb8zQwE9Zy6s87taa3dxwYcFLQPU6fi+SFjP4ci5c9zo8+BHENeFeGuJ4tqEfN1
  127. xIUWZSxRSMnbIaSorK4hVwy5sw+r/wg0apS+MWQ8OPpdZ+hgVQ7ioxXspmIikeK+LwyPuw1+1w1Q
  128. SVlTTpHebyfUO/aPyWz3gOx1/W+RmRdahOwOTpyd1pXpuhbbQkRY7nudM1uPTiugrrIxzTgC2yFE
  129. sK2M/jqaZo1U9pliUEjG/slw3fEgJc7RZivJiVSFKw5i6Fka/CLn+Df3ygspJmm8IOfNLYL9d9ux
  130. fhaRKc2+TnpOhVVsETH8HVryd3URZJizGWPmsPZ6iz7iKK8iZxZqPtv6QRBkyellz25fXpUKXxVN
  131. ISEZ5c168bvyWE5NtCx9iMBpKCYAZT58JZj8MB9yRX/VRZSQtNIrr66gxravpWL8EjOM6nqXKTor
  132. FgOfztLbj9HZitXZQlcx6j3K3zf3tNF1YVH1HKJ8COmUol+WllNYz9BIaNh8/nadVPyaiFJHiuqQ
  133. 81fdV0nVuGY0xGIkleqk4kV/3sfR+cNAY+U1lJ5r3G1+u+HYRUb/OqeZrkcHkpMl/NS676edg/Yc
  134. L0pj8vkoYa4NGGJjuvKbXhCmVMYSWTcPRuaTLJDwuWw+hJcPMkmLui6c+LtMB3VPNCKh9M7Qqr3C
  135. UIuAfdCRS8FXF45D3Y+w4Y/KrKSnLica5xS1L5YOoDQkt4jjg/At3STSXhZcBb38BV42HCNK1PJT
  136. lTTcC9qX449aEK5a4SuCudRBJeZsnnVGc/Ab+5H175RmUlOfV/fMFXqX64eVNujEdwXAJ0aG4qCZ
  137. 8Fy+C2SfD3t2Huct9ppAhV47g7lYftdZpXWF/xNVvwPI6Tmh1NQqM6AY++D9e9AR/P9Z1GitinVD
  138. OhOV9o3uj1x10NAaOBymZ9T0Khuia539/+o+G0p1RW4pUB9zHKNWu4VPNXYZjLJDoxGceBzf6utF
  139. j71ul974s5MHICPD4FKqszmUgkLT9iPNLcLzV/fuCdrgrj1mZ/TzKirKR5n1+0Aq56Gfa7Gx74UG
  140. UlIeF4kJGu2df46a1z1YtnmcYUHNun9X1J20+V0KlN059bFocnP4Yrx8F0zVGQcPkJ+Fs6X0xvBY
  141. ZzXBUB16X1XWmRH5ooHwPGTYUj/wlnjFVZSSg9RAmz0vli+kvGJHgW+Dzt70tanv6s4Z8b8PU8OO
  142. 0xOPKh5OBPbfogoeNYgPH3ppaRaUz6hTXSzcdxG6Bhhjl0x7vw0herysiAH3+C8pdgt9uTm5PqOZ
  143. WElvEvRrq1tqBPlWvR7MCYrU+cd9HOOjnVoRX8phdssQHMWAxvzYSZP/lOJdIEx3IcOzLcfZ3+IV
  144. p62zDI+uE0ZUdEmnQHFe78lhyg5cseV/IQxsctPo6IFLKFVHFTSw/S8sK60a3AcS1GyvOBRKTIOO
  145. 6lLWnfCtbJzMYSpTyFY2JGjiUihWYW1dyW7pvB+jJTWOVuOTACiGfkeCJSSG5hlJuRiQNlbuuuUs
  146. ZB07teiEhRmUac2zN1sMwVVnIZ5b/imJOxY4pIPosD53Kdy9julZndHHU40zBuxLT2u0jRM55kHq
  147. 9m8pAZ3s3ZGTWMJuC9zB5XRPLMXCKUc6eryuRBM7/9/Ci3GMcQQBNERIqV42aGu6mZPmzmCwsgyk
  148. vAv7JybBEJN8fHlHBzdg6dradNMetJFW9ibJKlM4hI+CwHjqbCjcvGwbNzhQVQ7qbhqEC3hiLF5A
  149. FKeS1bB89eYQF05T6Ml7J6DhEJB8e3lFJOucvaRUp2C+sit5IIl5BcElVEClc1NfyVcpfVcZjZLS
  150. yA4W4qjvKsn0dEfPoXrXkm2yfJfmEBzGI0xr9zci4RybVPKeWybN4K1slNYf3DVQJXQHoLz4tIaK
  151. 0k4DLK3Y+5OFluCgtgpPsSxxU5O5+I5MLtDOeFXJ0sd4UFUMKjOO7O6TlFJFveoppycDmbO5y9ga
  152. ONGWwbAs8Du+b4zCKSObNJcBhXu/dzedLcXmEBVLjZOC7AsSjn5xaRTKgBLudqPsj1iXNfWAAj3G
  153. SSD+G1DrxI/rmbCvdALm8F6/gpLIAS7gce9HZ+EUnHJIwhvk6e+2dY9cWsM3GeAX7lMYWIpGYWEQ
  154. 5lmJviK4DfwgIYaluTYBxoVQeREFuB0ZeR7lmfIfzdEtYZ7r7AcR7JZSlEJHwSwHDfZQVhKCyACp
  155. 4FBgAZXU5VRFrMgHso5QbfQSAshWXOKOUOEtyuDSxEQsQYRw2XU+5Cseeo/2dY9cWsDVU8idHbdx
  156. QRYSqlHEi5+953kDrhuMKqU+6WU8LJwFu+o4gUuRnACWEqKwhbYQGUuwUkOA34zHcUkaLkWESUM6
  157. lwH/mOsqZw3RLWN8B2IsIrQGffUUSKSCVwGhXucd9BGhK+K6w6o9yHGL8H5vuOIlIkVmBcwkjG+A
  158. 7SmPAWFsBI3gJOAxb6jiJS4BIYQ9iFe7DczxFMVbgLC2dU8DyO8zBW+k4jUqASQAWtuJU+LtQLEo
  159. S8sACcMYLHCegHLPGdRqTAVJFgGKUMy8Wa7C2VB4UF4IwSHgYuxFHpO41IwTBG0Jqr86GsIMxvCR
  160. vizDGIk4G7gDLfcUTyWDUBVxPlKspdwneYVEV9B2gWc4azhxmIw/F3oL3vSCJ5qAqooAcjOSd/yg
  161. ry5pawHnNGKx7GcQZ6piWSjpHMYyTnuLxbbCC/bgnXNNR6k+BBNLhUJBWVwP+jlDvy6TawvvwuLM
  162. wxhH0xHgF6+E4jEmJLCPgzO/JA2IcurEueF1atK217ange2NR3FJEQWoxxOiN52sfGEZmUf8+wGj
  163. LMTcFxITDXdxSRkFmOYwS78Ey+lxUUyhUWAOa4kj2p4WFgc99pRLxzLMU4i515Mp9vA+sroMKqNc
  164. A2JcIjGPvgcL7jiHjyNRFOZZib5DtIJhXGLWF9o9wMSjkOx2Mk50iJFBfHWxhHFlpZQSEWFkC5m8
  165. MSTidgOKaNLaRoJIB/UcIRjHSf+w6TDYV3S7gacwzieBy3At18pxHJoqU4rqGEa8OyYUQ2FHhh1R
  166. pouxBwD7Cr7ygiGWfMIcJZRHk+XweEpqo4CgsgZhsQ5wbgFPJtDqVIwwyYQEB/hrupvsPkQmE+w2
  167. pIuVtAKf1wXAAs8B1HpIVWAtcS56hiKSsopius+obYniQYjWMX31FE0jALx1/YiacKZXxVqoqzsA
  168. AGWAcilGOcj6OV7zgiTTJqCHgBOJ8RbqbvOD4Ub2HVGWLHY4wCtvAdRWQd5hJwDVFuK+S3gE1RYQ
  169. EMsR4YI0k+kBcJF8c7GP2p4MNCmA/YEiqsn9WO2QoYhWkuooTCXOAmSrmhmK+q6lNhrSlm3aniSo
  170. zTgRLfcaQoGfAKcCkV7hPfYcJEhdWQmEWJ8zsc12FsB5pELTni+BHHEJbxCDe6Fb7jhI0Ka10utT
  171. LKuBy4CCh9HswAAAMtSURBVOjkO44UtGXAY8AgKtxs32HCSoXVJHNcyXYkGIzRF4j4TiQF5w0Cru
  172. QL3uDx4hpX1VwqrFQlbxMPAiowdsWpuKRFDJhOwAiiPEq5W+47UD5QYTVXzFoT54/AAJJjt/R8S5
  173. prNo47SXArI91832HyiQorXZdZV0o5C8fFGBv5jiN5YSUwmoC/M5yvin1MVTpUWC1ijsFsBPwF+B
  174. OwoedAEk6LgbGUcg3wZaEvAZNNKqxMSa4lfz6O03TFJQAYi3GMJcL1DHNTfMcpBCqsjDLHUHpinA
  175. mci2lH6iJVBTxIhJuJMEVXVJmjwsqWv9j6lHE2jrOArSimtceKkWE4fiTgEaq4lVHM1DOqzFNhZd
  176. sV1p4Ix+E4E9gXjeMqNAZMAR6gmke5xn3nO1AhU2HlyqVWRmt2J+A8jGOANr4jSYvEgTcwbifBOE
  177. a5xb4DFQMVlg+DrRvJt4p/BLYBSv0GkhQlcHyL8SyljKa8MLfSCjMVlk+XWVtK+RWOUzEOB7r4ji
  178. QN+gl4DceDlDCOcqc9ATxRYYVBzAKW0pkovyPgVGA/jDY4jaL3qBLjYxwPk+BpWvMd5a7ad6hip8
  179. IKoyHWAzgM4wRgV4wNVF45sQT4GONpaniaa/kS05u+MFFhhdkYi/ARPUmwL3A0cAC6bcy0ZTgmYj
  180. xPhFfpwpdc5Fb6DiUNU2Hli5gFrKA9EfYkefV1MI5eQFs0ATs1ybFSlcD3OF4HXqCS8bRnkW738o
  181. MKK5/FbBuq2IME++PYC9gMaOc7VshU4piJ8TEJxgMTac0UrZGen1RYheIya0sJPQjYgQT74dgN2J
  182. nkFVgxiWN8huNdjMm1f5/FSBZo5Hn+U2EVqr4WoTultOOX1LATsBuwA9ATWI9kkeXrdCEDlgNLcX
  183. wPfILxLhE+IMKHwHLd4hUmFVaxiVk7auhFNT2ALXBsjbEZsCEBXWsnbIdlJ+xqHPNIMBfHHOBbjK
  184. kYUwmYzgqmcaPGRBUTFZYkH+hDG+K0JaAdNXTG6E7AxsCGGJ1xdAG6Au1q/1xG+htzLAaWAgsxlp
  185. BcgXNR7d/nUMMsSvge40cSLKWUZUxhmdY7l/8PfreOtzDlPqoAAAAASUVORK5CYII=`
  186. func videoVimeo(w http.ResponseWriter, r *http.Request) {
  187. vimeo := getVimeoParams(r)
  188. pattern := `
  189. <html>
  190. <head>
  191. <link rel="shortcut icon" type="image/png" href="%s" />
  192. <meta property="og:type" content="website" />
  193. <meta property="og:title" content="%s">
  194. <meta property="og:description" content="%s">
  195. <meta property="og:image" content="%s">
  196. <title> %s </title>
  197. </head>
  198. <body style="margin:0px">
  199. <div style="display:none;"><img src="%s" alt=""></div>
  200. <style> iframe {width: 100vw; height: 100vh; overflow:hidden;} </style>
  201. <iframe src="%s"
  202. scrolling="no" frameborder="0"
  203. style="width: 100vw; height: 100vh; overflow:hidden;"
  204. allow="autoplay; fullscreen"
  205. webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
  206. </body>
  207. </html>`
  208. output := fmt.Sprintf(pattern,
  209. vimeo.FavIconURL,
  210. vimeo.Title,
  211. vimeo.ContentDescription,
  212. vimeo.ThumbnailURL,
  213. vimeo.Title,
  214. //r.Host + r.URL.Path,
  215. vimeo.ThumbnailURL,
  216. vimeo.getUrl())
  217. fmt.Fprintf(w, output)
  218. }
  219. /**
  220. http://v.io/v/1234567/token where token might be optional
  221. */
  222. func getVimeoParams(r *http.Request) (ret vimeoPlayer) {
  223. prefix := videoPrefix + "v/"
  224. var IdAndToken = strings.Split(r.URL.Path[len(prefix):], "/")
  225. if len(IdAndToken) == 1 {
  226. ret.VideoId = IdAndToken[0]
  227. ret.Token = ""
  228. } else if len(IdAndToken) == 2 {
  229. ret.VideoId = IdAndToken[0]
  230. ret.Token = IdAndToken[1]
  231. } else { // a default video will be given
  232. ret.VideoId = "719542916"
  233. ret.Token = ""
  234. }
  235. if strings.ToLower(r.Host) == ("v.io") {
  236. ret.Title = "您有一条视频消息"
  237. ret.ContentDescription = "私密视频"
  238. }
  239. ret.Title = "Video Message"
  240. ret.ContentDescription = "Modern Video Communication"
  241. ret.FavIconURL = "/assets/videoIcon300x300.png"
  242. ret.ThumbnailURL = "/assets/videoIcon300x300.png"
  243. ret.autopause = 0
  244. ret.autoplay = 1
  245. ret.playsinline = 0
  246. ret.loop = 1
  247. ret.background = 0
  248. ret.muted = 0
  249. if r.URL.Path[:len(prefix)] == videoPrefix+"b/" {
  250. ret.playsinline = 1
  251. ret.background = 1
  252. ret.muted = 1 // autoplay video must be muted.
  253. }
  254. return
  255. }
  256. func (m *vimeoPlayer) getUrl() (ret string) {
  257. ret = fmt.Sprintf(
  258. "https://player.vimeo.com/video/%s?h=%s&playsinline=%d&autoplay=%d&autopause=%d&loop=%d&background=%d&muted=%d",
  259. m.VideoId, m.Token, m.playsinline, m.autoplay, m.autopause, m.loop, m.background, m.muted)
  260. return
  261. }