It's been a while since I updated this.
master
Voussoir 2015-06-25 21:03:45 -07:00
parent 2b08697321
commit a62f6e582d
43 changed files with 856089 additions and 5 deletions

108
.GitImages/spinal_logo.svg Normal file
View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="spinal_logo.svg"
inkscape:export-filename="C:\Git\else\.GitImages\spinal_logo_256.png"
inkscape:export-xdpi="38.919205"
inkscape:export-ydpi="38.919205">
<defs
id="defs4">
<linearGradient
inkscape:collect="always"
id="linearGradient4370">
<stop
style="stop-color:#ffffff;stop-opacity:1"
offset="0"
id="stop4174" />
<stop
style="stop-color:#777777;stop-opacity:1"
offset="1"
id="stop4176" />
</linearGradient>
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient4370"
id="radialGradient4372"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.4674789,0.62029891,-0.51681934,1.222671,51.772441,-207.89788)"
cx="265.20264"
cy="349.83276"
fx="265.20264"
fy="349.83276"
r="254.12143" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="255.03714"
inkscape:cy="555.58368"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1360"
inkscape:window-height="706"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<circle
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path4170"
cx="363.91806"
cy="538.80817"
r="295.99783"
inkscape:export-xdpi="311.35364"
inkscape:export-ydpi="311.35364" />
<path
style="fill:#49857e;fill-opacity:1"
d="m 331.19487,750.57103 c -42.06606,-13.19845 -77.5105,-46.15627 -89.9218,-87.96271 -4.63151,-16.02988 -7.68348,-36.02936 -7.28482,-47.73706 0.2617,-7.6852 0.96978,-9.9036 6.94801,-21.76761 14.28603,-26.6861 13.48106,-41.37898 -5.76767,-65.71416 -21.29116,-37.05333 -92.79593,-53.22981 -93.938,-100.81341 -0.0818,-3.40763 1.04548,-8.14067 2.46207,-11.05648 2.22756,-4.5851 7.46735,-9.13212 11.73986,-9.5308 44.69439,-4.17054 62.74452,38.0409 101.60576,44.53873 2.72863,0.43174 3.9809,0.49402 9.82799,0.48876 5.72924,-0.005 7.16449,-0.0764 9.89804,-0.49155 34.47329,-6.46197 61.48916,-25.34959 69.39391,-60.6136 1.87633,-8.88682 1.57106,-17.96941 -0.82064,-24.41598 -2.53296,-6.82738 -2.88476,-8.65583 -2.45967,-12.78436 1.09045,-10.59095 6.01456,-20.93101 12.44018,-26.12284 2.64108,-2.13396 6.50577,-3.87579 8.59949,-3.87579 1.0645,0 3.22482,0.66769 5.02567,1.55326 8.08139,3.97408 14.70597,15.74119 16.014,28.44537 0.42506,4.12853 0.0733,5.95698 -2.4597,12.78436 -2.3917,6.44657 -2.69697,15.52916 -0.82063,24.41598 10.35743,36.25246 34.55099,55.08993 69.39392,60.6136 2.73356,0.41514 4.16878,0.48654 9.89805,0.49155 5.84707,0.005 7.09935,-0.057 9.82799,-0.48876 37.94052,-6.33195 59.2268,-50.04938 101.60575,-44.53873 4.25522,0.55332 9.5123,4.9457 11.73986,9.5308 1.41657,2.91581 3.02805,7.69519 2.46207,11.05648 -7.13689,42.38545 -66.60927,67.21952 -93.938,100.81341 -21.32413,28.19853 -18.75338,39.88035 -5.76768,65.71416 4.77193,9.47004 5.72808,11.83572 6.45073,15.96017 2.09961,11.98332 -2.12012,40.43877 -8.94568,60.32418 -15.15952,42.54021 -55.22802,72.7692 -94.01781,82.61857 -19.17013,4.69306 -40.0333,3.30693 -59.19125,-1.43554 z M 374.97405,568.6417 c 21.11529,-2.32594 35.6588,-10.82009 42.74174,-24.96336 3.276,-6.54152 4.85346,-13.68587 4.33722,-19.64343 -1.41869,-16.37252 -11.33726,-30.40612 -27.02972,-38.24378 -4.52866,-2.26189 -9.40265,-3.948 -14.55968,-5.03683 -4.95015,-1.04517 -7.69118,-1.25269 -16.54603,-1.25269 -8.85488,0 -11.59588,0.20752 -16.54606,1.25269 -10.92485,2.30664 -20.39409,7.19264 -27.64787,14.266 -2.93609,2.86304 -4.64136,4.9105 -6.75281,8.10795 -5.05548,7.65567 -8.02468,18.48536 -7.17158,26.15739 0.52115,4.68681 2.10953,9.97864 4.32009,14.3927 6.42575,12.83099 19.19774,21.1448 37.13565,24.17313 2.72127,0.45942 4.54933,0.66555 9.73832,1.09812 2.01243,0.16775 15.80712,-0.0684 17.98073,-0.30789 z"
id="path4395"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccsccssscsccsssssssccscsssccscccssssssssssssss"
inkscape:export-xdpi="311.35364"
inkscape:export-ydpi="311.35364" />
<circle
r="295.99783"
cy="538.80817"
cx="363.91806"
id="circle4362"
style="opacity:0.33700005;fill:url(#radialGradient4372);fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:export-xdpi="311.35364"
inkscape:export-ydpi="311.35364" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

49
AHK/clickerheroes.ahk Normal file
View File

@ -0,0 +1,49 @@
#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
SendMode Input ; Recommended for new scripts due to its superior speed and reliability.
SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory.
CoordMode, Mouse, Screen
Clicks(xx, yy)
{
SendEvent {Click, %xx%, %yy%}
sleep 80
}
F4::
{
MsgBox "Stopped"
Reload
}
F2::
{
MsgBox "Hold F4 to stop"
Loop
{
Clicks(630, 507) ; fish
Clicks(856, 450) ; fish
Clicks(866, 397) ; fish
Clicks(978, 530) ; fish
Clicks(1111, 471) ; fish
Clicks(1159, 460) ; fish
Clicks(725, 225) ; clicks
Clicks(725, 275) ; powersurge
Clicks(725, 328) ; crits
Clicks(725, 380) ; metal
Clicks(725, 432) ; goldclicks
Clicks(725, 485) ; ritual
Clicks(725, 640) ; reload
Clicks(725, 584) ; energy
Clicks(725, 530) ; superclicks
Clicks(210, 515) ; buyhero
Clicks(585, 515) ; over...
Clicks(585, 150) ; up...
Clicks(820, 150) ; over...
Loop 180
{
; ...and down
Clicks(820, 240) ; monster
}
}
}

BIN
Ascii/sp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

