From 2965ec345d714347b6a0cd4e763e5acb40d0192a Mon Sep 17 00:00:00 2001 From: Ilya Grigorik Date: Sun, 2 Mar 2014 14:44:20 -0800 Subject: [PATCH] initial import --- .gitignore | 1 + icons/icon128.png | Bin 0 -> 24910 bytes icons/icon16.png | Bin 0 -> 15635 bytes icons/icon19.png | Bin 0 -> 15697 bytes icons/icon48.png | Bin 0 -> 17705 bytes icons/large.png | Bin 0 -> 22848 bytes inject.css | 49 +++++++++++++++++++++ inject.js | 106 ++++++++++++++++++++++++++++++++++++++++++++++ manifest.json | 20 +++++++++ 9 files changed, 176 insertions(+) create mode 100644 .gitignore create mode 100755 icons/icon128.png create mode 100755 icons/icon16.png create mode 100755 icons/icon19.png create mode 100755 icons/icon48.png create mode 100644 icons/large.png create mode 100644 inject.css create mode 100644 inject.js create mode 100755 manifest.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e43b0f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store diff --git a/icons/icon128.png b/icons/icon128.png new file mode 100755 index 0000000000000000000000000000000000000000..97b1826585b0ea612441b44470a903580a81f0be GIT binary patch literal 24910 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 literal 0 HcmV?d00001 diff --git a/icons/icon48.png b/icons/icon48.png new file mode 100755 index 0000000000000000000000000000000000000000..1d74d36fee10e1e8fa77efdf9501cc8252ae4fe2 GIT binary patch literal 17705 zcmeI4cUV)&yT=crG(`bXuz(>TO+&hnP^1bdp-EL#LUIBTNMaHoU_+z}sJH@Vk-A`E z7byx@)&e#}L~LLb6%>>rh`Wf&DmMWXJZkRV=l<>=_jz)7l9PA7^S(3lnRn*QKZhh& zXM073g$e)wC^|aWx(n|p(ML{3`0YLILxS)o&vNkP0Km+-qK_27&sGNj!hO1j57&p} zM5Hi7jmT7H0BFPuWeIBofZ0kOi%bayxv&5*kj^lN51hRKhta9#aBn;bMPk{2L3D>G zHn=v**@F@lOd(L=D=ievctl}

