reorganising folders (all source in src)
--HG-- branch : sandbox
This commit is contained in:
365
src/gui/bottier.py
Normal file
365
src/gui/bottier.py
Normal file
@@ -0,0 +1,365 @@
|
||||
# Copyright (c) 2008 Andreas Balogh
|
||||
# See LICENSE for details.
|
||||
|
||||
""" decode ASCII greyscale """
|
||||
|
||||
# system imports
|
||||
|
||||
import Tkinter as Tk
|
||||
import logging
|
||||
from StringIO import StringIO
|
||||
from PIL import Image
|
||||
from PIL import ImageTk
|
||||
|
||||
# local imports
|
||||
|
||||
# constants
|
||||
|
||||
# globals
|
||||
|
||||
LOG = logging.getLogger()
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format='%(asctime)s.%(msecs)03i %(levelname).4s %(process)d:%(thread)d %(message)s',
|
||||
datefmt='%H:%M:%S')
|
||||
|
||||
CODE = "#MWmBEKNQkAbqXHgUFRhdwp8&aDGVZ9utO03CYvlrI=i<7+?}(*[/|;!^-~`,:. "
|
||||
|
||||
def main():
|
||||
tkis = []
|
||||
# build gui
|
||||
root = Tk.Tk()
|
||||
root.title("bottier")
|
||||
bu1 = Tk.Button(root, text='Quit', command= root.quit)
|
||||
bu1.pack(side = Tk.BOTTOM, padx = 5, pady = 5)
|
||||
for s in (PIC1, PIC2, PIC3, PIC4, PIC5):
|
||||
im = ascii2img(s)
|
||||
tki = ImageTk.PhotoImage(im, gamma = 2)
|
||||
tkis.append(tki)
|
||||
la = Tk.Label(root, image = tki)
|
||||
la.pack(side = Tk.RIGHT, padx = 5, pady = 5)
|
||||
|
||||
root.mainloop()
|
||||
root.destroy()
|
||||
|
||||
def ascii2img(s):
|
||||
# create the image
|
||||
# lines = StringIO(s).readlines()
|
||||
# height = len(lines)
|
||||
# width = len(lines[0])
|
||||
# im = Image.new("L", (width, height))
|
||||
im = Image.new("L", (100, 100))
|
||||
for y, line in enumerate(StringIO(s)):
|
||||
for x, c in enumerate(line):
|
||||
im.putpixel((x, y), CODE.find(c) * 4)
|
||||
bbox = im.getbbox()
|
||||
bbim = im.crop(bbox)
|
||||
imx2 = bbim.resize((bbox[2]*2, bbox[3]*2), Image.ANTIALIAS)
|
||||
return imx2
|
||||
|
||||
PIC1 = """\
|
||||
BEmmmBBBBBNNEBBEEKBBHd&aDGapHNBEBBBBEKBEmBBEBBKgdp8wdRbEBKEEEEENKQNAAbbXUp8aD9
|
||||
BEBBBEKENNNEBEEKEEmAd8DZVG&RkEBmBBEEKBBBmmmmBBmbh&Da&wFQBmmmBmBmmmBWmmmBmmmBmm
|
||||
mBBBBBEKNKKKKKKENBkh8VVZGDwXNEBBBEEBBBBBmWmmmmmEgwaDGDpFKBBmmmmmmWmWWmWWWWWmmW
|
||||
EEBBKBEKNNKNEEEQEER&VZ99V8gNKBEBBEBEBBBmmmmmmmmWqh&DVGawqmEmBmmmmmBWmWWmWWMWWM
|
||||
KEBKEEKNKKKKKNNNBqG9OOtuGhAKEEEEBBBBBBBBBmmBBBmmEgwaDaa8RNBBBmBBBmmmmWWmWMWWWM
|
||||
BBBBENKQNKENNQNNmRu0003taXNKKEKEBEEBEBmmBBBmmBBmmNF8aDDawXKmWBBWBmmmMWWmWWWMMM
|
||||
EKEBKNkQNKNNNNQNBRO333YO&bQNKKKKBBBmWMWWMWWmmmBmmWAR8VGG&hbBmWWmmmWWWWMMMMMMMM
|
||||
NKEENAAkNKNkQNkKQ&3YYvvO&AKEEEBBmWWMMMMW#MMMMMMMMMWEgpGGDawbBBmBmBWmmWWWMWMWMM
|
||||
NKEKkAkkKNKkQQkKXZClrIv3DbNEWMMMMM#MMM#MM#MMM#MMMMMMmNgZZGVwEmBmmmWmmmmmWWWMM#
|
||||
QNQkkQQkNQQkkAkERtYr=Il3VHKWMMMMMMMMMM#M#MMWMMMMMMMMMEAdZVZREEmBBmmWmmmmmWWWMW
|
||||
kbkbAkQkNQQAkkQEpOv=i=rY9hBWWMWMMMMMMWMMBABmWMMWWWWMWWN899VdKEEBBmmmWmBBmmmWWW
|
||||
AbbbbkkkNQbbAQQNDCrii=Iv9dKmMMMMMMMMWWWmBXAKEmKghFQmMMBqVt9&QEEBBmBmmBBmmmmmmm
|
||||
bqqXXAkQNAqqXbQAG3I<<iIvOpEWMMMMWMMWWmEAAwdHXdpwdhRNWmBKp3tDqEEBKmEBmBmmmmBmBm
|
||||
qHgHHAbkkAXgHHAXZli7<i=l38EWWWMMMWmBAhhpwRdhRUgUgHHNmBQUCYOGUKEEBKBBBBBBBmmBBB
|
||||
XggUUXbkAqgUUUkguli7<<ir3DKmMWWWWBkggHggqXXbXXqHgbbbbAXGYGO9dQEEEEBmEBBmmBBmBm
|
||||
FhhRdFqqAqRRUFkFOr=<7<irCaNWmMWWmQqHbXggHFUddHgggHRgHFdOGaCt&ANNEmEBEmBBBBBmmB
|
||||
UUFddhgbqgRFFUAR0ri<++iICDkmmmmmKAbURRgFa8DpRdRwRRdqbqUUdYv0GbKKEEEKKBEBBBBBmm
|
||||
RFFdwpFXXUhdFUkhOIi77+<ICGQmmBKkUHHwgpR&hw8h&ahUqbqbg8Rd0lv3ZXKKKKKKKNKEEBEBBB
|
||||
hhdhwwRgUhhdhFbh3=<++7<il9kBWmEbXgRRGDut0tuDVDwaagbHARw0IIr3ugQNNNKEENNKEBEBBm
|
||||
8phhppwwdwwwhhqwYi7?+++7i0HEmBKbHhhZOO3v3u0O9VpDuaXUaOlIIIrCuUkNNQNKKKKEEBmEEB
|
||||
aDDa&8pwpppppdXdvi7++???<YaXAQKEKKgGtO3Y33Y0tZGDuDhdZCI=IIlCuUkNQNNNKEEBBBEEEE
|
||||
GVZVVVa&8w&&&8gwv<++?}}(+ICaHEEKEBNHwD900Cvvl0VaGwHwuv==I=IvtFkQkNQQNEEKKEEEBE
|
||||
ZZt99OuVVGGGGaRdvi?}???}}<iC8NBKEBBba&aDDVVGa&wFbEA&Ori===rvtUkkQNNNNEKEKEEEEE
|
||||
ttO0030uuu9ZZGahY<+?++?}}?+I0hKEmBENFVOrl3t&wRNBEKFD0IiiiIrvtgAkQNNNNNKEEEEEEE
|
||||
3033YYY3C333OuVF3<}}+++}?}}7rOHBEEKkHaCiiI0DwkBmBBbVv=i===rvtgAkQQQQKNENKKKEKK
|
||||
YYYvvrvvvlvrrrthZ<(?7+?+}?}?+lDQKBEQhaY==ru&XEBBBKptlrIlrIrYZHAkkQkQNNNNNKKNNN
|
||||
Ylll===llr=I=Il9a=}(((((**[}?=OUkBBNUVli=twAKBBENUuvlrlvvrrCZXAkAkkkkQQQQNNKNN
|
||||
I=II<7+=r=i=i=It&=([////*[}?}7IZUAkHUUlrY9dqXQKAdpZlrrvvYlrYaqAAAAbQkQQNQQQNKK
|
||||
<77+}}}+7i7+77I0G7*/|;|||*?????ItG&wdGCCttDpRUh8030YI<rCCvl0RqqbbAbkkkkkkQNNNN
|
||||
+??((((?+??+???OO}/;!;!;|}<+?}?7rCvvvlCC3COOO0ClI=Ili+irYvYVHqbbAbbQQkQQQQNNQQ
|
||||
?(*[[/[*}}*(*(+Vr*/;!^^!*7<<?}?7<rvlrIrr=IllvvrIi=il=?<=rl3hXXHqbbbAAAAAkQkkQQ
|
||||
([/;///|*[*(*}=V<*/;;;|(i=i7?}}}?+<<<<7+<7iI=i===iIYv7+iIltUHXXXqqbbAAAkkQQQQN
|
||||
/;!^^!;^;!||[*r9?[|//*?II<7+?((???777+}(*(??++<<i=rvYI77rvZUHgHXXqXAAAkAkkkNNQ
|
||||
;|^~-------^!!79+*/[(<==<<??}*[[**}??+***}}?++<<i=rY0trirvGgHHXXHXqAbbkAkkkkNQ
|
||||
!-~~~`~~~```~~*t<(}}<rI=7?++}*|;|/[(+?*/[[(*}?+77i=C09uYlY&gXqXXXXqqbAkkkQNQNQ
|
||||
~`,`~,,`::.:,:^tI+?<rvY7+7=lr<|^!;;[?+*|[*[***}?+7i<ltVZ30hHXXXXXbbbAkkkkkQkQN
|
||||
,::::::..,:.::~CC<+<lr7}?rY3O9=!^!|[*(/||[//|[*(}?77r99Vu9RXXXXHXXbAAkkAQQNQNN
|
||||
:.......:,`:.:,=0i77rr+?OZ&&aGO(^;|[([|;|////|/[*}+i0ui++=38Z&hgHHqbbbkAkQQQQN
|
||||
....::..`,`,::`lOi+?7I=+3DD&Z8ZY///[[|!;!!;||||[[(+Y0=7++=p03Cu3Y0DUbAkkQNNQNk
|
||||
....::,.:. `.:,<tr+}(+=rC8a&GY+////|;!!!!!;|/|||[*}IY33CYa0YviI0u33gkkQQkQNNNN
|
||||
:.............:[Or<}}(}+=a37}(*[/|;!^!!;!;;/[[*(}+irrt8UgdD9ZutO00RAAkNkQNKKKK
|
||||
,:::.:.:::.:,``v9l<?((*[*((*[/[/|!;|;!!;|//*(+7<=rYODapFgUHbQqhG9FbAQQkKNNNNKK
|
||||
,`,`:::``,,~`-!Otl<?(*[///[/||||;!;||!||[((}?7ilY0t9uDRgggHHqqqqqbkkNkQQNNKKNN
|
||||
!``~,,,----`~~-Z9ri+([[/[[[//||;;!;;;!|!//*(}?7=IlvC9hHgHgXbqqqbbAkQNNNKKKKKKK
|
||||
/!!!!^^!|!;;!;*aVl<}*[[[**/|;;;!;;;|!;!//[(?++<iiIl0aFgggUHHbqqbAANkQNNNKEKEEK
|
||||
}([;;|/;[/|/[[+pZv<?}(([(*[|;!!;||!|;;;!||[*+7<iirC9RFggUHHHXbbbkkNNQQKNEEEKKE
|
||||
7?}**/*//|/[**?aGvi+?(*(**|;!;;!;/||;||;;/[*}+<IlY3GUgHHUHHqbbAkkkQkNNKKNKENEE
|
||||
77++??}***((}(7&Dv=7?(**|||||;;;;;!|/|||||/*(?irYCtpgggUgXbHXAAAQkNKNNNNNNKKEE
|
||||
I=<<i<<+++?+++<p&Oli+(*[[|||||/|;;;||||//**[*?irYOaFHHXHXXqXqAAkkQkQNKNNNEKEBE
|
||||
rIIIIIi<7<=<77<p&tCI<?}([[[|//////|||//[[((}}+7ICZdXHXXXqbbbAbAkANQQNNQQQKEKEB
|
||||
3ClrlI<<<r=<<7rh&tvri7?}***/**/[[[[**[(*((?+++iv9pUHXXqqbbbXAAAAkNQNQNNQNNKEKB
|
||||
0Yrlvi<=i=rrI=ZRG0vI=<+?}?(***[((?}?((}}++77<=vupFqbXqAAkkkkkAkAkQkkQkNKNNKKEm
|
||||
O0YCCIiIrvYY3VRau3r=i7+??}(***(*}?}}??+77<<=lCOGpUqbbbAbAAQQQkAkkkQQkNNNKNKKKE
|
||||
tu0CCYrlllCODFaV3vIi<7++?}?}***(?7?}}?}<7iIrY3uVadqAbAAAbAkNQNQQQkQQNQQQNNQKKE
|
||||
ZtO30YYY33OVU8ZuClI<7???}??((*(}<r=+++++<=rv30t9ZagqbAAAkkkkkQkQNNNKNNNNNKNNKK
|
||||
DutOttu99u9Uq89O3vr<<777??}}(*(?7i<+7?7<iIlvYC0OuGdbbAbAAAkQNNNKNQKNKNNNNKNKKE
|
||||
&DVV9GaDGDhBWmBkFVYIiii<77+?}((}}++++?7<=rYY00OOOZwAkQQAAkQNNKNNEEKNNKBKEEEEEE
|
||||
d&aa8&8&8hNBBEBWBBEKXp90vll=i<i<i<i<i==lvC0OtuZagEMMNNkQkkQNNNNEKEEKEEKBBEKEBE
|
||||
Rwppw&DDdAMWWWWBbAbXEkEEEEENbqHUhdd8wFFgqQNBBWWmmEBMBKNNQNNNNNKEKEKKEKBEBBBBmB
|
||||
URwwpw&pqmWmNBBNEKbFQUqbFQUXAgNAkEkgXKBEBEENENKQKKW#MEQNQQNNNNEKEEKEBBBBEmmBBm
|
||||
gRhdhRhqmQghqHQNBAKANHXkgkgHAhAHHQgQbqQqBkEKBNKQEBmmMMKNQQQNNKEKKEBBEBEBBBBmBm
|
||||
gFFFRdwFkXaZOtuwgAQBBAAQXBbbKXEAqQXKAQQABQBNEBBNBmWENAkQNNQNNKEEEBBBBBBmBmBBBB
|
||||
bgRRUhdFNUa9OYvlvpFbQWWmEQQKbXQEkkENbBmNEmEBmBWWkNkgawXNQQNNNKEENKBBEEBBmBmBmm
|
||||
AAqXggHqKRDu0CvvvlvpKmQNNQkAbbbkAkQkQkNKKKNNNNKWBqGZG8gQKNbkKKKKEEEEEBWmBBBBmm
|
||||
kkkAbAAKkwGt3YYlvYCdKNgDu9u99ttV99GVZG&D&&GVZ9ZkKGu99&RQNNNNNEEKKKEKEEBmmBBBBB
|
||||
QKQQQkQEgaVt0CvvY3DKkV9u9uVVVtuu9ZVGDDDaDGZ99ut8Bqtt9DwbQNKKEKKEKKEEEEBBBmBEmm
|
||||
NNENNQEAhGZOCvYvvtbN&u9VDa&DDVGGapp88p8p8&DZuO0tgK&ttV&gNNKNNKKEKKEKKBEBBBBBBB
|
||||
NKKQQKKg8Duu0YvY3FNhuZVGD&ppwdhRggUUFUFdp&GuO00OZNNVuVahANKNNKEEEKEEEEBEBEmBBB
|
||||
KKKKNBbR8GZt0YCCpNUttuZZG&hFHqbbbAAkqXgwaV99ttO0OwBXu9&wqNEKEKEEKKKKNKKEBEBEBB
|
||||
KEEKEEXRpaVuO33VNqu0tuZVDadHAQKNNNNKNXhpDZZutOO00uABpVGwgNEKEEEEEKEEKEEBBBmmmE
|
||||
NNEEWMBQFwaGuuaQku0t9ZVa&pRXEBmBWWBBQHRpDGuutOO000aEKaawqBEEEBBBEKKNKEKEEEEBmm
|
||||
bkEEWWWWWWBQUgNbaOOOuZGDawUbKKNKNEmEbghw&DV9ttt0OO9XEghNWWEEEBBBBEENNKEEEEBBBB
|
||||
AqkKmBmmmMmmmBmEbdGVGGG&8dgkNNQNNNEmAUhp&DGV99u9VV&HWWmmmWBEKBBEEKEKKEEEEEEBBB
|
||||
7IYuG8wUHXqAQNKKNNENqRwdhFHNNKKNNNKmKXgRw&&&a8hbEBmmEBBBBmmBBEBEKBEEKEEEEBBBEm
|
||||
"""
|
||||
|
||||
PIC2 = """\
|
||||
*[}7[/*7+//|[i[/[(i+il0uDahFHXqqbAkkNEKkkNEEBmBBBKQkQAAQKBBEBBBEBENEKEKEEBEBBB
|
||||
<<++??+?(}}?}??+i====Ii+([/[/|*(}??+7=ii=il3VdgbkkNQkQkkkkNNNNNQNKNNEQEmmEEEEm
|
||||
<<77+++++?}???+<i=IrlI<7}[/|;/(*}?++7<===rY0GRqAAQkQkkkkkQkQQNKKEEKKEKBBEBEEBB
|
||||
?+??++??????}?+7<=IrlrIi+([[[[[*}???+iIiIIvOaFXbkkkkNQkkkkkNQQQNKKNNNKKBEEEBmE
|
||||
}}?}}?}}}((}(?777iIrlvri7}*[/[/**[(?7<ii=rYt&UHbkAkkkkAAAkKkQQNNNKKNNNEKEEEEEB
|
||||
((((((}(}}??+++7<=rvlvlIi?(*[/*[**(??7==IrYt8gXbkbkkAAkkAAQAQNQQNNQQNNNKEEEEEm
|
||||
*(((***}}}???7<<i=IIvllrIi+}*[/*[(}+<<i=rv3ZpUXbAAAkkAbAkkQkQQQQkQNKKKNKKEEEBW
|
||||
[*****}}}???+++<==Irvvvvl=<7}((*((??+iiIrv0VwgqbAAAbAAbAAAkkkkkkQQQNKQNKBBEKKE
|
||||
*}}**(((}}(+77<<<=IllvCCYlIi+?((??+++i==Il0VwHqbkkkAbAAAkkbkkkAAkkkQKKNKNNKEBB
|
||||
/[**(}}}}?}++++7iIrrlv333CYli7?}(}++7<iirvOVwHbAAAbAkkkkkAkKQAAAkkkKKKKKKEEEBB
|
||||
[(****((}??????7iIrlY330OO03ri<?}??+7i==rvtDhXbqbkkAAkkkkNNQQQQQQQQQNQNEEEEEKE
|
||||
[(**[/[((*((??++<IrvvC3Otuut3lI<77+7<i==rYODhHqbAAAQQQQkkNNQNQkkQQQQKQQKKEBEEB
|
||||
*[**[[[***((}}}?7=rrYC00Ot99O0Y=<<<<ii=Ir3u&FHXbkQkQQQQQkQkNNQkkkkkQkKKKNKKKKE
|
||||
||[*[[**[[**}}??+<=llCC0Otuu9t0vlI=ii==rv0ZpUXbAkQNNNNNQkQQQQkkQQQQkKNKNNNNKKE
|
||||
[|//[**[*(*}}}?++?<IilvY3Ou9ZZO0Cvr===lvY3DdgbAAbNQKKNkkQQQNQQkkQNKQkQkQQNEKKN
|
||||
^!;||[*[[/[**(}}}++7<iIlCOu99ZVu0ClIIrrrvtaRXbbkQQNkQNNQkQNQkQkkQQQNQNNNKEKKEB
|
||||
-!^!!||;//[**(??}}??+<irY3O99ZaG9t3YrrlvCt&FqbbkkNQkNNNQkQQNQQkQQkQNNENEEBEEBW
|
||||
-^!^^!;;///[[*(((***??<Iv3u9ZVGDGu03CYYYOVdgqbkQkNNkNQkQNQNAQQQQNKKENEEKKKEEEB
|
||||
~--^!;!!|||;|/[**[*(}?7=l0u9VZD&DVuO3YY3tGRXbAQNQQNkQQkQKKQkQQQkQNNQNKKKEEBBmK
|
||||
`-~-^!!!!;;|/[[[***(*?+=v0tu9VGa&aZt03Y0t&hHbkkQQNNkNQQNNQkkAkAkNNNNNNEBBEBmBB
|
||||
-~~~~-^^!;!||[[[[[***(+ilOZZuuuZVV9utOOuVpFHbkQNQNQNNQQNQkQAAkQQQkQQQNKEEBEEBE
|
||||
,,`~~--^!^;!|||//[[*(}+ICuVuCr=rYC330Ou9VwhFHqAAQkkkkkkkQkAAbQQQQQNQNNNKEBEEEK
|
||||
,```~~-^^;!;;/////[*(+<ltVZOr7}((}+7<irC0ZaphUqqXHHHXbkAbbAQAkQQQkkQQQNEEEKKBB
|
||||
::`````---~^;|||[*(??<lOZZt3I7?*[////[}+i=Y09awdwaG&whFUgXXbkbAkQQQQkNNKKKEKEE
|
||||
^:,``~~~~~^^^;||[*(?<r3u9u0v<((*/||//[/*(?7IOD8Dt33C0t9Ga8phFFgXqqbAQNKKKKKKEE
|
||||
.. :,`-~^^-^;|||[(7rY0ut3v=}(*(/|////[/(}iO8d89YvvYvvYCC3OtZDaphUgHXkQNQQNKBE
|
||||
[:::,`~~``--^!;|[(7IC003Y=7?(*//|||/[*[*}itphdDYiI303vlvYCvCCYC3t9ZDwFUHXbkNKK
|
||||
,:.::,`~~`---!;|[}<l0CYvr<?}([[[/////*[}It&hpZCI=IC3Yrl39uO3lIii=IIrC3uVpFHANE
|
||||
..:::::`~-~-^!;|[*?ilvvvr=<7}(([[*****}70&p89Y=ilCllIiICtu990vI=<7<=<==YOGRAKK
|
||||
.,::::,`~~~--!;;/[(?iIvYvlrIII7?+}}}(?+Caw8ZC=iIvvI<++<=Iv0tttOYlI===irY3VFQKB
|
||||
.::,::,`~~----^!;[(7==IrlvvvCvvllrrlrvOD8a9Yi<=vvl=i+}}?+<rCCtttO03vIrv0GRAKEW
|
||||
`:,:,,```~-^^!!;[(+<++<=lYC303C03OtttuVDVu3Ii=lYvl=r=<7<i==rvCOu9Zu0333ZdqKEBB
|
||||
:,```~~~^-!^;;|[*}+<+??7=vCOZGDVGGGVVVZttOCvvC3CrlO9u033OOtO0Otu99ut309hbNKEBB
|
||||
,~------^!;;///*}?7<77+irYOZawwRFgHgFhp&aGZuuuO3COZVVZ999uuttOOOO0330ZdXQEBBBB
|
||||
^^!^!!!^!|*[[((}?+<<iirlYO9apwwhHANKKNQAAUFhp&GGt9Zu0YvvYvvrrrlrlCC0ZRqNEEEKEE
|
||||
!;;;||||/[*(?}+77i==rlY3tV8wwpdUHXbkQKNKKKEKQkbgRdp&Vt03YlII====IYOGFANEBBEEEm
|
||||
;;|/[[[**}(+++7i=rlvY0uVD8wp&wdFHqqXXbAAAAKBmmmmWBQbgRpaG9tC3YvvCOGdXQEBBmBEBm
|
||||
/**((}?}?++<<Irlv300uZD8p8aa&wUqXqqqbqbqqqbAQNKEmWMWmEKNbgUd&GZZZDhqQKEKKEBBmW
|
||||
/((???++<<IIrlY30t9Vapp&aaDGwhHbAbbqXqbbXbqbAkAQKKBBWWWMWMmEkHRhFHbQQEBmEKEBBW
|
||||
}}+7<<ii=rlYY3Otu9VGaDGVVGD8hgXbAAAbXqAqbqbkkAAQQQKBBBmmBBmEKkAbANNNEEEBBmWWWW
|
||||
((+77<==IvvCCC0OOttZutu9ZG&dRgqbAAAAbqbbqkkkkAkkQQNKEKKKKKKENNQNNKEEBmmBmmmWWB
|
||||
**}?+<<i=IllvYYYCCC333OuZDpFHqAAAqbAbbbbqAkkAAkQKKKEKNKEKKKNQQQNKEBBBWmmBBWWMW
|
||||
/*}}?+<ii==rrlvvYYvYv0OuG8hgXbbkAbAAAAbbAkkkkAANKKKNNKKKKKKKKKNNEBBmWWWmmWMM#W
|
||||
/[*((?777<===IrIIrrlC0tVadFHbbkAbqbAkkbAAkQkQNNKKQNKEKNKKKKKQNEEBmmmWWMWWMWWMM
|
||||
[***(}?++7<i====I=IvCOuV8RgqbkAkAAkkkAbAQkQNQNNQQQNNEKKEKKKEEEEBmWWmmWmWWBBWEM
|
||||
[[[***(}}}7<7<<i=IIv3tV&dUqbqAAAbbAkkAbAQQNNNNQQNNKKEEEKNKKKEBBBBBEBBmBmmWMMWN
|
||||
[[[**(}(}}+?7<i==IrY39awRHbbbbbAbAAAAAAAkQQQkkkQNKNKKKKNKNNEEEBBEEBBWmmmWMWmWW
|
||||
*[(*(}}(}?}?7<<i=rY3OZahUHXAAbAkAkkAAqbqqAAkkAAQQKKEKKNKKNKKEKEBBEKBWM#WmmmmWW
|
||||
**(**(((}???<<<iIrv0uVpRgXXqqqqbAAbAAAAqqbAAkkQQNNNQQQNEBEBEEEEEBEEBMWMWWWWmmM
|
||||
"""
|
||||
|
||||
PIC3 = """\
|
||||
MMM#MM##MWMD{8M##MM####MMMMMM###M##M###MMM########M####MM##MMMMMMMMMMM#MMMWWMM
|
||||
M#MMMMM#M@A=2WWMWWMMM##M#MMM#W##M######M##M#M##M##MM###MM##MMWMMMMMMW##M#MMMMM
|
||||
MM##MWMBiW%oWMUmWWW@NM##MMWymM############M#MM###MM#MM##M#MMMMMMMMMMMW#MMMMMMM
|
||||
WMMWqmWMMW=B#WiWM#B?8WMMWWXmWMM###M#####MMMM###MMMM#M#M##M#MMMMMMMMMWMMMMMWMMW
|
||||
WWWgDD8@&9%#MBD####WWmmWWLmMW#MWM#####MWM#M#M##MM##M#MM#MMM#M#MMM#MWWMMMMMMWMM
|
||||
mWWWWmQWWCWWMMM###MWWBWMWWmcvxFXmMMM#MMMMMM#MMMMM#M#MMM##M#MMMMMMMMMMMMMMMWWMM
|
||||
MMMMMWWW$@#MMMM##M#WMW@WmAWi)77z@MMMMM##MM###M####MM##MM#M##MMMMMMMMMMWWMMMMWW
|
||||
WWWWWWWMFWMMMMMM#MMMMMWWWWAB313QWMMMMMMMMM#MMM#####MMM#MMM#M#M#MMMMMMMWMMWMMBm
|
||||
MWmWWWWMmMMMMMMMMM#M#M#kWWWMW<&WMMM##M#MM#M##M#MM#MMMMMWMMM#MMMM#MMMMMWMMMMMWW
|
||||
WN,NMWWmW#WMWWMMMMMMMWWMM##MMW&@MMMMM#MMM#######MMM#M#M#M#MMMMFWMMMM#MWmMMMMWW
|
||||
MMMMMMMMWMMMMMMMM#MMYmMMMMmmWMMMMMWMMMMMMM###M#MMMMM#####MMMM#MMMMMMMM<3MMMWWW
|
||||
##MMMMMWWMMMMMWWWWWMMWMMMMMMWW##Xu3bmmWWWM#M#MMMMMMMMM##MMMM#M#MM#MMMMWMMMMMMM
|
||||
MMWMM#MMW#MMWMMWWWWWWWMMWWMMM##MME%D=3@mWWMMMMMMMMWWMMMMMMM#M#MMMMM#MMMMMMMMWM
|
||||
WMMMM#MMmWWmmMMWWWWWWAWMQWMMMMMMMM80/38NWWMMWMMMMMWmBWWM###MMMMMMMM#WMMWWWWMWM
|
||||
M#MMWMMMMm8WWWWWMMWWWmWWMMMMM#MMWWWm<D<?8mMMMWMWMMM@@@mMWM#M#MMMMMWYY#MMMWMmWW
|
||||
MMWWMWWWWm@mmmWWWWQWWMWWMWWMMMMMWW]))|'`)lmm@BWWWWmQXNm@QNmWMMM#MWMMMMMWMMMMWW
|
||||
MWWWMMMWMWmWmmmmmWWWMWM#WMMWMMMMMMW<^))-~'':::'`?ocv2%d$k$QmMMMMMMMMMWMMMMMWWW
|
||||
WWWMMMW#MMWmmmmWMMWWM#MMNU#MMMMMM#m?))|-':: '-^~-|7=Y9q8qkmWMMMWMMMMWWWMMMWMM
|
||||
WM#MMMMMMWWWMWWWMWWWWMWWWWMWMMMMMW8||)-' .^~..')|?lzL8UqNmWMMMMMMMMMMMMMMMW
|
||||
MMMMMMMMWWWWWWWWmmmOO988@@mNWmQbQW=)|"~:. '^:. :-)[iYOy&$kmWWMMMMMMMMMMMMMMM
|
||||
#MMMWMWWWmmmmBBQmN&qA8eD9QAmWk@Q$<__[|': ._,:::~_/1v02DU$mmWMMMMMMMMMWWMMWM
|
||||
WMMWWmWMWmWmmAREEby8&=3xqN@mMWMMN<|||-:... .:-)-;;"+<cj0L68bmmWMMMMMMWWBWWMWWW
|
||||
##MMMMMMWMW@NF&@mmRkejv8BmWMMWWmm@O<?~:::::,-^|)/"]<1vvj26&bmmWMMMMMM#MWMMMM#W
|
||||
MMMMMMM##MWm@gygNmAQ88&BM#MMMMMWWMMmv':.,~;|7|)||/"<ivY3xt&@mWM##MMM#MWMM#MMM#
|
||||
M#MM##M##M###MMMMMWM###M#MMMMMM##MMMD`.:~_)+=7||"{+<1vvjtu&@@mMMMM##MMMMMMMMMM
|
||||
M#M#######M##M####W###M#M##MM##M###MD:.::-_+7l/{[+<1olzY098N@mMMMMM#MMM#MMMM#M
|
||||
M##M##M##M##M#M#M#W#M#MMMM#MMM###MMM&)~':'^_/7?|?711llv3xL8@QWM#M#M#MMMMMMMMMM
|
||||
MM#####M##M####M##M##M###MMMM#####MM82+)-)_)/[=+{{<1==YC2L8N@WM#MMMMMMMMMMMMMM
|
||||
######MM#MM#MMM#MM######M##M#######MMQL3Ii==o=x7<++<<cYjtDX@EmWMM#M###M##MMMMM
|
||||
M######M#MMMM#MMM##MM############M##M9v+]oL8Dyg=7<<1=lx2eR@NmmWWWMMMMMM##MMM#M
|
||||
########MM##MMMM##M######MMMMMMM#MWBQci1+{7<<=xl<<1clj96&F@mm@BWWWWMM#MM#MMMMM
|
||||
MM#WM###MMM####MM######MMWBU&AMWb2=Yj/]Ll<+7<1vtIo=Yx3ey&8@NbFqNmmWWWMM#M##MMM
|
||||
#M##M#MMM#M##M#M#MMWk%3i<++{{iWW&l+8811%R2YlI=c9CYvlC0t6DdEF88UA@@mmWWWMMM#MMM
|
||||
#MM#M#MMM###MMWUY<7{[_;)__^_)|gWDvuMmMM#MQDxYYvx6Yvj026yDgN&&88dUg@BmWmWM#MM#M
|
||||
####M#MMM#MWu1/|;-~-~~,`-~-;^)yWACbBWWM&BW&u6DD8RYvv3u6yFA$66yD&88qX@EmWMMM#MM
|
||||
#MM#####M#B<);;`,:::,:,,',^-^;?WW9z+?2mMmmQ2e88C==ojO9&8R$&vj0O2%%&R$@EmWMMMMM
|
||||
#M#M###MMWi|~`,:,,~'~,,,`-`--);lWB=++2mMWEWF9jo1ilO9&gX88U2x00Oxt9D&FX@EmWWMMM
|
||||
M#MM##MMMm<|)););~~~',~--^___;){B9<7<l@MmWWLcllYx9%&88FbL03jzCj32t6&8gg@BWWMMM
|
||||
#MM#M####MdYc<7")_^;;_//[++77<i=e1<<=ygNNolYYxuy88gAkk89O2xxz3Yjj3Le%8Xb@mWMMW
|
||||
#M########MMmbDY<<7icY3xe88U8Fg@l]0ov8WMFYv29D8ddbQ@@R8Dyutt3zYvz3z2Dy8$@mWWMM
|
||||
#######M####MMWm@$QmWmNQkAUd8dXmxlk<9@@M#m8D&8A@E@N@BA8&9O3Yll1oYYx2eDFQ@mWM#M
|
||||
#########MMMMMMMMMWWmBNQ@N@mWM##MFd3DuzzoI111<<77+<<<=3%6l<7<<7iIz2%&&dANWM#MM
|
||||
M##MMM##MM##MMM#MMMM#MMM###M#MMN63lo<7<+?{"{[[+[{{[??+7<<iY<777<IYxLy8q@mW#M#M
|
||||
######M##MMWMM#MMMMMM##MMMW8xl=<7+[[||||"|///"[/+{??{++71<1oOzcIv3%D8$QBmMW#MM
|
||||
#M###M##MMWMM##MMMMMMMW@xv=7{"||)-);;)||[/""/+++<]]++<<7111cljjj0O%&XQNmMMM#MM
|
||||
#####MM##M####M#####Wt=]{|))-^));;||"[+{[?{++<<ic=1=ooIccvvYC92u9y88q@mWMM###M
|
||||
#MMM#######M#####MAc<[);^---;-_))||/"{?++<71icIllYvvvC332uL9%%D&8UXQNWM#####MM
|
||||
#M#M########M#MMg<+|)--`-;_))||)/{"[?+7]<iilcYjCCxe2D%e&D%8&8UFXb@mW##M######M
|
||||
######M#######MY7);':'`__|"{/[[//"{7771illYv0OtDu&6&8RgFXq$kQ@NmM####M####MMM#
|
||||
#M#M#MM#M#M#MMdl7|;)/"{{{/{]+?{7<<1=olYz03Cuy&&dRFqA$Q@@BBmmW###########M#M###
|
||||
#M#######MM###mLI=<<1<<<7i71<iilY3CO2y6Y888RbAQmBBmWWMM##########M###M######MM
|
||||
#MM############m6CYYYCCYYvCj2e&8$qQQ@BNmWmmWWWMM###########M####M##########M#M
|
||||
######M########MmF&D8XdFARF$QB@RgdgAkNmWmWMM#####M###M###M#MM#M#MM##M##M##M###
|
||||
###M###########M##MMWmmWmmB@kb@BmWWWM##########M##MM####MM###M####MM#M#####MMM
|
||||
#MMM#######M######M######M##M#M##M#####M###############M#M#MM#MM#M#M####M#MM#M
|
||||
MMM#M#M######M##M#MM#M#########MMMMM#M##########MM#M###M#M##MMMM#MMMWMWMMMMWMM
|
||||
"""
|
||||
|
||||
PIC4 = """\
|
||||
N@NEKEBmmmmmWmmmmmmmmmmWWmmmWWWWmWWmWWmWWWWWWWWWWWWWmBuWWWWWMMWWWWWMMMMWMWMMWM
|
||||
BEEmmBmmmBmmmmmmmmmmmWmmWmWWWWWWWWmWmWWWWWWWWWWWWWWWWGDWWMWWMMMWMWMWMMWMMMMMMM
|
||||
BBBBBmmmBmmmmmmmmWWWWWWmmWWmWWWWWWWWWWWWWWWWWWWWWWWWWv$WMWWWWMWWWWWWMWMMMMMMMM
|
||||
EEKBmmmmmmmmmWmmmmmWWWWWWWWWWmWWWWWWWWWWWWWWWWWWWWWWmoBMWMWWWWMMMMMMMMMMWMMMMM
|
||||
EKmBmmmmmmmmmmmmWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWUYmWWMWWWMWMMMMWMMMMMMMMMM
|
||||
NEEBmmmmmmmWmmmmmmWWWWWWWWWWWWWWWWWWWWWmWWWWWWWWWWMWuTWWMMMWMMWMMWMMMMMMMMMMMM
|
||||
EEBmBmmmmmmmmmmBmmWWWWWWWWWWWWWWWWWWWWE5Ugx8bWWWWWWWxqWWMMMMMMMMMMMMMMMMMMMMMM
|
||||
KEmBmmmmmWmmmWmmmmmWmWWWWWWWWWWWWmBWWqc=~|&AY<&mWWWWbmMMMMMMMMMMMMMMMMMMMM#MMM
|
||||
NmEBBmmmmmmmWWmWmWWWWWWWWWWWWWWWmthb24x,_?)--`'xmWMWWMWMMMWMMMMMMMMM#M#MMMMMMM
|
||||
NEEBBmmmmmmmWmmWmWmWWWWWWWWWWWWmz8$o{_```'...::<mWWWMMWMMMMMMMMMMMMMMMMM#MMMMM
|
||||
EEEEEmmmmmmWmmWWKmWWWWWWWWWWWWW@~,vv),::. ::<@WWMWWWMMMMMMMMMMMMMMMM#####MMM
|
||||
BE@EBmmmmmmmWWWWmEWWWWWWmWmWWWWN<'D8v<+)-',|<=hWWWWWWWMMMMMMMM#MMMM#MM#MMM#MMM
|
||||
EBEEmEmmmWmWWWWWmbWWWWWWWWWWWBmB?7Fl[)|);~,,-?kWWWmWWWMWMMMMMMMMMMMM######MMMM
|
||||
@NEEBmBmWmmmmmmWW8mWWWWWWmWWWWWV)RL|'-_;`.:<&lbmWWWmWWWMMWWMMMMMMM#MMMMM##MM#M
|
||||
8@EmmmmmmWmmWWWmm&mWWWWWWWWWWWB):Ut<+17?-:|o@WWWMWWWWWMMMMMMMM#M#MMMM###M##M##
|
||||
u8NEBmmmmmWWWmmmWmWWWWWWWWWWmm<..nlvaOi{{ovv08mWWWWWMWWMMMMMM#MM########M#M##M
|
||||
t&KBBmmmmWWWWWWWWmmWWWWWWWBLL<:..88QA2l&$e2t2J==qWWWWWMMMMM#MMMMM##M###M#M####
|
||||
xD@mmmmmmmWWmWWWWWBWWWWA"1uY1/):-$mEA&BWEU@E@&TYlleKWWWWMMMMMM#MM#M#####M#####
|
||||
J8EmmmmmmmWWWWWWWWmWWWK^:.'=8&8GuUWWmmQgBWWWME&l7|-;"v@WMMMM#M#M##M###M#M###MM
|
||||
vSKmmmmWWWWWWWWWWWWWWWX: .|=7AW&A8mWkXAmWMMMM@0+)':'`-<mWMMMMMMM#M###MM######
|
||||
04bmmmmWWWWmWWWWWWWWWWW8^.<LooT@mWWWWmXG&@WMMMN5</~~'''`vBWWWMMM#M#########M##
|
||||
uj8BmmWmWWWWWWWWWWWmWMWQ.:Lg=<D58@WWWmFt3vx8NmmQ&j<{);~~?1IlkWWMMMM#M#####MMM#
|
||||
Sj%NmmWWWWWWWWWWWWWmWWWo :Jge32xG@MMWKhuxv<+[?=TgQA&C<||o<[|lI8mMM##M#######MM
|
||||
&JxABmWWWWWWWWWWWWWmWMW< .<g@qYI3QWWmQ8S0v=+|~'-^3Em@8xd8t1<<+|7YmMM##M#######
|
||||
&jJ&mmWWWWWWWWWWWMMWWWWe..=mWmo)<QWWNd%2jv<{_^`~~|UWWmmmEbqxl<?)|"jmMM##M###M#
|
||||
8OCnNWWmWWWWWWWMWMMMWMWQ.:8MMW2~|QWN8uYzlo+/^~,:~~^LMMMWWmqb8aTl]{"1m#########
|
||||
8&23$mmWWmWWWMWWWWMMMMWl<YWWMMg,)gW@V3=<??|;-`~`,-|8WMMMMMWWmmbDjo<<&###M#####
|
||||
8&308mWWWWWWWWWMMMWMMMWD5XWMMMm/_JAmA3<|;~`,~-;~;|?UMMMMMWWMWWmb&nOGW###M#####
|
||||
URLCSNWWWWWWMMWWMMWMMMMMRlmMMMWe+4NWmgY+");__/|||[{eWMWWWmWWmmNQbkWM#######M##
|
||||
bdn3TbWWWWWWWMMWWWMMMMMMMWe&WMMRYuKWMWgTzI==1<+{/[<io8WWmWWWWWmWM#############
|
||||
AF&O48mWWWWWMWWMMMMWMMMMMMW<LBWQ2gWMMMm@X%2Oz=7++71ilio&ENq8YDEM####M#########
|
||||
QmBB@EmWWWWWMMMMMMMMMMMMM##WD$WWU8W#MmX&nLVe2zc<1lc<77<<lXX00bhllN############
|
||||
d888e28&@mF&NWWMWMMMMMMMMM###WBNmEWMMWmQFgbR&5303zc<+++<11l&&t4CoB############
|
||||
8&S0C03Qmm@qXbKWMMMMMMMMMM#M##M#WWWMMMWWWWmm@AbqU%2v<<1<1<<1ogWWMM#M##########
|
||||
$X&G8bAX88gAbbKBmMMMMMMMWMMMMMM#MMX5mWMMMMMMMMWm@UaLxxCl=<]++<NMM#M#########MM
|
||||
g8&GaGnVD&nxux&UEWMMMMMMMMWMMMM##MA{i&@28@mmWWWmXt0x020xJYo1iouW#M############
|
||||
QS0zzYJ0G8%t25&ABmW#MMMMM#MM#M#MMM8""13TEWmWm@Ov3O2Cv===IlvvJvY@M############M
|
||||
E&23jjY3TV%0tVdkWMMMMMMMMMMWmQd&kmX7i5QWMMMmo<TFdV2l1<<<+71Izlc2WMMM##MM###M#M
|
||||
mQ8&V2TeeOJO2%XmMMWMWWguzYjtGFmWMMMWQ&WM#MD;)8mEb8tY]{[++]7<1JzlbMMMMMM#MWWMW#
|
||||
mmm@kAQgDSnVRRBW@L<1vT&8&Su55LeAWMMMMME&b0;:7WWmQU&0+)|/"+{+<oCYRMMMW&1""/7/xl
|
||||
WWWmWmWWWWWm8l7c0GdhR88R8FXXqANNWMM###M#Mc<JmMMWm@U&0o7<7+<czOn2QW%+"|//||))+4
|
||||
WWWWWWWWA=-)l8UbgXXqAk@KmmWWWWMM#M####M#Md8qM##MMWmbdn33YvluEmgL["+77+<+<"|<IB
|
||||
mWWWWmY.:<&AQ@@Q@@EmmWWWWMM#MMM#M######M#MWm@M####MWAq&%%D%C&WEXh3Jxl7<+|1]tL@
|
||||
WWWWB?'0@NKNEmmWWWWWMMMMMMWMMM#M#M#M######BzX@######MNXbbQqRg8F&&e8G32%5+i]YSm
|
||||
mN@@X2NmmmmWWWWMWMMMMMMM#MMWWmmWM##M#######mmQm######MWWWWND%g@$ASVFF88b=++C8&
|
||||
/|+=jFmWWWWWWMWWMMMMMMMMM#MM####M#################M###MmENhRqQR&bEb8exCJvollzj
|
||||
|)?<?x@mWWWWWMMMMMMMMMM##MM#M###MM###############MW@FdR&&%TeGhQb$Q&2xYvllllvj3
|
||||
]~'|I3T@mWWWWWWWMMMMMWMMM#M#M#MMM#MMM#M###M######MWK@gg8zv28hqEmbGuYvvlvvvzJ33
|
||||
@bh8VtO2L&QWWWWWWMMMWMMMM#M#MMMMMM#M##M####M#M#M##MmN@Q$8V&d@WWgCYocllvlvYjj32
|
||||
mmmmWmWmWmWWWWWWWWMMMMM#MMMMMM#MMMM#MMMM#####M#MM#MmBm@@@@mBAA@A0ll0u4vvvY3045
|
||||
mmmmmmmEQq@mmNba&@mWmWWWWMMMMMMMMMM#MMM#M##M#MWWWW@NWBmmBKdz@MW&tJvll2EWWB&qSd
|
||||
"""
|
||||
|
||||
PIC5 = """\
|
||||
VDGZGaGVZVVVGVGZVZGO0O3CYYvvvCYYC3C3YvCvlYCllvrlvvvrvrvIrlrIIIrl=r==I=7~
|
||||
9V9ZuV9uVZV99ZVZuttt3CCYlrlI=IIIrlllYlYrIrrYrIllvrrrlvlrIrrI==IIrIIIi=7`
|
||||
9utuOtt9ttu9utttuOt033YvvlvriI==ii<IrlrrrII=I=rrIIvIrllvIrrIr==III=i=<<`
|
||||
9tuOtOOtt00Ot00O000tC0Ot0vllII===<7iirrl=iii=<iI<Iii==IIII==i==i<<<<7++`
|
||||
u0O003O3CC33333YCCDFKNkFwFNKEqD3=ii7?++7<++i7?7?<7<7<7i<<=<7<<ii<<+7+77,
|
||||
9OC3CYCCCYvC3YY3uHmKqbQKBM##BkNKQZr=I=<+++???+++777777<7+7+<<+<<7i7++7}`
|
||||
t3CCCYCvYvlCYtUkNKQKEKkbBMMMMWBKEkYIl=iIi77777<<+<=<i77+<<<<i=<77<++7+(:
|
||||
3YClYrllYIlOEW#MWM##MmmNNWWWWMmNEkbY===I=i==i<i=====iii=<<77<<<<i=<+??}:
|
||||
O0YlvrIrlOhmWBMM###MNkAKBQmWEQQKNKKNC<+<<ii===I=irI=I=I=<==Iii==<7=i<++,
|
||||
OOvYlrIlDB#mWEKKKM###mmWKFmNKAKKkQKNq7}?+?+77<=iIIIr=I=====I=r=I===<7<+,
|
||||
03Y0lvIYDWWBMKNNW#####W#MMBQAQAQEKKNKd?}((}}}??+<<<rI==iirI=III=riiii<}:
|
||||
Ou30vlrr0QM##QdFKM###M##mWmmBKQQQNKKEQr*(*}*(*(}(}+777+iiiiI<i==i=r=ii7:
|
||||
uuO03v=iIlaXAkdlrRB#WWmAQMmEBEBmmEKBEN3([*[[[[[/[*(?++?7?+7+<<7<77i<77+:
|
||||
OOt0CYlIl<<iIYbHZCGBMkuC<OWBBMMBMBmmBK3}+((}*//[[[[*[?(((}(??}?}}}}7+?(.
|
||||
ut9tO0YvI=I=rYHH0YIVEN&ppuXB#W#MWmBN8Y3Y7}?}(([(*[**[**/*[/[[(*((}}***[:
|
||||
ZZ99ttCCYlrrIuOUGv<+rGaUavHW#MWWWEAqw8NQaul=7?+}?(((*[*****[[*/[*[[**[/:
|
||||
aGDZV9tt03vvlCY&X&07++}l}+uNEHd8wqEmMWAqXNKU0<7?}+??}(}([[*[**[*/(*/[//
|
||||
&pa&8GVZut0OYYYOdXF8VCIIY&dw&DpgEBNq&VXKHXdHHgv7i7<7777++?}}(}*}*([[*//.
|
||||
Fhdw&8a&aZZuuuOuwOXKKKQbqqF&&FKmmWBXDZi?IagqURbhIII=<i<7++???}}}+((}*[/:
|
||||
UhRhdR&Rp8a&DaVZGDhFwZZI=rZhFqkQKEHabC```~~^[uggROrrI=i<7+<7<7777+?(?(}`
|
||||
gXUgFUFRFFhww88aDDapah&VDFUkQKWmWE8hGi^`,``~`^;/ZUguri==<<<ii<<++777<7},
|
||||
qXXqAXHHqXHFRRRwRdRwpp&88&DhBmENKgZaU=^,`,```~~~-;CAFOiiii<ii<7i+++7i7?~
|
||||
qbbAkQbbAqXqXXXgu3I0&UqAFdwFmEEEBKXUUi^,,,,,,``,``~|pbhlii<<7==i7=}??7+-
|
||||
kkNkQQNQkQkANbHli(/(}}rGXAFhRmBKAQR8V+!~`,`,,,`~,`--~|dAZ===<<=<<<<<<77~
|
||||
QQQKQKNENKKKQkar?[;/**(+3hAUFFqEQNkkV</^,``,~`~~~~``-!}gqHI<7iii<<<i<7+;
|
||||
KNKKKEKEEBmEmqV<}[/*}(*?<vDqHggNKKkkpr/-,`-`~~^--^^^![iDXqhti==iI=iii7<!
|
||||
EBKNEBEEBmmmWKGvi*(?7?[[?ivakXXNEEKkFt=*!-^!^;|-~^/|[/+lFXgD8r<=I=I<i<i/
|
||||
BmEBBBNmmmmmEEgtl<7?+l?/*?IORNHAKKNQQhGvI77[[|!--~~^[*?ihgU8GD=<<ii=ii<*
|
||||
mWEKBBEBmmM#WWkOGtI+[=VI?+<38QKbKKENKmQUp9Ci}(*;;--``!/i9UUFwQa===Ii=i<(
|
||||
WmWmBBmWmmWWMMNDFZI?[(vwI7<lZqWKQEmBKNEEKbRa3Ii?*[!!--;+CwUggkEtvlr==Ir+
|
||||
###MWWmWWMmBWMm8gG<}*[7ZViirVUKmbABKNAXgkmmAU8uvi?*[[||([IhUg0YOYl==iir+
|
||||
WmmBWMMWWWBWMmV?[[}7**+lh3rr0aqHUwgBQNqdpRHkQkXwZ0vii<<~!/Zpw0vllYvlrI=?
|
||||
WWBBEBmWBmBEVvr7(;-;[<=rh9viIOkFhUpUD0i((+}<OdwpDu=[;|;;|;|l333C3YYlIrI<
|
||||
EmEBBBNBMBN0=ii+[!^^|/(?Y9Y7<rGEqXNAt=*;-~`~;IaqKAU89CI<?(/[}C03YvC3YllI
|
||||
KKEEEEBmmBAV=+7+[|!;/[*++=Y+/;!}9m#kI9?*^^^^^;|*ONENAgdVOl7([[lO3O0YCCYv
|
||||
KQKKEEEBEEkgC7ilI=<?*((}}7iYI[7=8X7}?Og37?}<l<}[;|CkBKAXRa0Y?}*?=0v03YYl
|
||||
QkkKKENBEEKkA83YCvvr=i+???7iCCrI[7YRWWMmERa3?}**[}(*OXEKNAX8VI<?*}OOOt0l
|
||||
AkNQKENEBEBBAAqV0vvYvrI=i77<il3tvqdMmKKAXUt<7?([;!^;/[ObBNQQqwZC=+tu9uu0
|
||||
qqbQKEBmEKKEKFFF&9OCYvr=Iri=rrY0uaR#Kg&pXbpGu3llIi77=v30XNKEXUhGua&V9Z9O
|
||||
bQXbqkkEBKKEmERQghau0CvlIrI=rrrvCtDHKF8DDF&VZuv3C=<?7?(i0kNBNkgqFRpGu9ut
|
||||
HQqHbkQKEEBEBWkG8KXwD90Cvvlrllvv0C39OG9tutVVOv=7((/;!|[}IGbFNEKENbHDt003
|
||||
AXbgqqkQBBBEKmMkw9hBgdaGuCvvvvYCClCtu[lYCY3OCl=+((/;|/[*7vUhRMBBmEb&aVO0
|
||||
XgbXgqbNEEBEBBBmBH&8MkFR8ZOOOY003C0tO;v7VDGVVtCrI<+(**(}}70=UEMMmQu[(lVG
|
||||
bqAAbkNQKEBBEW#MmmkUFWmAXhaZutOO3C3Y|[l}=qRFDDV3I7?(([(?i=0Cw0YXbv|YOuVZ
|
||||
bkQkkkNNEmWMMWMM##MKqX#BNAHh&DVuu0l;+r0**uXMqZ3v=+(*[//}=3&bQ9li/-(aGaGG
|
||||
XAkkANKEmmMWMM##M##MBEN#WNAqUwa9=/=CO9}<7YGhkM#NDv<777=IYVHWgvv?[rV&GV9t
|
||||
HbkKQAEEBm###########X0v0ZuOIi=uuV&V(O[ir0tDa93g##WUG3Ot98Q#KwV3rCGV&V9t
|
||||
UHAkkEKKKBm#####QKBW####WEqp0ll=iYC++Ilv0Y0uu3vI7lQ#WWM###M#MERGYlCZGZZ9
|
||||
RFHXbQkkNKE#Wkd&GZaXm#######WX8VOO3OtttO0333vl=777+vBBBWM##M#ERZ3vvtFaVt
|
||||
hhFFUXXbbkKq=rIlrCZpdAKBW#####BkRpDV9tt0CCrII77+<+7iCEM##KBMMmduYZV3G8G9
|
||||
FFUgFaD&qpI7=i=lYYCtu9u&Q#######mQXp&utOCCi==i<7==rY0FM#QgbWMEdY0wEwtu&D
|
||||
dU830OZ9Iii=Iv0D899u9OVhW#########mNUd&VtO3CYY330OuG&b#NggdgW#KgZt9Rh003
|
||||
R8VRZr====IOUWNNEKHkgXXqAQBW########MKkUd8&&&Da&&&8RbWbXgghUHXbKMKpZVUZV
|
||||
wF0Yv9hXXbqUdppw8wwwhFFgqAkkEKEWM#####WmKkbXUUUgqqkEkqqkqqgXgqXbgRdD&V9V
|
||||
dppa&8888Fd&D8pdhFhhhFUhbXbbANAkQkkEEBWM##MWWBBEEbXHUgXUgFXHAbbHXURUwp9t
|
||||
hFd8pdhRwh88dRdddRggqqHFUHHbQQANQNqbAAkbqbkXqXHXUUggRRhFhggqAqUFgUgFhphp
|
||||
&dhphRhdFw8ddFHUXHXXHqkXbUgRQQKQkbbAXXbAXHHgFRRFRwpdwUXFFHHHHFhRwwwd8GaG
|
||||
RgRRRFhhFRFUFggFHAqUXgbqXbXgHbAkQkXbbgFUhRw88pp88p8pdppw8&ggwwFw&8&&8D&9
|
||||
hFwwwdRggRUgUHUbXXqXbggbqHXgUggXUgUURhwww88&&88aVZVZGGDDZ&ZDpD8u9uZ&GGGZ
|
||||
"""
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
183
src/megui/create_jobs.py
Normal file
183
src/megui/create_jobs.py
Normal file
@@ -0,0 +1,183 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (c) 2009 Andreas Balogh
|
||||
# See LICENSE for details.
|
||||
|
||||
""" create MeGUI jobs for Panasonic MPG files """
|
||||
|
||||
# system imports
|
||||
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
import getopt
|
||||
import re
|
||||
import xml.dom.minidom as xdm
|
||||
|
||||
# local imports
|
||||
|
||||
# constants
|
||||
|
||||
# globals
|
||||
|
||||
LOG = logging.getLogger()
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
|
||||
datefmt="%H:%M:%S")
|
||||
|
||||
# definitions
|
||||
|
||||
class Usage(Exception):
|
||||
pass
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
def main(argv = [__name__]):
|
||||
try:
|
||||
# check for parameters
|
||||
LOG.info("starting '%s %s'", argv[0], " ".join(argv[1:]))
|
||||
script_name = os.path.basename(argv[0])
|
||||
try:
|
||||
opts, args = getopt.getopt(argv[1:], "ht:j:z:", \
|
||||
["help", "template", "job_dir", "temp_dir"])
|
||||
except getopt.error, err:
|
||||
raise Usage(err)
|
||||
LOG.debug("opts: %s, args: %s", opts, args)
|
||||
template = "job_divx_template.xml"
|
||||
job_dir = "C:\\Program Files\\megui\\jobs"
|
||||
temp_dir = "e:\\video"
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage(script_name)
|
||||
return 0
|
||||
elif o in ("-t", "--template"):
|
||||
template = a
|
||||
elif o in ("-j", "--job_dir"):
|
||||
job_dir = a
|
||||
elif o in ("-z", "--temp_dir"):
|
||||
temp_dir = a
|
||||
src_dir = "D:\\Documents\\Raw\\Panasonic SDR-S7\\Video"
|
||||
dest_dir = "D:\\Documents\\My Videos\\Balogh"
|
||||
if len(args) == 2:
|
||||
src_dir = args[0]
|
||||
dest_dir = args[1]
|
||||
elif len(args) == 1:
|
||||
src_dir = args[0]
|
||||
elif len(args) > 2:
|
||||
raise Usage("too many arguments")
|
||||
# call method with appropriate arguments
|
||||
if src_dir and not os.path.exists(src_dir):
|
||||
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
|
||||
if dest_dir and not os.path.exists(dest_dir):
|
||||
LOG.warn("Destination directory not found [%s]", dest_dir)
|
||||
LOG.info("Creating destination directory [%s]", dest_dir)
|
||||
os.makedirs(dest_dir)
|
||||
cli(src_dir, dest_dir, template, job_dir, temp_dir)
|
||||
LOG.info("Done.")
|
||||
return 0
|
||||
except Error, err:
|
||||
LOG.error(err)
|
||||
return 1
|
||||
except Usage, err:
|
||||
LOG.error(err)
|
||||
LOG.info("for usage use -h or --help")
|
||||
return 2
|
||||
|
||||
|
||||
def cli(src_dir, dest_dir, template, job_dir, tmp_dir):
|
||||
""" command line interface """
|
||||
if not os.path.exists(dest_dir):
|
||||
LOG.error("Destination directory not found [%s]", dest_dir)
|
||||
raise Error()
|
||||
for mpg_fn in os.listdir(src_dir):
|
||||
opts = { }
|
||||
root, ext = os.path.splitext(mpg_fn)
|
||||
# skip files which are not mpg video
|
||||
if ext.lower() != ".mpg":
|
||||
continue
|
||||
# determine file paths
|
||||
mpg_fp = os.path.join(src_dir, mpg_fn)
|
||||
avi_fp = os.path.join(dest_dir, root + ".avi")
|
||||
d2v_fp = os.path.join(tmp_dir, root + ".d2v")
|
||||
opts["mpg_input"] = mpg_fp
|
||||
opts["final_output"] = avi_fp
|
||||
opts["d2v_output"] = d2v_fp
|
||||
# if avi_fn doesn't exist then create job xml
|
||||
if not os.path.exists(avi_fp):
|
||||
create_megui_job(template, job_dir, opts)
|
||||
|
||||
|
||||
def append_megui_joblist(jobname):
|
||||
joblist = "c:\\program files\\megui\\joblists.xml"
|
||||
# load the xml
|
||||
inf = open(joblist,"r")
|
||||
dom = xdm.parse(inf)
|
||||
inf.close()
|
||||
# add <string>job220</string> to <mainJobList>
|
||||
JobListSerializer = dom.getElementsByTagName("JobListSerializer")[0]
|
||||
mainJobList = JobListSerializer.getElementsByTagName("mainJobList")[0]
|
||||
string = dom.createElement("string")
|
||||
text = dom.createTextNode(jobname)
|
||||
string.appendChild(text)
|
||||
mainJobList.appendChild(string)
|
||||
newline = dom.createTextNode("\n ")
|
||||
mainJobList.appendChild(newline)
|
||||
# save xml
|
||||
outf = open(joblist,"w")
|
||||
dom.writexml(outf)
|
||||
outf.close()
|
||||
|
||||
|
||||
def create_megui_job(template, job_dir, opts):
|
||||
# replace in template: mpg_input, d2v_output, final_output, jobnum
|
||||
jobnum = get_next_jobnumber(job_dir)
|
||||
LOG.info("creating job %i...", jobnum)
|
||||
jobfn = "job%i.xml" % (jobnum, )
|
||||
jobname = "job%i" % (jobnum, )
|
||||
opts["jobname"] = jobname
|
||||
tplf = open(template, "r")
|
||||
jobf = open(os.path.join(job_dir, jobfn), "w")
|
||||
try:
|
||||
for line in tplf:
|
||||
# line = raw_line.rstrip("\n\r")
|
||||
for k, v in opts.items():
|
||||
kd = "".join(("$", k, "$"))
|
||||
line = line.replace(kd, v)
|
||||
jobf.write(line)
|
||||
finally:
|
||||
jobf.close()
|
||||
tplf.close()
|
||||
append_megui_joblist(jobname)
|
||||
|
||||
JOB_REO = re.compile("job(\d+)\.xml")
|
||||
|
||||
def get_next_jobnumber(job_dir):
|
||||
max_jn = 0
|
||||
for job_fn in os.listdir(job_dir):
|
||||
job_mo = JOB_REO.match(job_fn)
|
||||
if job_mo:
|
||||
jn = int(job_mo.group(1))
|
||||
if jn > max_jn:
|
||||
max_jn = jn
|
||||
return max_jn + 1
|
||||
|
||||
|
||||
def usage(script_name):
|
||||
print
|
||||
print "usage: %s [-t template] [-j job_dir] [-z temp_dir] [src_dir [dst_dir]]" % (script_name,)
|
||||
print """
|
||||
src_dir source directory of original MPG files
|
||||
dest_dir destination directory for compressed video
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-t, --template job template file
|
||||
-j, --job_dir megui job directory
|
||||
-z, --temp_dir working directory for megui
|
||||
"""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv))
|
||||
|
||||
5
src/megui/create_megui_jobs.bat
Normal file
5
src/megui/create_megui_jobs.bat
Normal file
@@ -0,0 +1,5 @@
|
||||
@echo off
|
||||
rem determine directory of script. may be different from current working directory
|
||||
for /F %%I IN ("%0") do set BIN_DIR=%%~dpI
|
||||
rem expect python.exe in the PATH
|
||||
python.exe %BIN_DIR%\create_jobs.py %*
|
||||
154
src/megui/job_divx_template.xml
Normal file
154
src/megui/job_divx_template.xml
Normal file
@@ -0,0 +1,154 @@
|
||||
<?xml version="1.0"?>
|
||||
<TaggedJob xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
||||
<EncodingSpeed />
|
||||
<Job xsi:type="IndexJob">
|
||||
<Input>$mpg_input$</Input>
|
||||
<Output>$d2v_output$</Output>
|
||||
<FilesToDelete />
|
||||
<LoadSources>false</LoadSources>
|
||||
<DemuxVideo>false</DemuxVideo>
|
||||
<DemuxMode>1</DemuxMode>
|
||||
<AudioTracks>
|
||||
<AudioTrackInfo>
|
||||
<TrackInfo>
|
||||
<Language />
|
||||
</TrackInfo>
|
||||
<Language />
|
||||
<TrackIDx>c0</TrackIDx>
|
||||
<TrackID>192</TrackID>
|
||||
<ContainerType>MPEG-PS</ContainerType>
|
||||
<Index>0</Index>
|
||||
<Type>MP2</Type>
|
||||
<NbChannels>2 channels</NbChannels>
|
||||
<SamplingRate>48.0 KHz</SamplingRate>
|
||||
</AudioTrackInfo>
|
||||
</AudioTracks>
|
||||
<PostprocessingProperties>
|
||||
<AudioJobs>
|
||||
<AudioJob>
|
||||
<Input>::192::</Input>
|
||||
<FilesToDelete />
|
||||
<Settings xsi:type="MP3Settings">
|
||||
<delay>0</delay>
|
||||
<delayEnabled>false</delayEnabled>
|
||||
<ForceDecodingViaDirectShow>false</ForceDecodingViaDirectShow>
|
||||
<DownmixMode>StereoDownmix</DownmixMode>
|
||||
<BitrateMode>ABR</BitrateMode>
|
||||
<Bitrate>128</Bitrate>
|
||||
<AutoGain>true</AutoGain>
|
||||
<SampleRateType>0</SampleRateType>
|
||||
<ApplyDRC>false</ApplyDRC>
|
||||
<Normalize>100</Normalize>
|
||||
<Quality>50</Quality>
|
||||
</Settings>
|
||||
<Delay>0</Delay>
|
||||
<SizeBytes>0</SizeBytes>
|
||||
<BitrateMode>CBR</BitrateMode>
|
||||
</AudioJob>
|
||||
</AudioJobs>
|
||||
<DirectMuxAudio />
|
||||
<AutoDeinterlace>false</AutoDeinterlace>
|
||||
<AutoDeriveAR>false</AutoDeriveAR>
|
||||
<SignalAR>true</SignalAR>
|
||||
<AutoCrop>false</AutoCrop>
|
||||
<KeepInputResolution>true</KeepInputResolution>
|
||||
<PrerenderJob>false</PrerenderJob>
|
||||
<HorizontalOutputResolution>640</HorizontalOutputResolution>
|
||||
<ContainerTypeString>AVI</ContainerTypeString>
|
||||
<OutputSize xsi:nil="true" />
|
||||
<Splitting xsi:nil="true" />
|
||||
<DAR xsi:nil="true" />
|
||||
<AvsSettings>
|
||||
<Mod16Method>none</Mod16Method>
|
||||
<Resize>false</Resize>
|
||||
<Template><input>
|
||||
Load_Stdcall_Plugin("C:\Program Files\megui\tools\yadif\yadif.dll")
|
||||
Yadif(order=1)
|
||||
<crop>
|
||||
<resize>
|
||||
<denoise>
|
||||
</Template>
|
||||
<ResizeMethod>Lanczos</ResizeMethod>
|
||||
<DenoiseMethod>MinimalNoise</DenoiseMethod>
|
||||
<Deinterlace>false</Deinterlace>
|
||||
<Denoise>false</Denoise>
|
||||
<IVTC>false</IVTC>
|
||||
<MPEG2Deblock>false</MPEG2Deblock>
|
||||
<ColourCorrect>true</ColourCorrect>
|
||||
<DSS2>false</DSS2>
|
||||
</AvsSettings>
|
||||
<VideoSettings xsi:type="xvidSettings">
|
||||
<EncodingMode>4</EncodingMode>
|
||||
<BitrateQuantizer>1200</BitrateQuantizer>
|
||||
<KeyframeInterval>250</KeyframeInterval>
|
||||
<NbBframes>2</NbBframes>
|
||||
<MinQuantizer>1</MinQuantizer>
|
||||
<MaxQuantizer>31</MaxQuantizer>
|
||||
<Turbo>true</Turbo>
|
||||
<V4MV>false</V4MV>
|
||||
<QPel>true</QPel>
|
||||
<Trellis>true</Trellis>
|
||||
<CreditsQuantizer>15</CreditsQuantizer>
|
||||
<FourCCs>
|
||||
<string>XVID</string>
|
||||
<string>DIVX</string>
|
||||
<string>DX50</string>
|
||||
<string>MP4V</string>
|
||||
</FourCCs>
|
||||
<Logfile>.stats</Logfile>
|
||||
<VideoName />
|
||||
<CustomEncoderOptions />
|
||||
<FourCC>0</FourCC>
|
||||
<MaxNumberOfPasses>2</MaxNumberOfPasses>
|
||||
<NbThreads>1</NbThreads>
|
||||
<Quantizer>1200</Quantizer>
|
||||
<MotionSearchPrecision>6</MotionSearchPrecision>
|
||||
<VHQMode>4</VHQMode>
|
||||
<MinPQuant>1</MinPQuant>
|
||||
<MaxPQuant>31</MaxPQuant>
|
||||
<MinBQuant>1</MinBQuant>
|
||||
<MaxBQuant>31</MaxBQuant>
|
||||
<BQuantRatio>162</BQuantRatio>
|
||||
<BQuantOffset>0</BQuantOffset>
|
||||
<KeyFrameBoost>100</KeyFrameBoost>
|
||||
<KeyframeThreshold>1</KeyframeThreshold>
|
||||
<KeyframeReduction>20</KeyframeReduction>
|
||||
<OverflowControlStrength>5</OverflowControlStrength>
|
||||
<MaxOverflowImprovement>5</MaxOverflowImprovement>
|
||||
<MaxOverflowDegradation>5</MaxOverflowDegradation>
|
||||
<HighBitrateDegradation>30</HighBitrateDegradation>
|
||||
<LowBitrateImprovement>15</LowBitrateImprovement>
|
||||
<ReactionDelayFactor>16</ReactionDelayFactor>
|
||||
<AveragingPeriod>100</AveragingPeriod>
|
||||
<FrameDropRatio>0</FrameDropRatio>
|
||||
<RateControlBuffer>0</RateControlBuffer>
|
||||
<XvidProfile>0</XvidProfile>
|
||||
<VbvPeakRate>0</VbvPeakRate>
|
||||
<VbvMaxRate>0</VbvMaxRate>
|
||||
<VbvBuffer>0</VbvBuffer>
|
||||
<PackedBitstream>false</PackedBitstream>
|
||||
<GMC>false</GMC>
|
||||
<ChromaMotion>true</ChromaMotion>
|
||||
<ClosedGOP>true</ClosedGOP>
|
||||
<VHQForBframes>true</VHQForBframes>
|
||||
<AdaptiveQuant>true</AdaptiveQuant>
|
||||
<Interlaced>false</Interlaced>
|
||||
<BottomFieldFirst>true</BottomFieldFirst>
|
||||
<LumiMasking>false</LumiMasking>
|
||||
<BframeThreshold>0</BframeThreshold>
|
||||
<QuantizerMatrix>H.263</QuantizerMatrix>
|
||||
</VideoSettings>
|
||||
<CustomAR>1</CustomAR>
|
||||
<ChapterFile />
|
||||
<FinalOutput>$final_output$</FinalOutput>
|
||||
<DeviceOutputType />
|
||||
<UseChaptersMarks>false</UseChaptersMarks>
|
||||
</PostprocessingProperties>
|
||||
</Job>
|
||||
<RequiredJobNames />
|
||||
<EnabledJobNames />
|
||||
<Name>$jobname$</Name>
|
||||
<Status>WAITING</Status>
|
||||
<Start>0001-01-01T00:00:00</Start>
|
||||
<End>0001-01-01T00:00:00</End>
|
||||
</TaggedJob>
|
||||
62
src/misc/batch_rename.py
Normal file
62
src/misc/batch_rename.py
Normal file
@@ -0,0 +1,62 @@
|
||||
""" flatex broker server """
|
||||
|
||||
import getopt
|
||||
import sys
|
||||
import os
|
||||
import re
|
||||
|
||||
import logging
|
||||
mylog = logging.getLogger('batch_rename')
|
||||
|
||||
class Usage(Exception):
|
||||
def __init__(self, message):
|
||||
Exception.__init__(message)
|
||||
|
||||
|
||||
class Error(Exception):
|
||||
def __init__(self, message):
|
||||
Exception.__init__(message)
|
||||
|
||||
# Star.Trek.The.Next.Generation.1x01-02.Encounter.At.Farpoint.DVDRip-AMC.[tvu.org.ru].avi
|
||||
# Star Trek TNG - 1x01-2 - Encounter At Farpoint - DVDRip-AMC.divx.avi
|
||||
|
||||
def main(argv = None):
|
||||
if argv == None:
|
||||
argv = sys.argv
|
||||
mylog.info("starting [%s]" % (argv[0],))
|
||||
try:
|
||||
try:
|
||||
opts, args = getopt.getopt(argv[1:], "h", ["help"])
|
||||
print "opts: ", opts, "args:", args
|
||||
except getopt.error, msg:
|
||||
raise Usage(msg)
|
||||
# more code, unchanged
|
||||
p = re.compile("Star\.Trek\.The\.Next\.Generation.(.*?)\.(.*)\.(DVDRip-.*)\.\[tvu.org.ru\]\.avi")
|
||||
tng = "e:\\share\\movies\\star trek tng"
|
||||
os.chdir(tng)
|
||||
for (dirpath, dirnames, filenames) in os.walk(tng):
|
||||
for f in filenames:
|
||||
mot = re.match(p, f)
|
||||
if mot is not None:
|
||||
# print mot.group()
|
||||
print mot.groups()
|
||||
ver = mot.group(1)
|
||||
title0 = mot.group(2)
|
||||
title1 = title0.replace('.', ' ')
|
||||
nf = "Star Trek TNG - %s - %s - %s.divx.avi" % (ver, title1, mot.group(3))
|
||||
# os.rename(f, nf)
|
||||
print 'ren "%s" "%s"' % (f, nf)
|
||||
|
||||
except Error, err:
|
||||
mylog.error(err.message)
|
||||
return 1
|
||||
except Usage, err:
|
||||
mylog.error(err.message)
|
||||
mylog.error("for help use --help")
|
||||
return 2
|
||||
|
||||
if __name__ == '__main__':
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s',
|
||||
datefmt='%H:%M:%S')
|
||||
sys.exit(main())
|
||||
6
src/misc/ftpget.py
Normal file
6
src/misc/ftpget.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from ftplib import FTP
|
||||
|
||||
ftp = FTP('ftp.asstr.org') # connect to host, default port
|
||||
ftp.login() # user anonymous, passwd anonymous@
|
||||
print ftp.getwelome()
|
||||
ftp.retrbinary('RETR README', open('README', 'wb').write)
|
||||
97
src/misc/histogram.py
Normal file
97
src/misc/histogram.py
Normal file
@@ -0,0 +1,97 @@
|
||||
""" walk histogram
|
||||
"""
|
||||
|
||||
import sys
|
||||
import re
|
||||
import datetime
|
||||
|
||||
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
|
||||
|
||||
def main(argv = None):
|
||||
if argv == None:
|
||||
argv = sys.argv
|
||||
ifn = "e:/livefeed/20070829/GDAXI.csv"
|
||||
ofn = "e:/eclipse/workspace/filter/var/GDAXI_histogram.csv"
|
||||
tick_list = [ ]
|
||||
histogram = { }
|
||||
print "Converting [%s] to [%s]" % (ifn, ofn)
|
||||
try:
|
||||
ifh = open(ifn, "r")
|
||||
ofh = open(ofn, "w")
|
||||
except IOError:
|
||||
print "open [%s] failed" % ifn
|
||||
return 2
|
||||
try:
|
||||
for line in ifh:
|
||||
tick_list.append(parseCsv(line))
|
||||
for i in xrange(1, len(tick_list)):
|
||||
diff = tick_list[i].last - tick_list[i-1].last
|
||||
key = int( diff * 100 )
|
||||
if key not in histogram:
|
||||
histogram[key] = 1
|
||||
else:
|
||||
histogram[key] += 1
|
||||
# for key in sorted(histogram.keys()):
|
||||
for i in xrange(-1000, 1000):
|
||||
if i in histogram:
|
||||
print >> ofh, float(i)/100, ",", histogram[i]
|
||||
else:
|
||||
print >> ofh, float(i)/100, ",0"
|
||||
finally:
|
||||
ifh.close()
|
||||
ofh.close()
|
||||
print "Done."
|
||||
|
||||
time_pattern = re.compile("(..):(..):(..).(\d+)")
|
||||
|
||||
def parseCsv(line):
|
||||
flds = line.split(',')
|
||||
mot = re.match(time_pattern, flds[0])
|
||||
(hh, mm, ss, ms) = mot.group(1, 2, 3, 4)
|
||||
time = datetime.time(int(hh), int(mm), int(ss), int(ms)*1000)
|
||||
# pid = flds[1]
|
||||
bid = flds[2]
|
||||
ask = flds[3]
|
||||
last = flds[4]
|
||||
return Tick(time, float(bid), float(ask), float(last))
|
||||
|
||||
class Tick:
|
||||
""" VDO helper class """
|
||||
def __init__(self, ti, bid, ask, last):
|
||||
self.time = ti
|
||||
self.bid = bid
|
||||
self.ask = ask
|
||||
self.last= last
|
||||
|
||||
def __cmp__(self, other):
|
||||
return cmp(self.time, other.time)
|
||||
|
||||
class Roi:
|
||||
""" VDO helper class """
|
||||
def __init__(self, buy_time, sell_time, pnl):
|
||||
self.buy_time = buy_time
|
||||
self.sell_time = sell_time
|
||||
self.pnl = pnl
|
||||
|
||||
def pnl_per_minute(self):
|
||||
dt = time_in_minutes(self.sell_time) - time_in_minutes(self.buy_time)
|
||||
try:
|
||||
ppm = self.pnl / dt
|
||||
except ZeroDivisionError:
|
||||
return self.pnl
|
||||
return ppm
|
||||
|
||||
def __cmp__(self, other):
|
||||
return cmp(self.pnl_per_minute(), other.pnl_per_minute())
|
||||
|
||||
def __repr__(self):
|
||||
return "%s,%s,%.2f,%.2f" % (self.buy_time, self.sell_time,
|
||||
self.pnl, self.pnl_per_minute())
|
||||
|
||||
|
||||
def time_in_minutes(ti):
|
||||
return ti.hour * 60 + ti.minute + float(ti.second) / 60
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(sys.argv))
|
||||
120
src/misc/main.py
Normal file
120
src/misc/main.py
Normal file
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (c) 2009 Andreas Balogh
|
||||
# See LICENSE for details.
|
||||
|
||||
""" new module template """
|
||||
|
||||
# system imports
|
||||
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
import getopt
|
||||
|
||||
# local imports
|
||||
|
||||
# constants
|
||||
|
||||
# globals
|
||||
|
||||
LOG = logging.getLogger()
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
|
||||
datefmt="%H:%M:%S")
|
||||
|
||||
# definitions
|
||||
|
||||
class Usage(Exception):
|
||||
pass
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
def main(argv = [__name__]):
|
||||
try:
|
||||
# check for parameters
|
||||
LOG.debug("starting '%s %s'", argv[0], " ".join(argv[1:]))
|
||||
script_name = os.path.basename(argv[0])
|
||||
try:
|
||||
opts, args = getopt.getopt(argv[1:], "hfgp", \
|
||||
["help", "force", "gui", "preview"])
|
||||
except getopt.error, err:
|
||||
raise Usage(err)
|
||||
LOG.debug("opts: %s, args: %s", opts, args)
|
||||
o_overwrite = False
|
||||
o_gui = False
|
||||
o_preview = False
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage(script_name)
|
||||
return 0
|
||||
elif o in ("-f", "--force"):
|
||||
o_overwrite = True
|
||||
elif o in ("-p", "--preview"):
|
||||
o_preview = True
|
||||
elif o in ("-g", "--gui"):
|
||||
o_gui = True
|
||||
if len(args) == 2:
|
||||
src_dir = args[0]
|
||||
dest_dir = args[1]
|
||||
elif len(args) == 1 :
|
||||
src_dir = args[0]
|
||||
dest_dir = args[0]
|
||||
elif len(args) == 0 :
|
||||
src_dir = None
|
||||
dest_dir = None
|
||||
o_gui = True
|
||||
else:
|
||||
raise Usage("more than two arguments provided")
|
||||
# call method with appropriate arguments
|
||||
if src_dir and not os.path.exists(src_dir):
|
||||
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
|
||||
if dest_dir and not os.path.exists(dest_dir):
|
||||
LOG.warn("Destination directory not found [%s]", dest_dir)
|
||||
if not o_preview:
|
||||
LOG.info("Creating destination directory [%s]", dest_dir)
|
||||
os.makedirs(dest_dir)
|
||||
if o_gui:
|
||||
gui(src_dir, dest_dir, o_overwrite)
|
||||
else:
|
||||
cli(src_dir, dest_dir, o_preview, o_overwrite)
|
||||
LOG.debug("Done.")
|
||||
return 0
|
||||
except Error, err:
|
||||
LOG.error(err)
|
||||
return 1
|
||||
except Usage, err:
|
||||
LOG.error(err)
|
||||
LOG.info("for usage use -h or --help")
|
||||
return 2
|
||||
|
||||
|
||||
def gui(src_dir, dest_dir, o_overwrite):
|
||||
""" graphical user interface """
|
||||
print src_dir, dest_dir, o_overwrite
|
||||
|
||||
|
||||
def cli(src_dir, dest_dir, o_preview, o_overwrite):
|
||||
""" command line interface """
|
||||
print src_dir, dest_dir, o_preview, o_overwrite
|
||||
|
||||
|
||||
def usage(script_name):
|
||||
print
|
||||
print "usage: %s [options] [src_dir [dest_dir]]" % (script_name,)
|
||||
print """
|
||||
src_dir source directory to search for MOD/MOI
|
||||
dest_dir destination directory for MPG files
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-f, --force override files with same name in destination directory
|
||||
-g, --gui force interactive mode
|
||||
-p, --preview preview only, don't copy, don't create non-existent directories
|
||||
"""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv))
|
||||
|
||||
35
src/misc/pricefeed.py
Normal file
35
src/misc/pricefeed.py
Normal file
@@ -0,0 +1,35 @@
|
||||
""" pricefeed file filter
|
||||
*.log: "20070905 09:04:56.841|DE000DB0M091|4.430|4.440"
|
||||
*.csv: "09:04:56.841,DB0M09,4.430,4.440"
|
||||
"""
|
||||
|
||||
import sys
|
||||
import re
|
||||
|
||||
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
|
||||
|
||||
def main(argv = None):
|
||||
if argv == None:
|
||||
argv = sys.argv
|
||||
if (len(argv) != 2):
|
||||
print "Usage: filter.py <filename.log>"
|
||||
return 2
|
||||
ifn = argv[1]
|
||||
ofn = "".join((ifn.split(".")[0], ".csv"))
|
||||
print "Converting [%s] to [%s]" % (ifn, ofn)
|
||||
try:
|
||||
ifh = open(ifn, "r")
|
||||
ofh = open(ofn, "w")
|
||||
except IOError:
|
||||
print "open [%s] failed" % ifn
|
||||
return 2
|
||||
try:
|
||||
for line in ifh:
|
||||
flds = mol.match(line)
|
||||
print >>ofh, ",".join(flds.groups())
|
||||
finally:
|
||||
ifh.close()
|
||||
ofh.close()
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(sys.argv))
|
||||
94
src/misc/roimatrix.py
Normal file
94
src/misc/roimatrix.py
Normal file
@@ -0,0 +1,94 @@
|
||||
""" roi matrix
|
||||
"""
|
||||
|
||||
import sys
|
||||
import re
|
||||
import datetime
|
||||
|
||||
mol = re.compile("\S+\s(\S+?)\|.{5}(.{6}).\|(.*)\|(.*)")
|
||||
|
||||
def main(argv = None):
|
||||
if argv == None:
|
||||
argv = sys.argv
|
||||
ifn = "e:/livefeed/20070829/GDAXI.csv"
|
||||
ofn = "e:/eclipse/workspace/filter/var/GDAXI_roi.csv"
|
||||
tick_list = [ ]
|
||||
roi_list = [ ]
|
||||
print "Converting [%s] to [%s]" % (ifn, ofn)
|
||||
try:
|
||||
ifh = open(ifn, "r")
|
||||
ofh = open(ofn, "w")
|
||||
except IOError:
|
||||
print "open [%s] failed" % ifn
|
||||
return 2
|
||||
try:
|
||||
for line in ifh:
|
||||
tick_list.append(parseCsv(line))
|
||||
for (i, buy_tick) in enumerate(tick_list[0::300]):
|
||||
print buy_tick.time
|
||||
for sell_tick in tick_list[0::300]:
|
||||
if (buy_tick > sell_tick):
|
||||
continue
|
||||
pnl = ( sell_tick.last - buy_tick.last ) * 25.0 - 11.80
|
||||
# print buy_tick.last, sell_tick.last, pnl
|
||||
roi_list.append(Roi(buy_tick.time, sell_tick.time, pnl))
|
||||
for roi in roi_list:
|
||||
print >> ofh, str(roi)
|
||||
finally:
|
||||
ifh.close()
|
||||
ofh.close()
|
||||
print "Done."
|
||||
|
||||
time_pattern = re.compile("(..):(..):(..).(\d+)")
|
||||
|
||||
def parseCsv(line):
|
||||
flds = line.split(',')
|
||||
mot = re.match(time_pattern, flds[0])
|
||||
(hh, mm, ss, ms) = mot.group(1, 2, 3, 4)
|
||||
time = datetime.time(int(hh), int(mm), int(ss), int(ms)*1000)
|
||||
# pid = flds[1]
|
||||
bid = flds[2]
|
||||
ask = flds[3]
|
||||
last = flds[4]
|
||||
return Tick(time, float(bid), float(ask), float(last))
|
||||
|
||||
class Tick:
|
||||
""" VDO helper class """
|
||||
def __init__(self, ti, bid, ask, last):
|
||||
self.time = ti
|
||||
self.bid = bid
|
||||
self.ask = ask
|
||||
self.last= last
|
||||
|
||||
def __cmp__(self, other):
|
||||
return cmp(self.time, other.time)
|
||||
|
||||
class Roi:
|
||||
""" VDO helper class """
|
||||
def __init__(self, buy_time, sell_time, pnl):
|
||||
self.buy_time = buy_time
|
||||
self.sell_time = sell_time
|
||||
self.pnl = pnl
|
||||
|
||||
def pnl_per_minute(self):
|
||||
dt = time_in_minutes(self.sell_time) - time_in_minutes(self.buy_time)
|
||||
try:
|
||||
ppm = self.pnl / dt
|
||||
except ZeroDivisionError:
|
||||
return self.pnl
|
||||
return ppm
|
||||
|
||||
def __cmp__(self, other):
|
||||
return cmp(self.pnl_per_minute(), other.pnl_per_minute())
|
||||
|
||||
def __repr__(self):
|
||||
return "%s,%s,%.2f,%.2f" % (self.buy_time, self.sell_time,
|
||||
self.pnl, self.pnl_per_minute())
|
||||
|
||||
|
||||
def time_in_minutes(ti):
|
||||
return ti.hour * 60 + ti.minute + float(ti.second) / 60
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main(sys.argv))
|
||||
52
src/misc/wget_batch.py
Normal file
52
src/misc/wget_batch.py
Normal file
@@ -0,0 +1,52 @@
|
||||
""" broker quote request recorder engine """
|
||||
|
||||
import logging
|
||||
import getopt
|
||||
import sys
|
||||
import datetime
|
||||
|
||||
mylog = logging.getLogger()
|
||||
|
||||
|
||||
class Usage(Exception):
|
||||
def __init__(self, message):
|
||||
Exception.__init__(message)
|
||||
|
||||
|
||||
class Error(Exception):
|
||||
def __init__(self, message):
|
||||
Exception.__init__(message)
|
||||
|
||||
|
||||
def main(argv = None):
|
||||
if argv == None:
|
||||
argv = sys.argv
|
||||
mylog.info("starting [%s]" % (argv[0],))
|
||||
try:
|
||||
try:
|
||||
opts, args = getopt.getopt(argv[1:], "h", ["help"])
|
||||
print "opts: ", opts, "args:", args
|
||||
except getopt.error, msg:
|
||||
raise Usage(msg)
|
||||
# set up stderr logging
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format='%(asctime)s.%(msecs)03d %(levelname)-8s %(message)s',
|
||||
datefmt='%H:%M:%S')
|
||||
# main code starts here
|
||||
ofh = open("e:/install/asstr_get", "w")
|
||||
for i in xrange(56546,57096):
|
||||
# print >> ofh, "wget http://www.literotica.com/stories/showstory.php?id=%i" % i
|
||||
print >> ofh, "wget http://www.asstr.org/files/Collections/Alt.Sex.Stories.Moderated/Year2007/%i" % i
|
||||
ofh.close()
|
||||
|
||||
except Error, err:
|
||||
mylog.error(err.message)
|
||||
return 1
|
||||
except Usage, err:
|
||||
mylog.error(err.message)
|
||||
mylog.error("for help use --help")
|
||||
return 2
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.exit(main())
|
||||
|
||||
120
src/template/main.py
Normal file
120
src/template/main.py
Normal file
@@ -0,0 +1,120 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
# Copyright (c) 2009 Andreas Balogh
|
||||
# See LICENSE for details.
|
||||
|
||||
""" new module template """
|
||||
|
||||
# system imports
|
||||
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
import getopt
|
||||
|
||||
# local imports
|
||||
|
||||
# constants
|
||||
|
||||
# globals
|
||||
|
||||
LOG = logging.getLogger()
|
||||
|
||||
logging.basicConfig(level=logging.DEBUG,
|
||||
format="%(asctime)s %(levelname).3s %(process)d:%(thread)d %(message)s",
|
||||
datefmt="%H:%M:%S")
|
||||
|
||||
# definitions
|
||||
|
||||
class Usage(Exception):
|
||||
pass
|
||||
|
||||
class Error(Exception):
|
||||
pass
|
||||
|
||||
def main(argv = [__name__]):
|
||||
try:
|
||||
# check for parameters
|
||||
LOG.debug("starting '%s %s'", argv[0], " ".join(argv[1:]))
|
||||
script_name = os.path.basename(argv[0])
|
||||
try:
|
||||
opts, args = getopt.getopt(argv[1:], "hfgp", \
|
||||
["help", "force", "gui", "preview"])
|
||||
except getopt.error, err:
|
||||
raise Usage(err)
|
||||
LOG.debug("opts: %s, args: %s", opts, args)
|
||||
o_overwrite = False
|
||||
o_gui = False
|
||||
o_preview = False
|
||||
for o, a in opts:
|
||||
if o in ("-h", "--help"):
|
||||
usage(script_name)
|
||||
return 0
|
||||
elif o in ("-f", "--force"):
|
||||
o_overwrite = True
|
||||
elif o in ("-p", "--preview"):
|
||||
o_preview = True
|
||||
elif o in ("-g", "--gui"):
|
||||
o_gui = True
|
||||
if len(args) == 2:
|
||||
src_dir = args[0]
|
||||
dest_dir = args[1]
|
||||
elif len(args) == 1 :
|
||||
src_dir = args[0]
|
||||
dest_dir = args[0]
|
||||
elif len(args) == 0 :
|
||||
src_dir = None
|
||||
dest_dir = None
|
||||
o_gui = True
|
||||
else:
|
||||
raise Usage("more than two arguments provided")
|
||||
# call method with appropriate arguments
|
||||
if src_dir and not os.path.exists(src_dir):
|
||||
raise Error("Source directory not found [%s], aborting" % (src_dir, ))
|
||||
if dest_dir and not os.path.exists(dest_dir):
|
||||
LOG.warn("Destination directory not found [%s]", dest_dir)
|
||||
if not o_preview:
|
||||
LOG.info("Creating destination directory [%s]", dest_dir)
|
||||
os.makedirs(dest_dir)
|
||||
if o_gui:
|
||||
gui(src_dir, dest_dir, o_overwrite)
|
||||
else:
|
||||
cli(src_dir, dest_dir, o_preview, o_overwrite)
|
||||
LOG.debug("Done.")
|
||||
return 0
|
||||
except Error, err:
|
||||
LOG.error(err)
|
||||
return 1
|
||||
except Usage, err:
|
||||
LOG.error(err)
|
||||
LOG.info("for usage use -h or --help")
|
||||
return 2
|
||||
|
||||
|
||||
def gui(src_dir, dest_dir, o_overwrite):
|
||||
""" graphical user interface """
|
||||
print src_dir, dest_dir, o_overwrite
|
||||
|
||||
|
||||
def cli(src_dir, dest_dir, o_preview, o_overwrite):
|
||||
""" command line interface """
|
||||
print src_dir, dest_dir, o_preview, o_overwrite
|
||||
|
||||
|
||||
def usage(script_name):
|
||||
print
|
||||
print "usage: %s [options] [src_dir [dest_dir]]" % (script_name,)
|
||||
print """
|
||||
src_dir source directory to search for MOD/MOI
|
||||
dest_dir destination directory for MPG files
|
||||
options:
|
||||
-h, --help show this help message and exit
|
||||
-f, --force override files with same name in destination directory
|
||||
-g, --gui force interactive mode
|
||||
-p, --preview preview only, don't copy, don't create non-existent directories
|
||||
"""
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main(sys.argv))
|
||||
|
||||
Reference in New Issue
Block a user