37
Ascii/sp.txt Normal file
View File

@ -0,0 +1,37 @@
-----:::
...-----------:::::::::
............---------:::::::,,,,
..`````````.......--------:::::::,,,,,
.```````````````...:vv,------:::::::,,,,,"
..``````````````````-zz+z:------::::::,,,,,,""
....`````` `````-zzzz:------:::::::,,,,,,"""
.....````` `````xzzx.-------::::::,,,,,,""""
---..::-````` ````,zzzz".------:::::::,,,_~~""""_
-----xzzzJ?~-``` `````_Jzzzzz~------::::::"vJonnnT"""__
------L+zzzzzz?".`````.:~xzzzzz+++J/":--:::,;Jooonnnn+"""___
:------/z+zzzzzzzxL??xzzzzzzz+++++++TTzJJJ+ooooonnnoL""""___
:::-------;J++zzzzzzzzzzzzzzzxxxJ+++TTTTTTToooooonT?""""""____
:::::-------~L+++++++++++z/,------"v+TTTTTooooooz/","""""_____
::::::::-------,vz+++++++z,----------"+TTooooooL_,,,""""""______
,,:::::::::------:L++++++x---------:::JooooooJ",,,,""""""_______
,,,,::::::::::::---?TTTTTTv:---::::::vooooooL,,,,,""""""________
,,,,,,,::::::::::::~TTTTTTT+xv/;;/?xToooooon;,,,,""""""_________
,,,,,,,,,,:::::::,zooooooooooooooooooooonnn+",""""""__________
""",,,,,,,,,,,,,,zoooooooooooooooooonnnnnnnn+"""""____________
"""""",,,,,,,,,,ooooooooooooonnnnnnnnnnnnnnn_""_____________
""""""""""",,,,,+nnnnnnnnnnnnnnnnnnnnnnnnZZT"_______________
____"""""""""""vnnnnnnnnnnnnnnnnnnnnZZZZZZ?_______________
________"""""""znnnnnnnnnnnZZZZZZZZZZZZZz_______________
______________JZZZZZZZZZZZZZZZZZZZZZZz______________
______________/+ZZZZZZZZZZZZZeeeeZ+/______________
______________;xoeeeeeeeeeeeeox;______________
_______________~vxJz++zJxv~_______________
______________________________________
________________________________
_______________________
________
sp.png
64x32 (4x8)
1
Min

9
Dictionary/README.md Normal file
View File

@ -0,0 +1,9 @@
Dictionary
=======
I made this so that I could more easily acess a list of words. Previousy I had to open() a text file each time. Now, I can:
import dictionary.common as common
import random
print(random.choice(common.words))

1
Dictionary/__init__.py Normal file
View File

@ -0,0 +1 @@
pass

6213
Dictionary/acronyms.py Normal file

File diff suppressed because it is too large Load Diff

74550
Dictionary/common.py Normal file

File diff suppressed because it is too large Load Diff

256181
Dictionary/compound.py Normal file

File diff suppressed because it is too large Load Diff

113809
Dictionary/crosswd.py Normal file

File diff suppressed because it is too large Load Diff

4160
Dictionary/crswd-d.py Normal file

File diff suppressed because it is too large Load Diff

467
Dictionary/fiction.py Normal file
View File

@ -0,0 +1,467 @@
words=['93277< >',
'47460<e>',
'33196<t>',
'30314<a>',
'29578<o>',
'26890<n>',
'24684<h>',
'24462<s>',
'23344<i>',
'21292<r>',
'19620<.>',
'17977<d>',
'15048<l>',
'14873<e >',
'12406< t>',
'11710<he>',
'10943<u>',
'10661<d >',
'10658<th>',
'10608<m>',
'10330<w>',
'9414<y>',
'8825<g>',
'8528<c>',
'8406< a>',
'7851<t >',
'7814<">',
'7772<s >',
'7730<in>',
'7649< s>',
'7508< th>',
'7385<f>',
'7220<er>',
'6877< w>',
'6582<the>',
'5922<he >',
'5904<an>',
'5857<,>',
'5711<p>',
'5697<b>',
'5536<y >',
'5474< m>',
'5464<n >',
'5412<, >',
'5333<r >',
'5168< h>',
'5024< the>',
'4819<nd>',
'4729<ou>',
'4720<. >',
'4641<ng>',
'4419<ed>',
'4399<o >',
'4328< o>',
'4264<k>',
'4104<re>',
'3965<I>',
'3871< b>',
'3869<to>',
'3779<ha>',
'3752<the >',
'3746<nd >',
'3744< the >',
'3640<ing>',
'3606<at>',
'3526<ed >',
'3459< f>',
'3458<.">',
'3456< i>',
'3412< I>',
'3393<en>',
'3374<er >',
'3352<I >',
'3291< c>',
'3288<on>',
'3246<e.>',
'3226<g >',
'3147<hi>',
'3116<ng >',
'3101< to>',
'3027<v>',
'3014<me>',
'2996<her>',
'2991< I >',
'2929<st>',
'2913<as>',
'2900<and>',
'2887< an>',
'2856<te>',
'2824<es>',
'2763<ing >',
'2760<ar>',
'2738<wa>',
'2723<to >',
'2699<se>',
'2613<is>',
'2576< l>',
'2570<or>',
'2569<it>',
'2554<ne>',
'2500<and >',
'2475<s.>',
'2464<ea>',
'2453< to >',
'2440< d>',
'2418<ot>',
'2352<ve>',
'2337<le>',
'2322< and>',
'2313< and >',
'2294< wa>',
'2275< p>',
'2210<sh>',
'2112<nt>',
'2102<d.>',
'2072<a >',
'2023<ho>',
'2005<ll>',
'1986< n>',
'1982<r.>',
'1976< he>',
'1971<al>',
'1969<as >',
'1963<f >',
'1948<d t>',
'1913<her >',
'1898< a >',
'1896<at >',
'1859<h >',
'1834<ow>',
'1825<ro>',
'1819<no>',
'1805<my>',
'1788< my>',
'1779<be>',
'1764<ti>',
'1756< ha>',
'1724<my >',
'1711< my >',
'1704<ad>',
'1698< in>',
'1698<oo>',
'1679< sh>',
'1674<li>',
'1663<of>',
'1646<ut>',
'1644<en >',
'1637<ld>',
'1637<t.>',
'1630<ther>',
'1613<l >',
'1596<e t>',
'1572< of>',
'1554<ai>',
'1548<e s>',
'1542< r>',
'1532<A>',
'1530<ri>',
'1524< e>',
'1521<ch>',
'1520<mo>',
'1505<om>',
'1497< be>',
'1482<e w>',
'1477<is >',
'1465<ee>',
'1464< g>',
'1463<ur>',
'1460<co>',
'1442<er.>',
'1434<was>',
'1434<in >',
'1431< was>',
"1424<'>",
'1423<us>',
'1422<lo>',
'1419<of >',
'1410< of >',
'1409<y.>',
'1405<w >',
'1402<hat>',
'1391<de>',
'1391<id>',
'1383<wh>',
'1381<sa>',
'1374<oth>',
'1357<la>',
'1356<was >',
'1355< was >',
'1354<thi>',
'1354<il>',
'1352< wh>',
'1349<re >',
'1338<we>',
'1327<un>',
'1324<wi>',
'1322<ke>',
'1318<ca>',
'1305< mo>',
'1297<hin>',
'1286<ay>',
'1250<ld >',
'1249< sa>',
'1244< y>',
'1239<hat >',
'1236<T>',
'1231<rs>',
'1229<n t>',
'1224<me >',
'1223<el>',
'1214<t t>',
'1212<gh>',
'1212<othe>',
'1211<n.>',
'1210<ma>',
'1206<ce>',
'1204<ut >',
'1196<ul>',
'1196<she>',
'1187< no>',
'1183< wi>',
'1182<ac>',
'1180<so>',
'1173<ly>',
'1172< in >',
'1167< co>',
'1167<other>',
'1165< on>',
'1161<pe>',
'1153<S>',
'1151<et>',
'1149< her>',
'1142<d th>',
'1140<fo>',
'1134<wo>',
'1124<e a>',
'1117<ta>',
'1115<ir>',
'1109<s a>',
'1108<si>',
'1099< A>',
'1095< me>',
'1086<k >',
'1085<ic>',
'1083<ra>',
'1083<ie>',
'1078<di>',
'1074< she>',
'1073<ad >',
'1065< st>',
'1049<yo>',
'1044<ere>',
'1040<his>',
'1037<ter>',
'1026<she >',
'1025< she >',
'1025<. I>',
'1015< we>',
'1014< thi>',
'1003<you>',
'996< yo>',
'993< you>',
'993<ll >',
'981<ck>',
'974<?">',
'972<e,>',
'967< so>',
'962<tha>',
'959<ver>',
'958< tha>',
'955< her >',
'950<m >',
'949<th >',
'943<bo>',
'942<ec>',
'942< fo>',
'941<am>',
'941<ther >',
'939<ol>',
'936<se >',
'932<es >',
'930<ge>',
'928<ed.>',
'917< wo>',
'915<s,>',
'910<s t>',
'904<his >',
'901< ">',
'898<d a>',
'898<hen>',
'892<ly >',
'889<st >',
'889<n th>',
'888<do>',
'887<an >',
'885<for>',
'884<e, >',
'883< T>',
'883<oul>',
'878<ould>',
'877<had>',
'877<uld>',
'873<all>',
'873<he s>',
'872< li>',
'868<on >',
'868< u>',
'867<" >',
'865<that>',
'864<ow >',
'864<s, >',
'864< that>',
'852<d s>',
'849<not>',
'848< had>',
'848<ry>',
'848<ed t>',
'844<An>',
'844<u >',
'843<hen >',
'843<e. >',
'838<Th>',
'836<d the>',
'836<had >',
'836< had >',
'828<or >',
'824< S>',
'812<out>',
'812<W>',
'811<ith>',
'808<ev>',
'806<, a>',
'806<g.>',
'803<?>',
'797<fa>',
'789<that >',
'788< that >',
'788<->',
'787<ould >',
'787< se>',
'786<uld >',
'783<e h>',
'782<y m>',
'781<ht>',
'780< ma>',
'779< re>',
'779<mot>',
'778<ght>',
'775<e th>',
'770<e b>',
'770< lo>',
'768<fe>',
'766<mother>',
'765< it>',
'764<wit>',
'760<e o>',
'759<ou >',
'759< mot>',
'759<thin>',
'759< wit>',
'758<moth>',
'756<other >',
'756<with>',
'756<e c>',
'756< with>',
'756<mothe>',
'754<eve>',
'753<And>',
'753<ig>',
'751<And >',
'751< mother>',
'750< ca>',
'747<our>',
'745< moth>',
'744< fa>',
'743< mothe>',
'742<rt>',
'742<ba>',
'742<e m>',
'742<ot >',
'742<s. >',
'740<n the>',
'738<tr>',
'728<ug>',
'726<. I >',
'724<ns>',
'723<r t>',
'722<t th>',
'721<ent>',
'720<ts>',
'718<t w>',
'717<d m>',
'716< as>',
'715<if>',
'715< do>',
'715<ab>',
'714<em>',
'714<ith >',
'711<hou>',
'710<ng.>',
'709<, t>',
'708<he w>',
'706<le >',
'703< for>',
'701<o t>',
'696< with >',
'696<with >',
'695<I w>',
'693<pl>',
'692<nd t>',
'686< not>',
'685<ni>',
'683<one>',
'679< di>',
'679<ear>',
'677<im>',
'677<t a>',
'676<. A>',
'675<e.">',
'670<ss>',
'669<ugh>',
'668<mi>',
'668<s w>',
'667< ho>',
'661<hing>',
'660< al>',
'655<op>',
'652<n the >',
'651<fi>',
"650<'s>",
'649<d,>',
'649<os>',
'647< k>',
'645<ve >',
'645<ere >',
'636< An>',
'635<au>',
'633< I w>',
"633<'s >",
'632<ey>',
'631<her.>',
'630<d to>',
'629<pa>',
'628<y mo>',
'627<ok>',
'627<av>',
'625<g t>',
'618<ng t>',
'617<d, >',
'612<fr>',
'610<it >',
'608<s s>',
'607<n a>',
'604< ba>',
'603<tt>',
'601<me.>',
'600<da>',
'600<es.>',
'599<nc>',
'598<d w>',
'598<d h>',
'597<H>',
'595<ome>',
'593<nt >',
'590<not >',
'589< hi>',
'589<s o>']

1000
Dictionary/freq-int.py Normal file

File diff suppressed because it is too large Load Diff

1001
Dictionary/freq.py Normal file

File diff suppressed because it is too large Load Diff

1185
Dictionary/kjvfreq.py Normal file

File diff suppressed because it is too large Load Diff

4946
Dictionary/names-f.py Normal file

File diff suppressed because it is too large Load Diff

3897
Dictionary/names-m.py Normal file

File diff suppressed because it is too large Load Diff

21986
Dictionary/names.py Normal file

File diff suppressed because it is too large Load Diff

366
Dictionary/oftenmis.py Normal file
View File

@ -0,0 +1,366 @@
words=['Wednesday',
'a lot',
'absence',
'accept',
'acceptable',
'accessible',
'accidentally',
'accommodate',
'accompanied',
'accomplish',
'accumulate',
'accuracy',
'achievement',
'acknowledgment',
'acquaintance',
'acquire',
'acquitted',
'across',
'actually',
'address',
'admission',
'adolescent',
'advice',
'advise',
'advised',
'affected',
'affectionate',
'aggravate',
'aggressive',
'alcohol',
'all right',
'allotted',
'allusion',
'always',
'amateur',
'annual',
'argument',
'arrangement',
'beginning',
'believe',
'business',
'capital',
'capitol',
'coming',
'committee',
'complement',
'compliment',
'decide',
'definite',
'desert',
'dessert',
'divide',
'embarrass',
'exaggerate',
'existence',
'explanation',
'financially',
'forehead',
'foreign',
'forfeit',
'forty',
'forward',
'friend',
'fulfillment',
'gauge',
'generally',
'government',
'governor',
'grammar',
'grammatically',
'grief',
'guaranteed',
'guard',
'guidance',
'happened',
'harass',
'height',
'hero',
'heroes',
'humor',
'hypocrisy',
'hypocrite',
'ignorant',
'illogical',
'imaginary',
'imagine',
'imitate',
'immediately',
'immense',
'incidentally',
'incredible',
'independent',
'indispensable',
'inevitable',
'infinite',
'influential',
'initiative',
'innocence',
'intellectual',
'intelligence',
'intelligent',
'interest',
'interpret',
'interrupt',
'introduce',
'irrelevant',
'irresistible',
'irritable',
'irritated',
"it's",
'its',
'knowledge',
'laboratory',
'legitimate',
'leisure',
'liable',
'library',
'license',
'lightning',
'literature',
'lively',
'loneliness',
'lonely',
'lose',
'lying',
'magazine',
'maintenance',
'maneuver',
'manual',
'manufacture',
'marriage',
'material',
'mathematics',
'meant',
'medicine',
'mere',
'messenger',
'miniature',
'minutes',
'mischievous',
'missile',
'morning',
'mortgage',
'muscles',
'mysterious',
'naturally',
'necessary',
'nickel',
'niece',
'ninety',
'ninth',
'noticeable',
'noticing',
'nuclear',
'nuisance',
'obstacle',
'occasionally',
'occur',
'occurred',
'occurrence',
'omission',
'omitted',
'opinion',
'opponent',
'opportunity',
'opposite',
'optimism',
'organize',
'origin',
'original',
'paid',
'pamphlet',
'parallel',
'particular',
'pastime',
'peculiar',
'performance',
'perhaps',
'permanent',
'permissible',
'personal',
'physical',
'physician',
'piece',
'planned',
'pleasant',
'poison',
'possess',
'possession',
'possible',
'possibly',
'practically',
'prairie',
'precede',
'preferred',
'prejudiced',
'preparation',
'prepare',
'presence',
'prevalent',
'principal',
'principle',
'privilege',
'probably',
'procedure',
'proceed',
'profession',
'professor',
'prominent',
'pronunciation',
'propaganda',
'prophecy',
'prophesy',
'psychology',
'publicly',
'pumpkin',
'purpose',
'pursue',
'quantity',
'quiet',
'quite',
'quizzes',
'realize',
'really',
'receipt',
'receive',
'receiving',
'recognize',
'recommend',
'reference',
'referred',
'referring',
'regular',
'relieve',
'remembrance',
'repetition',
'representative',
'reproduce',
'restaurant',
'rhythm',
'ridiculous',
'roommate',
'sacrifice',
'safety',
'salary',
'schedule',
'secretary',
'seize',
'separate',
'sergeant',
'severely',
'sheriff',
'shining',
'similar',
'simply',
'since',
'sincerely',
'skiing',
'sophomore',
'specimen',
'speech',
'sponsor',
'strength',
'strict',
'stubbornness',
'studying',
'subtlety',
'succeed',
'successful',
'succession',
'sufficient',
'suicide',
'summary',
'superintendent',
'supersede',
'suppose',
'suppress',
'surely',
'surprise',
'surround',
'susceptible',
'suspicious',
'swimming',
'symbol',
'sympathize',
'technique',
'temperament',
'temperature',
'tendency',
'than',
'their',
'themselves',
'then',
'there',
'therefore',
"they're",
'thorough',
'thought',
'through',
'till',
'to',
'tobacco',
'together',
'tomorrow',
'too',
'tournament',
'traffic',
'trafficked',
'tragedy',
'transferred',
'tremendous',
'tried',
'tries',
'trouble',
'truly',
'twelfth',
'two',
'tyranny',
'unanimous',
'unconscious',
'undoubtedly',
'unmistakably',
'unnecessary',
'until',
'usage',
'useful',
'useless',
'using',
'usually',
'vacuum',
'valuable',
'varies',
'various',
'vegetable',
'vengeance',
'venomous',
'vice',
'view',
'vigilance',
'villain',
'violence',
'visible',
'vitamins',
'waive',
'warrant',
'warring',
'weather',
'weird',
'where',
'wherever',
'whether',
'whichever',
"who's",
'wholly',
'whose',
'wield',
'wintry',
'withdrawal',
'woman',
'women',
'worshiped',
'wreck',
'write',
'writing',
'written',
'yield']

10196
Dictionary/places.py Normal file

File diff suppressed because it is too large Load Diff

354921
Dictionary/single.py Normal file

File diff suppressed because it is too large Load Diff

105
Passwordy/passwordy.py Normal file
View File

@ -0,0 +1,105 @@
import string
import random
import sys
DEFAULT_LENGTH = 32
DEFAULT_SENTENCE = 5
HELP_MESSAGE = '''
---------------------------------------------------------------
|Generates a randomized password. |
| |
|> passwordy [length] ["p"] ["d"] |
| |
| length : How many characters. Default %03d. |
| p : If present, the password will contain punctuation |
| characters. Otherwise not. |
| d : If present, the password will contain digits. |
| Otherwise not. |
| |
| The password can always contain upper and lowercase |
| letters. |
---------------------------------------------------------------
'''[1:-1] % (DEFAULT_LENGTH)
HELP_SENTENCE = '''
---------------------------------------------------------------
|Generates a randomized sentence |
| |
|> passwordy sent [length] [join] |
| |
| length : How many words to retrieve. Default %03d. |
| join : The character that will join the words together. |
| Default space. |
---------------------------------------------------------------
'''[1:-1] % (DEFAULT_SENTENCE)
def make_password(length=None, allowpunctuation=False, allowdigits=False):
'''
Returns a string of length `length` consisting of a random selection
of uppercase and lowercase letters, as well as punctuation and digits
if parameters permit
'''
if length is None:
length = DEFAULT_LENGTH
s = string.ascii_letters
if allowpunctuation is True:
s += string.punctuation
if allowdigits is True:
s += string.digits
password = ''.join([random.choice(s) for x in range(length)])
return password
def make_sentence(length=None, joiner=' '):
'''
Returns a string containing `length` words, which come from
dictionary.common.
'''
import dictionary.common as common
if length is None:
length = DEFAULT_LENGTH
result = joiner.join(random.choice(common.words) for x in range(length))
result = result.replace(' ', joiner)
return result
if __name__ == '__main__':
args = sys.argv
argc = len(args)
if argc == 1:
mode = 'password'
length = DEFAULT_LENGTH
elif args[1].isdigit():
mode = 'password'
length = int(args[1])
elif 'help' in args[1].lower():
mode = None
print(HELP_MESSAGE)
print(HELP_SENTENCE)
elif 'sent' in args[1].lower() and argc == 2:
mode = 'sentence'
length = DEFAULT_SENTENCE
elif args[2].isdigit():
mode = 'sentence'
length = int(args[2])
if mode == 'password':
punc = 'p' in args
digi = 'd' in args
print(make_password(length, punc, digi))
elif mode == 'sentence':
if argc == 4:
joiner = args[3]
else:
joiner = ' '
print(make_sentence(length, joiner))
else:
pass

View File

@ -0,0 +1,474 @@
/*
This theme created by /u/GoldenSights
*/
/*
Color palette:
ff4500 = Upvote orange
9393ff = Downvote blue
ac3939 = NSFW red
bcbcbc = Taskbar gray (188)
2d2d2d = Taskbar shadow
ffffff = Taskbar light
008080 = Background Blue
00007f = Title bar blue
228822 = Moderator Green
*/
#header,
body
{
background-color: #008080;
border-bottom: 0px;
}
#sr-header-area,
#sr-more-link
{
background-color: #bcbcbc;
background: #bcbcbc;
border-bottom: 2px solid #2d2d2d;
margin-bottom: 30px;
color:transparent;
}
#sr-more-link
{
color: transparent;
background-image: url(%%start%%);
background-repeat: no-repeat;
background-position: center;
}
#sr-header-area > div > div > span:nth-child(2)
{
background-image: url(%%taskbar-spacer%%);
background-position: center;
min-height: 30px;
}
#header-bottom-right
{
right: 5px;
width: 300px;
background-color: #00007f;
color: #fff;
border-top-left-radius: 0px;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
}
#header-bottom-right > span.user,
#header-bottom-right > span.user a,
#header-bottom-right > ul > li > a,
#header-bottom-right > form > a
{
color: #fff;
}
#header-bottom-right > span
{
color: transparent;
}
form.logout a:after
{
position: absolute;
left: 288px;
content: " ";
background-image: url(%%xbutton%%);
background-repeat: no-repeat;
width: 16px;
height: 14px;
}
.side
{
background-color: #bcbcbc;
width: 300px;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-left: 2px solid #ffffff;
padding: 4px;
}
#search > input:nth-child(1)
{
width: 300px;
}
form.toggle.leavecontributor-button,
form.toggle.leavecontributor-button,
form.toggle.flairtoggle,
.sidebox.create .spacer,
div.spacer,
.titlebox
{
color: #000;
background: #bcbcbc;
}
.side .titlebox .bottom .age
{
float: none;
content:'heyo';
font-size: 0px;
}
.side .titlebox .bottom .age:after
{
font-size:12px;
content:'on May 25, 2014';
color: #000;
}
.morelink .nub { display: none; }
.morelink a {color: #000;}
.morelink
{
z-index: 50;
border: 0px;
background: #bcbcbc;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-radius: 2px;
padding-top: 4px;
padding-bottom: 4px;
overflow: hidden;
font-weight: normal;
color: #000;
}
.morelink:hover
{
z-index: 50;
border: 0px;
background: #bcbcbc;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-radius: 2px;
padding-top: 4px;
padding-bottom: 4px;
overflow: hidden;
}
.morelink:active
{
border-bottom: 2px solid #ffffff;
border-right: 2px solid #ffffff;
border-top: 2px solid #2d2d2d;
border-left: 2px solid #2d2d2d;
}
.morelink a
{
background-image: url(%%web-32%%);
background-repeat: no-repeat;
background-position: 20px;
}
.morelink a[href*="?selftext"]
{
background-image: url(%%txt-32%%);
background-repeat: no-repeat;
background-position: 20px;
}
body > div.side > div:nth-child(5) > div > span.subscribe-button.fancy-toggle-button.toggle
{
display:block;
}
.titlebox .users-online:before{ background-image:none; content: ""; width: 0px; margin-right: 0px;}
.titlebox .bottom,
.titlebox .bottom a,
.sidecontentbox .title,
.sidecontentbox .title h1,
.sidecontentbox .helplink,
.sidecontentbox ul a,
.titlebox .tagline,
.titlebox .tagline .time,
.titlebox .tagline a
{
color: #000;
}
#header-bottom-left
{
position: inherit;
display:block;
background-color: transparent;
width: 500px;
left: 2px;
top: 9px;
}
#header-bottom-left .tabmenu a
{
position:relative;
background-color: #bcbcbc;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-bottom: 2px solid #ffffff;
bottom: 3px;
padding-bottom: 1px;
}
#header-bottom-left .tabmenu .selected a
{
background-color: #bcbcbc;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
border-bottom: 0px;
bottom: 1px;
}
.content .menuarea
{
margin: 0px;
padding: 0px;
background-color: #bcbcbc;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
}
#siteTable.sitetable.linklisting,
#siteTable.sitetable.linklisting .link,
#siteTable.sitetable.linklisting .link .buttons li a,
#siteTable.sitetable.linklisting .link .title a,
#siteTable.sitetable.linklisting .link .tagline,
#siteTable.sitetable.linklisting .link .rank,
#siteTable.sitetable.linklisting .link .tagline a
{
color:#000;
background-color: #bcbcbc;
overflow: hidden;
}
#siteTable.sitetable.linklisting
{
padding-top: 16px;
padding-bottom: 8px;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
}
.commentarea .panestack-title
{
padding-left: 8px;
overflow:hidden;
background-color:#00007f;
color:#fff;
margin:0px;
margin-top:10px;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
}
.commentarea .menuarea
{
padding-left: 8px;
border-top: 0px;
border-bottom: 2px solid #2d2d2d;
padding-bottom:5px;
}
.footer.rounded
{
border-radius: 0px;
background-color: #bcbcbc;
color: #000;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
padding-top: 0px;
padding-left: 0px;
padding-right: 0px;
}
.footer.rounded:before
{
background-color: #00007f;
background-image: url(%%xbutton%%);
background-repeat: no-repeat;
background-position: 462px;
padding: 3px;
display: block;
content: "Reddit.com";
text-align: left;
color: #fff;
}
.footer a
{
color: #000;
font-weight: normal;
}
.footer-parent .bottommenu,
.footer-parent .bottommenu a
{
color:#000;
}
#newlink > div.spacer
{
background-color: transparent
}
#newlink.submit.content .formtabs-content .spacer
{
margin:0px;
}
.roundfield,
#newlink > div.roundfield.info-notice
{
background-color: #bcbcbc;
border-right: 2px solid #2d2d2d;
border-left: 2px solid #ffffff;
color: #000;
border-radius: 0px;
width: 500px;
padding: 5px 10px 10px 10px;
}
#text-desc.infobar,
#link-desc.infobar
{
background-color: #00007f;
width: 500px;
color: #fff;
padding: 5px 10px;
font-size: 0px;
border-bottom: 0px;
border-right: 2px solid #2d2d2d;
border-left: 2px solid #ffffff;
border-top: 2px solid #ffffff;
}
#text-desc.infobar:after
{
font-size: 12px;
content: "Text Post";
}
#link-desc.infobar:after
{
font-size: 12px;
content: "Link Post";
}
#newlink > div.roundfield.info-notice
{
border-top: 0px;
border-bottom: 2px solid #2d2d2d;
}
.content h1 a
{
color: #000;
}
.comment
{
color: #000;
background-color: #bcbcbc;
overflow: hidden;
border-bottom: 2px solid #2d2d2d;
border-right: 2px solid #2d2d2d;
border-top: 2px solid #ffffff;
border-left: 2px solid #ffffff;
margin: 5px;
padding: 5px;
}
.comment .tagline,
.comment .tagline a,
.comment ul.flat-list.buttons a
{
color: #000;
}
.tagline a.author.submitter
{
background-color: #00007f;
color: #ffffff;
padding: 1px;
}
.tagline a.author.moderator
{
background-color: #228822 !important;
color: #ffffff !important;
padding: 1px !important;
}
.midcol .upmod
{
background-image: url(%%votearrows%%);
width: 16px;
height: 8px;
background-position: -16px 0px;
margin:0;
}
.midcol .up
{
background-image: url(%%votearrows%%);
width: 16px;
height: 8px;
background-position: -0px 0px;
margin:0;
}
.midcol .downmod
{
background-image: url(%%votearrows%%);
width: 16px;
height: 8px;
background-position: -16px -8px;
margin:0;
}
.midcol .down
{
background-image: url(%%votearrows%%);
width: 16px;
height: 8px;
background-position: 0px -8px;
margin:0;
}
.midcol .score
{
background-color: #fff;
}
.link .midcol .up,
.link .midcol .upmod
{
margin-top: 8px;
}
code
{
line-height: 18px;
padding-top: 3px;
padding-bottom: 3px;
color: #f00;
font-size: 15px;
font-weight: 900;
}
.expando .usertext .md
{
border: 1px solid #000;
}
a
{
font-weight: 900;
color: #00007f;
}
.submit_text
{
overflow: hidden;
}

21
RedditCSS/stylepusher.py Normal file
View File

@ -0,0 +1,21 @@
import bot
import os
import praw
import sys
import time
r=bot.rG()
SUBREDDIT = r.get_subreddit(sys.argv[1])
FILENAME = sys.argv[2]
prevtime = 0
while True:
newtime = os.path.getmtime(FILENAME)
if newtime != prevtime:
f=open(FILENAME)
style = f.read()
f.close()
print('Pushing stylesheet. %d bytes' % len(style))
SUBREDDIT.set_stylesheet(style)
prevtime = newtime
time.sleep(5)

6
SpinalTap/README.md Normal file
View File

@ -0,0 +1,6 @@
Spinal
========
spinal.py is a couple of tools for copying files and directories
spinal_client.py is a wip tkinter interface for creating and running backup configurations. I probably won't finish it.

260
SpinalTap/spinal.py Normal file
View File

@ -0,0 +1,260 @@
'''
-----:::
...-----------:::::::::
............---------:::::::,,,,
..`````````.......--------:::::::,,,,,
.```````````````...:vv,------:::::::,,,,,"
..``````````````````-zz+z:------::::::,,,,,,""
....`````` `````-zzzz:------:::::::,,,,,,"""
.....````` `````xzzx.-------::::::,,,,,,""""
---..::-````` ````,zzzz".------:::::::,,,_~~""""_
-----xzzzJ?~-``` `````_Jzzzzz~------::::::"vJonnnT"""__
------L+zzzzzz?".`````.:~xzzzzz+++J/":--:::,;Jooonnnn+"""___
:------/z+zzzzzzzxL??xzzzzzzz+++++++TTzJJJ+ooooonnnoL""""___
:::-------;J++zzzzzzzzzzzzzzzxxxJ+++TTTTTTToooooonT?""""""____
:::::-------~L+++++++++++z/,------"v+TTTTTooooooz/","""""_____
::::::::-------,vz+++++++z,----------"+TTooooooL_,,,""""""______
,,:::::::::------:L++++++x---------:::JooooooJ",,,,""""""_______
,,,,::::::::::::---?TTTTTTv:---::::::vooooooL,,,,,""""""________
,,,,,,,::::::::::::~TTTTTTT+xv/;;/?xToooooon;,,,,""""""_________
,,,,,,,,,,:::::::,zooooooooooooooooooooonnn+",""""""__________
""",,,,,,,,,,,,,,zoooooooooooooooooonnnnnnnn+"""""____________
"""""",,,,,,,,,,ooooooooooooonnnnnnnnnnnnnnn_""_____________
""""""""""",,,,,+nnnnnnnnnnnnnnnnnnnnnnnnZZT"_______________
____"""""""""""vnnnnnnnnnnnnnnnnnnnnZZZZZZ?_______________
________"""""""znnnnnnnnnnnZZZZZZZZZZZZZz_______________
______________JZZZZZZZZZZZZZZZZZZZZZZz______________
______________/+ZZZZZZZZZZZZZeeeeZ+/______________
______________;xoeeeeeeeeeeeeox;______________
_______________~vxJz++zJxv~_______________
______________________________________
________________________________
_______________________
________
'''
import os
import shutil
import time
BYTE = 1
KILOBYTE = BYTE * 1024
MEGABYTE = KILOBYTE * 1024
GIGABYTE = MEGABYTE * 1024
TERABYTE = GIGABYTE * 1024
CHUNKSIZE = 64 * KILOBYTE
# Number of bytes to read and write at a time
EXC_SRCNOTDIR = 'srcnotdir'
EXC_SRCNOTFILE = 'srcnotfle'
EXC_RECURDIR = 'recurdir'
# These strings will become the `description` attribute
# of a SpinalError when it is raised. Use it to determine
# what type of SpinalError has occured.
class SpinalError(Exception):
def __init__(self, err, desc):
super(SpinalError, self)
self.description = desc
def copyfile(src, dst, overwrite=True, callbackfunction=None):
'''
Copy a file from src to dst.
src : the file to copy.
dst : the filename of the new copy.
overwrite : if True, copy src to dst even if
dst already exists.
else, do nothing.
default = True
callbackfunction : if provided, this function will be called
after writing each CHUNKSIZE bytes to dst
with three parameters:
name of file being copied,
number of bytes written so far,
total number of bytes needed.
default = None
RETURN : [dst filename, number of bytes written to dst]
'''
src = os.path.abspath(src)
dst = os.path.abspath(dst)
if not os.path.isfile(src):
raise SpinalError("Source file is not a file: %s" % src,
EXC_SRCNOTFILE)
totalbytes = os.path.getsize(src)
dstexists = os.path.exists(dst)
if dstexists and overwrite is False:
if callbackfunction is not None:
callbackfunction(dst, totalbytes, totalbytes)
return [dst, totalbytes]
elif dstexists:
src_modtime = os.path.getmtime(src)
dst_modtime = os.path.getmtime(dst)
if src_modtime == dst_modtime:
if callbackfunction is not None:
callbackfunction(dst, totalbytes, totalbytes)
return [dst, totalbytes]
writtenbytes = 0
srcfile = open(src, 'rb')
dstfile = open(dst, 'wb')
while True:
filedata = srcfile.read(CHUNKSIZE)
datasize = len(filedata)
if datasize == 0:
break
dstfile.write(filedata)
writtenbytes += datasize
if callbackfunction is not None:
callbackfunction(dst, writtenbytes, totalbytes)
srcfile.close()
dstfile.close()
shutil.copystat(src, dst)
return [dst, writtenbytes]
def copydir(srcdir, dstdir, overwrite=True, precalcsize=False,
callbackfunction=None, callbackfile=None):
'''
Copy all of the contents from srcdir to dstdir,
including subdirectories.
srcdir : the directory which will be copied.
dstdir : the directory in which copied files are placed.
overwrite : if True, overwrite any files in dstdir with
the copies from srcdir should they already exist.
else, ignore them.
default = True
precalcsize : if True, calculate the size of srcdir
before beginning the operation. This number
can be used in the callbackfunction.
else, callbackfunction will receive
written bytes as total bytes.
default = False
callbackfunction : if provided, this function will be called
after each file copy with three parameters:
name of file copied,
number of bytes written to dstdir so far,
total bytes needed (from precalcsize).
default = None
callbackfile : will be passed into each individual copyfile() as
the callbackfunction for that file.
default = None
RETURN : [dstdir path, number of bytes written to dstdir]
'''
srcdir = os.path.abspath(srcdir)
dstdir = os.path.abspath(dstdir)
if dstdir.startswith(srcdir):
raise SpinalError("Will not copy a dir into itself %s" % dstdir,
EXC_RECURDIR)
if os.path.isfile(srcdir):
raise SpinalError("Destination dir is a file: %s" % dstdir,
EXC_SRCNOTDIR)
if precalcsize is True:
totalbytes = getdirsize(srcdir)
else:
totalbytes = 0
walker = os.walk(srcdir)
writtenbytes = 0
for step in walker:
# (path, [dirs], [files])
srcpath = step[0]
dstpath = srcpath.replace(srcdir, dstdir)
files = step[2]
if not os.path.exists(dstpath):
os.makedirs(dstpath)
for filename in files:
srcfile = os.path.join(srcpath, filename)
dstfile = os.path.join(dstpath, filename)
copied = copyfile(srcfile, dstfile, overwrite=overwrite,
callbackfunction=callbackfile)
copiedname = copied[0]
writtenbytes += copied[1]
if callbackfunction is None:
continue
if totalbytes == 0:
# precalcsize was not used. Just report the written bytes
callbackfunction(copiedname, writtenbytes, writtenbytes)
else:
# provide the precalcsize
callbackfunction(copiedname, writtenbytes, totalbytes)
return [dstdir, writtenbytes]
def getdirsize(srcdir):
'''
Using os.walk, return the total number of bytes
this directory contains, including all subdirectories.
'''
srcdir = os.path.abspath(srcdir)
if not os.path.isdir(srcdir):
raise SpinalError("Source dir is not a directory: %s" % srcdir,
EXC_SRCNOTDIR)
totalbytes = 0
walker = os.walk(srcdir)
for step in walker:
# (path, [dirs], [files])
path = step[0]
files = step[2]
for filename in files:
fpath = os.path.join(path, filename)
totalbytes += os.path.getsize(fpath)
return totalbytes
def cb(filename, written, total):
'''
Example of a callbackfunction.
Prints the number of bytes written,
total bytes needed,
and percentage so far.
'''
name = os.path.basename(filename)
if written >= total:
ends = '\n'
else:
ends = '\n'
percentage = (100 * written) / total
percentage = '%03.3f' % percentage
written = '{:,}'.format(written)
total = '{:,}'.format(total)
written = (' '*(len(total)-len(written))) + written
status = '%s %s / %s (%s)\r' % (name, written, total, percentage)
print(status, end=ends)

View File

@ -0,0 +1,77 @@
import spinal
import tkinter
class Path:
def __init__(self, src='', dst='', overwrite=False, precalcsize=False):
self.src = src
self.dst = dst
self.overwrite = overwrite
self.precalcsize = precalcsize
def __str__(self):
return 'Path: %s -> %s' % (self.src, self.dst)
class SpinalClient:
def __init__(self):
self.windowtitle = 'Spinal'
self.font_large = ("Consolas", 16)
self.font_med = ("Consolas", 12)
self.font_small = ("Consolas", 10)
self.t = tkinter.Tk()
self.t.title(self.windowtitle)
self.w = 450
self.h = 350
self.screenwidth = self.t.winfo_screenwidth()
self.screenheight = self.t.winfo_screenheight()
self.windowwidth = self.w
self.windowheight = self.h
self.windowx = (self.screenwidth-self.windowwidth) / 2
self.windowy = ((self.screenheight-self.windowheight) / 2) - 27
self.geometrystring = '%dx%d+%d+%d' % (
self.windowwidth, self.windowheight, self.windowx, self.windowy)
self.t.geometry(self.geometrystring)
self.panes_main = tkinter.PanedWindow(self.t, orient='vertical',
sashrelief='raised', sashpad=8)
self.panes_main.pack(expand=True, fill='both')
### FRAME_CONFIG ###
#
self.frame_config = tkinter.Frame(self.t)
self.button_configload = tkinter.Button(self.frame_config,text='Load')
self.button_configload.grid(row=0, column=0)
self.button_configload.configure(bg="#6fd5f6",
activebackground="#6fd5f6", relief="flat", width=4)
#
self.enter_configpath = tkinter.Entry(self.frame_config)
self.enter_configpath.grid(row=0, column=1, sticky='nesw')
self.enter_configpath.configure(font=self.font_small)
#
self.button_configsave = tkinter.Button(self.frame_config,text='Save')
self.button_configsave.grid(row=0, column=2)
self.button_configsave.configure(bg="#76E22E",
activebackground="#46E22E", relief="flat", width=4)
#
### END FRAME_CONFIG ###
### FRAME_PRIMARY ###
#
self.frame_primary = tkinter.Frame(self.t)
self.paths = []
#
### END FRAME_PRIMARY ###
tkinter.Grid.columnconfigure(self.frame_config, 1, weight=10)
self.panes_main.add(self.frame_config)
self.panes_main.add(self.frame_primary)
def mainloop(self):
self.t.mainloop()
def add_pathline(self):
if __name__ == '__main__':
s = SpinalClient()
s.mainloop()

27
SpinalTap/spinaltest.py Normal file
View File

@ -0,0 +1,27 @@
import spinal
import os
def catchexc(function, fargs=(), fkwargs={}, goalexc=''):
'''
Call function with *args fargs and **kwargs fkwargs,
expecting to get an exception.
If the raised exception has the description == goalexc,
we got what we wanted. Else (or if no exception is raised)
something is wrong.
'''
try:
function(*fargs, **fkwargs)
raise Exception("This should not have passed")
except spinal.SpinalError as e:
if e.description != goalexc:
raise e
if __name__ == '__main__':
os.chdir('testdata')
spinal.os.remove('dstfile.txt')
spinal.copyfile('srcfile.txt', 'dstfile.txt', callbackfunction=spinal.cb)
spinal.copyfile('srcfile.txt', 'dstfile.txt', callbackfunction=spinal.cb)
spinal.copyfile('srcfile.txt', 'dstfile_no_overwrite.txt', overwrite=False, callbackfunction=spinal.cb)
spinal.copydir('.', '..\\t',precalcsize=True, callbackfile=spinal.cb)
catchexc(spinal.copyfile, ('nonexist.txt', 'nonexist2.txt'), {'overwrite':False}, goalexc=spinal.EXC_SRCNOTFILE)
print('You did it!')

1
SpinalTap/t/dstfile.txt Normal file
View File

@ -0,0 +1 @@
Test data.

View File

@ -0,0 +1 @@
This won't be overwritten by srcfile.txt

BIN
SpinalTap/t/largerfile.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

1
SpinalTap/t/srcfile.txt Normal file
View File

@ -0,0 +1 @@
Test data.

View File

@ -0,0 +1 @@
submarines

1
SpinalTap/testdata/dstfile.txt vendored Normal file
View File

@ -0,0 +1 @@
Test data.

View File

@ -0,0 +1 @@
This won't be overwritten by srcfile.txt

BIN
SpinalTap/testdata/largerfile.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

1
SpinalTap/testdata/srcfile.txt vendored Normal file
View File

@ -0,0 +1 @@
Test data.

View File

@ -0,0 +1 @@
submarines

View File

@ -20,6 +20,8 @@ while True:
break break
url = item[7] url = item[7]
if 'youtube.com' in url and '?v=' not in url:
continue
cur2.execute('SELECT * FROM totaldl_urls WHERE url=?', [url]) cur2.execute('SELECT * FROM totaldl_urls WHERE url=?', [url])
if cur2.fetchone(): if cur2.fetchone():
continue continue

View File

@ -63,7 +63,7 @@ if DOWNLOAD_DIRECTORY != '':
class StatusExc(Exception): class StatusExc(Exception):
pass pass
def download_file(url, localname): def download_file(url, localname, headers={}):
localname = DOWNLOAD_DIRECTORY + localname localname = DOWNLOAD_DIRECTORY + localname
if 'twimg' in url: if 'twimg' in url:
localname = localname.replace(':large', '') localname = localname.replace(':large', '')
@ -72,14 +72,15 @@ def download_file(url, localname):
print('\t%s already exists!!' % localname) print('\t%s already exists!!' % localname)
return localname return localname
print('\tDownloading %s' % localname) print('\tDownloading %s' % localname)
downloading = request_get(url, stream=True) downloading = request_get(url, stream=True, headers=headers)
localfile = open(localname, 'wb') localfile = open(localname, 'wb')
for chunk in downloading.iter_content(chunk_size=1024): for chunk in downloading.iter_content(chunk_size=1024):
if chunk: if chunk:
localfile.write(chunk) localfile.write(chunk)
localfile.close()
return localname return localname
def request_get(url, stream=False): def request_get(url, stream=False, headers={}):
global last_request global last_request
now = time.time() now = time.time()
diff = now - last_request diff = now - last_request
@ -87,8 +88,10 @@ def request_get(url, stream=False):
diff = SLEEPINESS - diff diff = SLEEPINESS - diff
time.sleep(diff) time.sleep(diff)
last_request = time.time() last_request = time.time()
req = requests.get(url, stream=stream, headers=HEADERS) h = HEADERS.copy()
if req.status_code != 200: h.update(headers)
req = requests.get(url, stream=stream, headers=h)
if req.status_code not in [200,206]:
raise StatusExc("Status code %d on url %s" % (req.status_code, url)) raise StatusExc("Status code %d on url %s" % (req.status_code, url))
return req return req
@ -188,6 +191,24 @@ def handle_gfycat(url, customname=None):
pass pass
def handle_vidme(url, customname=None):
if customname is None:
customname = url.split('/')[-1]+'.mp4'
pagedata = request_get(url)
pagedata = pagedata.text
pagedata = pagedata.split('\n')
pagedata = [l for l in pagedata if '.mp4' in l and 'og:video:url' in l]
pagedata = pagedata[0]
pagedata = pagedata.split('content="')[1].split('"')[0]
pagedata = pagedata.replace('&amp;', '&')
headers = {'Referer': 'https://vid.me/',
'Range':'bytes=0-',
'Host':'d1wst0behutosd.cloudfront.net',
'Cache-Control':'max-age=0'}
return download_file(pagedata, customname, headers=headers)
def handle_vimeo(url, customname=None): def handle_vimeo(url, customname=None):
name = url.split('/')[-1] name = url.split('/')[-1]
name = name.split('?')[0] name = name.split('?')[0]
@ -332,6 +353,7 @@ HANDLERS = {
'imgur.com': handle_imgur, 'imgur.com': handle_imgur,
'gfycat.com': handle_gfycat, 'gfycat.com': handle_gfycat,
'vimeo.com': handle_vimeo, 'vimeo.com': handle_vimeo,
'vid.me': handle_vidme,
'liveleak.com': handle_liveleak, 'liveleak.com': handle_liveleak,
'youtube.com': handle_youtube, 'youtube.com': handle_youtube,
'youtu.be': handle_youtube, 'youtu.be': handle_youtube,