@T8@j^ow93sygJ{FfK{4FX*!eL`oxWVRdD^Y_m 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 V@LM+@75y_4M>}WRQfvR1{{jV^bg2LU literal 0 HcmV?d00001 diff --git a/icons/large.png b/icons/large.png new file mode 100644 index 0000000000000000000000000000000000000000..dd197e4c7baffc768aecbacf3487248fb69db1fd GIT binary patch literal 22848 zcmeI3c{tSF`}ikOw#pXCuCxe)v1IH^M3(FnF~(Rjj2Ole9=jqcTiFuXWl1P&LW=BU zCrTLmF6-|-XnE#&^8NgN-|zR2-*uVmvfS_c-1j->b?*B>SAQ0$? z;$=Av5a<9G?uYmg@Wk0I*a7%MVtZNN9t0wz#{C=sMa7%|fkZkiwe-+>D#}ne%9;me ziZVg)I9b~QtwA6$Nhezv+zNqaH9?qL+K97H7nifMTAGTp>k6vys@TdREG#d(*da7s zRJGtPR&Wthc1a0RF()YCz#4&uu{v2JZS0{=;_Tagp}_yR$6$8W?Ivg|adv53hpc)k zS6O9Ib_iBM9zkw6FFzlvum}&IpnwP;9~Ub>FCPTV#|!2c;pXFm3J62_gjjc9>=LBF ze`0o~W>5_|`Q7dSNu1pRjkbk?!59pN2Ls_j*_ng+L_|cuy!>E(er})zx4p9s8s@}p zV}EML$qzqr2z$7lr7hYLWy6Z|3o}7EpvBqQaUK19?as^E_Gd>n_Pgu=ieM+0Etrpo z7yJh!6_vfstgZjm(jI-u5g5tt%>K1Qdo5>M1Xu%Mk8-esBQ7~2Y|y9vZ4jpLpMGo| z?2y}hOyOVz5@8LP*aL&-``01ZTAQIi<^IRb=lG$2p;F(f(i(& z?Lwo8xb^p^KNLvI?Sf$ov$IFw@=%=pMcOmj(QfDDU|H&HT@OU@QF;WMQ~kY7e^=w1{<74z zu|!Mo@AiiG_%|!uR=ER16FAi&B!mP7AwWgPe~fQ&)zS%p)RVIWYPvnHQbBMN+cv`2 z{Hvw@A1!~=>{{*w!*3_B?G)d63Y_nNqb2y~+43LR|Fc5=PyX|3O8=8y@qF!ff(K-8 zaUa*-eDJjUxbT4NE$-vmn-89L9~T~wy~TZ8d-K85?&HD(vbVU8Yi~Yy+I?JjK=u~* zaqZ0qPrHu`56Ir)KCZp_;A!`9;Q`rO+{d*yA3W_oE<7N6i~G3t=7Xo*$At%EZ*d>j z-hA-1`?&Cc>@Du&+M5rab{`iWkiEryTzm7u)9&NK1G2Zck85u}c-nnjctG|R_i^pb z2T!|?3lGTN;y$ju`QT~yap3{kTinOBHy=FhJ}x{UdyD(H_U419-N%IoWN&dF*WP^a zwEMX5fb1>q9+17oeO!C80D=DU27$hB0e{CpAO~I$2x|-iL4h`OsE0W{g7Aq>3B=~iH@}d${|8nLXD__++mmsgKlT{Bh zbE~|l9PX(neAaILqzAfFL6t-n;3Z!@%5C4XzS-0#={|xKgG}cTOFXe(v9~?Z?_4rn zx!iytlx78i>OBb}K_Ch}5QvxyBxQU6#G11${`H37r|3xp`XLgKfk3+=AuR~BD*~pV zU2)eFPTckMyW{^kPe4CE#)Rt!aNP7>tA68fYG$UEmbUiymoJTi`fSXd(HSh;JRs zqLT5UUC|adZ-}W%E-HY*U~5PcF&=m#@ziM7S8b-M;O< zYGhDpMz3>LHHLWTViq}!V@tOq%P=IrE&Ar0zYY{fV~dWS;5EivDb2!-0Z`_4`L>U> zrikW$)z!(+&1UY=>L@U8jPt*SRXI*i|6Nh5WP#tlTpWo2dIY;0_w-WeD)E?mfba7rP|x^|0CNlB^G zeAYwBKzGatRlc$0rStrnc=)oWjEu}p_~yi2^NnHcNFKxVsJVe-q@*tfFY#n$oKQ+? zS^Qk#oif+!6lcybza}~FiOAJMzbbtya_b_anss>PErY~Og{N<_SwK-_ze)#QhW`-% zScLvc_Br;{>8`=*&9y5SdyJY%-!<{mUJKJ-Ud(3--F}mH1JyXdvDDcTS|ej)>dqh8 zimexr4E&svi*4{sdN2=Zsb+TFm;+A@KS_RO$C(t!OB(q#)E26xT3CQt%kF&O)$aR- z;BhIhOYQPmHD-DqgW|9%3$)K=Wo}=o_tUS7*K5~hvI&ne>!1798Sm*GIKBSJ5c^S5 zLNCpp;q)To37LRlm+!M=q8&HJXWy+Iu43$YeZA4Ixb#rWs<`X8KzLdE6*)T>h>rnS zJg$)6SqD8=dqfY`N#*s?YrycKNqg}${DdFH@e7kz>Zw#S1ly*R)QU6>*;X-(c@~vQ z{*gu;l!Rj=@g{e!4Pe_{6&%mBt=~=#?X(}|+eqZPr1wOuVl4jRVL|oR`OfVwLKur% zQ=8{9c?fCWe}tU-I3c*ycci5Krm02Q1C2{<-~3h{s-y)bG4>;F&XHzZd2dEYSB=%6 z2!17R&{K5VGpzDp3iz7I$iiAcE1R2@67k?go~3V*R@5k?3zfkHoW0&`g#xbI*q9CFtJ5+SO6}#;;SKf1;;!iT?Wfifs+k!C7QoI$?ztj7fge^<=|f*N zi7>Ho_)?Z5jUb0I$UKSey;-hzwtU&c@2O4^{In~A`*ObJwaEwY>pJC_jfv~wLxqS3 z_PRENXW7j2qe4qnVHBE?hqrH8Gh)kRY6_Xk-kABVH2e84`0@ z5SFH#ou*tbrXwlw#jc&pck%w-Hu!4pi;+TrxX?mANyEVj^>?|R{ArB*h=?e4*6@=BO4r*V=k1pu6_i9gSXC8NPK*TqI(AUpEw_k5 zj}?*~&zm>$YWdTw*poVnqVk9|7NIISk20;6f{*4{g$qc6Q?i=_T;%QP2Q!Vy+H0s#81W~u}R)xKEvn#*yiJ3&0^gVhMl>NVWZai zZErZ2I~5d1wT64C5iI7&nZ`ApT z>BVk`EMVm*Wdf8kgnR3{9$)2#wLPtAd$v*gx!?C?Y?RW7Sx(#srfV^4YR!p9*<@?J zS;EN`n7;X=2kR~G%mXMBCg~G%fJrtH-|mlzd{=xz|4dUxnI79%HbUCNu%t8DI+ml3 za5YO%aS@@5HVFw)x>4FNICfnTi5}drXoHP>#jdk#;5@KG27q|z^DoV<kcsIFH3X@X@t{ES3o<#EBl?+j-FkApS{_xkG*(2=m-V&gK|)$F>6Ngm zgUSKq)T7r*JsU$WdP3OY2vj=zJs_pQh6o1U|`X2vH zh-X|hE|kwUQ;&+LoMtxma;0kthTd5#d5Rn+!c)L=;nb{7 z+RBcnr`akOlg1?%cqbou$|Ro38nRa(Nm7niSjcdj%0DlfT8Q9`NVVx$`MR~?E!RBA zL}4;{@s?_lcCd(Go%bvv`dNM20Rpl(R=cU%BVLgxjztFVd}!rHOe{&q+$M)Rf%ssl zcWqNDK?)=FsQEqFyBx~#{^a!9sbi88x16qosLBI<&LzwwJkO{xabU}dr(98vjWnZv zgdBQ^ATS)#WMWo{r|wo&N#yJ81p=0vgnG1@C3EE?ZmB19(#O+2712*IVAL`j=veyy zdgFE0x-Q{R+e@aX`(rs`Vyc)FJ2{8q?z5<*6%zEZE!OM)E6WgM81?AaSwfe`RfWgC zmkCPNb2bG-d3_KkJ`5fq=5q3y()>1|>nA_ltQJ3hXA zn{dPS0C5S<^VW&2b=fhF1cphi3{wnwXS7D{Jdv8_v(za_uzEru?WbDrGFA0Cqf38d zJInJ%idTxE@6Jl}N2muu&uxl(^31|qQNZA+<)!tCQlMOe4(PZ0w`mMS#n03J0 z4tNsHk)7l(lIjr_@?T9m8WTaBG~&APg4^&dp-XvpLFJk0`v`)K!ts70sxwVJYlomv zWhY7Rr3YeO8j5=T0tMu14pPR_UjlHU8JVKSF{#O<7u(--KkrHlq^a_3qeLok;D=Bc zf%qqvPZyu9G-Y|3gdDlUq#4g}B9dFzX{*F}*a^3%2@nj71x7S)(>0GVUoz`&@^_W9N?lIw<<)8tDF4uQ+sk@DgH{6GTB6ckUBJg!8%4zcB@&S{O z$pTOBVHP~<#)E4k0q z{r@V|jF^#gzW*vltA}5wqDtF3eCf59TclfVXBYOhXca7l7$tL2mD<&6dbLY9+rZ-9 zaX;Yr<69MczUk-*o=PA=)Z$Uc0U{zLjn50Rfj}&LbY6i;FQH7gV-Sg5vj+|jw}xWS z(S54o*f(9=a3$ds7%oEYJymP5(=R}vsYj>HE)*?2bx-%!$Oz1jU0Vvj&;{(W2eM1t zZ%Fb^#WTi6CCr&Dzirg5g74&LsR+tfJANHR21KAAFy>GRPn(WnbIP;z1wm{vI#x~s z*qMw`l7)aOM6^%v=CEB5R7@-vV=z26O|V^)^LQR?SoID^NtGLZIpsi5s`<7zTqs&R zl2`!6qCpibe2=^9mFXQ|(|Yj2M>q8tZ&=9J!7ycmcDlM*t;4u&CN6Y9GM+dv0!GkR zZ(I*K`kE7n#+mR}>>F=7jzPH>diay)G=L#Ts!_QjQ<&8YyYD?J@QoZ)OvAc5Fg0++ z`hMra`T0yA7%>yp!!JXuo)^`*oj;KVRN|h@4_=`|oA~0j;`<|B(=#&;h?WhtkpO|x z_pUs)ZfO+Lttf(xZ^6PRM?9RqcX&Vcc!!lS_WanrhD+8)#S!Q0Jg1tJ<1dg{ zpqHn`9(somwO*&}wtjr|7F&r$;EM1e%+zts4x6tFDvti*(OCcQ%Y>^hmQVZYM1J@H z?D+Qg3p86hx#7)H%mu zS4nu@U$DB^_5>^Z-CwDgy!zC?2MMIc#H4j;&_*Zuiq5pxB;yu55w%-ovc$-as$s0 z1Mbu|P-hDtjSS(du|D-mgabB_r~2c{uS`76rz7j>lX!(VnbOKY7-etU8PM04SB9$f z3&+*J`|1vZW2%_ELRGi}v?#i*f!e%SHNTmx<9USL%00s|MXrqCq{$#I0Nfk2WlwW0 zweby?{Hslokc*pjJk1`o;u5y7j+9#sb>^$*1)%8-?=AU8(oY?Vz28C~{^Vj? z-NKg&N=~LeN3GA?Rl{p`t) z<*3ua+M0bp(69hNTV2HpVk=@@s@IgxSR4&{~&ZooI_v3Jgm^^9s97iXk%*# z@1uK@3XSWTvK`Fja9`YzlAeICe~g+^Nhnq%dVBr3d^Sm5hclt$@ePA0FF`VMPE;6C zvyH+eZD{V|=UM&DgH<8C2DPg-ygk*e2Wi4ik*fxt*Jb)%d&ed*<#xz+rW~I%kbLXR zA*rM&`1TD20Ip4*A=rb7K<+sqTTXsl=$A8VtmzsU718QIW_q-dJqt=h# z-E=_1X^t}FN_ONHWLHg|W6k+|%%;WFzfjFAZ6wHP=ysXC$`j!59w5F@m`++ zp+y1h=S|m2MATY{WoMJys$vN7TWA)A(I^9bC%VhbK@}=^&)^J@*X3a zePL1YY&G+Bmvv)sYx(F|EK$D_;no!0DYJ$e;)B2&K`obsjB|CC&hjT7#orilRaNN* zFLh$yw#H5|cSG;BV-b&1rwyn}rEZ&}*RDNI7n%=!%~jW;(k2>P^=@p5sL>$k@I0`L zs+jZ(G{P_Vsq|Ih@#8@;KIV&SUglg61>VkBB=iepbBOCB$8#&*i0v?E^RKYsGDJqO99jT%N%#M$>y&*)ml zstZ=+23r z>c1)Icw(y`+6bEMX)aOwR+^Yu{7s>4K@DaBfAs2l?M@7lN^+26S;K!9U-m?jYNwAf3rSD2QGt07)!oKRA9&SKZB-|N z4;`sCCuPr((zztcFHce}sldyRmN$4gXfet=D?FBXXEkO}sdh3IKtRAE`iz2;Ee9F1SodoO0-NXWX>8RZo!apZL|l@>ozfr(inyqP7d zmvyPB=QzhiJ-CCzj!{8Sy-_SKwdSxQYmSuJ;&64;YU#MSeVE$RY1PBImeM;t9knCX;FSA$b#@w8z;)_gGEIh-kZ#j$&Ciou*>InzBgrHePWwEp%lsg$Kz+gS<;2}A zci>G#2s7z9rY~rU=mHg;`)&RNHj0K-=TGPtB)U710z)~;mQ$veE0t(GlsXbbc&2BW z8%TQG8?4O53MUcy6Jj-`g$uHiJsdu0- zHC1nM&PbTZ37C|zXG|7jw_uZw?d_bq1&|j}0qNJ3ZxoV1>@T4z8g8>R*_x&Rn?cr5 z_u*zLXySE*uAne(R~HG!dY=wxm3Fd@&TJ|l@;(h5+A>yKj2s-+Bx0*AUmof{i|KZl z(yxHfDq(}t3!gu#QMXapf~aprylhBC&cCR>x%rfaSpEICj;z~LfVgw%PFJ{85%{8~}+uuMRoiAcZW z!bj!lez$71Hq@qT$#}=QMR?iqY7yQlm>^5Xf-Cpg(~imqaGw>JqQ^3rz$C{Qdg%wU z#?N6-4!xL1M$a5bc^1SQ7AHpgRyXp{E%!biY8jp@;)g3>@ch_=S6oZj+!HoehmCrt zW4F>IN9Y_M^WF`l$>!ItdOq1VYC223i2Fpu3AXTc`orjl0pVd0!Xu0Zi~_bZ3&~>s z4Sg;`=*@{}OfLK9Em?me+#TT`t_*)(^oeU<49+v52Yuoq$k2b~vE|OtOYoOqkC@mz z%6$`?k-a(hB}B69tL;TC^2%4XqVHuX2#K;%*29#N#(@hxD}Ugg=CN`zMd$|_uj>au z*Jb|84tMTC|9e-KKdvlx?3I$WxYjt1f}XaI+vlRh-DJDD0H)Lw70dl zJG{xJjz`ST%@xs~JbBal6Yh!=S>W@(cTxLeaQ{A5oc90a%6E7DEVQkm4m(xhxrDum1xrf6~?f literal 0 HcmV?d00001 diff --git a/inject.css b/inject.css new file mode 100644 index 0000000..423fb9c --- /dev/null +++ b/inject.css @@ -0,0 +1,49 @@ +.tc-videoHost { + position: relative; + text-align: center; +} + +.tc-videoController { + position: absolute; + background: black; + color: white; + + border-radius: 5px; + padding: 5px; + margin: 10px; + line-height: 1.8em; + + cursor: pointer; + z-index: 9999999; + opacity: 0.3; + + font-family: Verdana; + font-size: 13px; +} + +.tc-videController button { +} + +.tc-videoController:hover { + opacity: 0.7; +} + +.tc-videoController:hover .tc-controls { + display: inline; +} + +.tc-controls { + display: none; + margin-left:1em; +} + +.tc-controls button { + color: black !important; + background: white !important; + font-weight: bold !important; + margin: 0 2px !important; + border-radius: 5px !important; + padding: 3px 8px !important; + font-size: 15px !important; + line-height: 15px !important; +} diff --git a/inject.js b/inject.js new file mode 100644 index 0000000..5092446 --- /dev/null +++ b/inject.js @@ -0,0 +1,106 @@ +chrome.extension.sendMessage({}, function(response) { + var readyStateCheckInterval = setInterval(function() { + if (document.readyState === "complete") { + clearInterval(readyStateCheckInterval); + + var tc = tc || {}; + tc.videoController = function(target) { + this.video = target; + this.initializeControls(); + + this.speedIndicator.textContent = this.getSpeed(); + this.video.addEventListener('ratechange', function(event) { + this.speedIndicator.textContent = this.getSpeed(); + }.bind(this)); + }; + + tc.videoController.prototype.getSpeed = function() { + return parseFloat(this.video.playbackRate).toFixed(2); + } + + tc.videoController.prototype.remove = function() { + this.parentElement.removeChild(this); + } + + tc.videoController.prototype.initializeControls = function() { + var fragment = document.createDocumentFragment(); + var container = document.createElement('div'); + var speedIndicator = document.createElement('span'); + + var controls = document.createElement('span'); + var fasterButton = document.createElement('button'); + var slowerButton = document.createElement('button'); + var rewindButton = document.createElement('button'); + + rewindButton.innerHTML = '«'; + fasterButton.textContent = '+'; + slowerButton.textContent = '-'; + + controls.appendChild(rewindButton); + controls.appendChild(slowerButton); + controls.appendChild(fasterButton); + + container.appendChild(speedIndicator); + container.appendChild(controls); + + container.classList.add('tc-videoController'); + controls.classList.add('tc-controls'); + + fragment.appendChild(container); + this.video.parentElement.insertBefore(fragment, this.video); + this.video.classList.add('tc-videoHost'); + + this.speedIndicator = speedIndicator; + + container.addEventListener('click', function(e) { + if (e.target === slowerButton) { runAction('slower') } + else if (e.target === fasterButton) { runAction('faster') } + else if (e.target === rewindButton) { runAction('rewind') } + else { + container.nextSibling.classList.add("vc-cancelled") + container.remove(); + } + + e.preventDefault(); + e.stopPropagation(); + }, true); + } + + function runAction(action) { + var videoTags = document.getElementsByTagName('video'); + videoTags.forEach = Array.prototype.forEach; + + videoTags.forEach(function(v) { + if (!v.paused && !v.classList.contains("vc-cancelled")) { + if (action === 'rewind') { + v.playbackRate -= 0.20; + v.currentTime -= 10; + } else if (action === 'faster') { v.playbackRate += 0.10 } + else if (action === 'slower') { v.playbackRate -= 0.10 } + } + }); + } + + document.addEventListener('keydown', function(event) { + if (event.keyCode == 65) { runAction('rewind') } // A + else if (event.keyCode == 68) { runAction('faster') } // D + else if (event.keyCode == 83) { runAction('slower') } // S + + return false; + }, true); + + document.addEventListener('DOMNodeInserted', function(event) { + var node = event.target || null; + if (node && node.nodeName === 'VIDEO') { + new tc.videoController(node); + } + }); + + var videoTags = document.getElementsByTagName('video'); + videoTags.forEach = Array.prototype.forEach; + videoTags.forEach(function(video) { + var control = new tc.videoController(video); + }); + } + }, 10); +}); diff --git a/manifest.json b/manifest.json new file mode 100755 index 0000000..761ed73 --- /dev/null +++ b/manifest.json @@ -0,0 +1,20 @@ +{ + "name": "HTML5 Video Playback Speed Controller", + "version": "0.1.0", + "manifest_version": 2, + "description": "Lean in and speed up your video learning with handy shortcuts to accelerate, slow-down, and rewind your video right from your keyboard. This extension adds a handy video controller to any HTML5 video, regardless of the type of player. Shortcuts: 'a' for rewind, 's' for slower, and 'd' for faster playback. To remove the controller simply click on the speed indicator in the top right.", + "homepage_url": "https://github.com/igrigorik/videospeed", + "icons": { + "16": "icons/icon16.png", + "48": "icons/icon48.png", + "128": "icons/icon128.png" + }, + "permissions": [ "activeTab" ], + "content_scripts": [{ + "all_frames": true, + "matches": [ "http://*/*", "https://*/*"], + "css": [ "inject.css" ], + "js": [ "inject.js" ] + } + ] +}