[gnome-getting-started-docs] refactor render scripts slightly
- From: Jakub Steiner <jimmac src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-getting-started-docs] refactor render scripts slightly
- Date: Mon, 6 May 2013 14:46:07 +0000 (UTC)
commit 842b99fa45b8f6dfdc8902447a3cef5057c65686
Author: Jakub Steiner <jimmac gmail com>
Date: Mon May 6 15:27:11 2013 +0200
refactor render scripts slightly
- use a common module
- temporarily use ffmpeg before gstreamer gets fixed
animation/gnome-change-wallpaper.py | 44 ++---------------------------
animation/gnome-launching-applications.py | 44 ++---------------------------
animation/gnome-responding-to-messages.py | 44 ++---------------------------
animation/gnome-task-switching.py | 44 ++---------------------------
animation/gnome-timezone.py | 44 ++---------------------------
animation/gnome-windows-and-workspaces.py | 44 ++---------------------------
animation/gnome-yelp-intro.py | 43 ++--------------------------
animation/gnomerender.py | 41 +++++++++++++++++++++++++++
8 files changed, 62 insertions(+), 286 deletions(-)
---
diff --git a/animation/gnome-change-wallpaper.py b/animation/gnome-change-wallpaper.py
index db0f5c5..b450bcb 100644
--- a/animation/gnome-change-wallpaper.py
+++ b/animation/gnome-change-wallpaper.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-#translates strings and calls render
def main():
t = {}
@@ -54,8 +16,8 @@ def main():
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
bpy.data.objects['usermenuuser'].data.body = bpy.data.objects['user'].data.body #due to different
alignment
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-launching-applications.py b/animation/gnome-launching-applications.py
index 4f88855..2202e37 100644
--- a/animation/gnome-launching-applications.py
+++ b/animation/gnome-launching-applications.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-
-#translates strings and calls render
def main():
global typewrite
@@ -54,8 +16,8 @@ def main():
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
bpy.data.objects['typewriter'].data.body = t[lang].find('t[ id="search"]').text
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-responding-to-messages.py b/animation/gnome-responding-to-messages.py
index 53287bb..cccc77f 100644
--- a/animation/gnome-responding-to-messages.py
+++ b/animation/gnome-responding-to-messages.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-
-#translates strings and calls render
def main():
t = {}
@@ -55,8 +17,8 @@ def main():
bpy.data.objects['typewriter2'].data.body = t[lang].find('t[ id="bubble.response2"]').text
bpy.data.objects['typewriter3'].data.body = t[lang].find('t[ id="bubble.response3"]').text
bpy.data.objects['user.mt.bubble'].data.body = bpy.data.objects['user'].data.body #needs to be left
aligned :/
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-task-switching.py b/animation/gnome-task-switching.py
index a7ddb0d..05f2fcb 100644
--- a/animation/gnome-task-switching.py
+++ b/animation/gnome-task-switching.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-
-#translates strings and calls render
def main():
t = {}
@@ -52,8 +14,8 @@ def main():
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
bpy.data.objects['typewriter'].data.body = t[lang].find('t[ id="search2"]').text
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-timezone.py b/animation/gnome-timezone.py
index 2a18771..06a53eb 100644
--- a/animation/gnome-timezone.py
+++ b/animation/gnome-timezone.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-#translates strings and calls render
def main():
t = {}
@@ -53,8 +15,8 @@ def main():
for textobj in t[lang].findall('t'):
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-windows-and-workspaces.py b/animation/gnome-windows-and-workspaces.py
index 2395691..235a221 100644
--- a/animation/gnome-windows-and-workspaces.py
+++ b/animation/gnome-windows-and-workspaces.py
@@ -1,44 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- #bpy.ops.render.render(animation=True)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',renderpathabs)
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=854,height=480 ! videorate ! vp8enc threads=12 target-bitrate=200000 ! mux." %
(transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-
#translates strings and calls render
def main():
global typewrite
@@ -53,8 +15,8 @@ def main():
for textobj in t[lang].findall('t'):
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnome-yelp-intro.py b/animation/gnome-yelp-intro.py
index 6e8e7a3..abfc9e8 100644
--- a/animation/gnome-yelp-intro.py
+++ b/animation/gnome-yelp-intro.py
@@ -1,43 +1,6 @@
-import bpy,os,re
+import bpy,os,re,gnomerender
from xml.etree import ElementTree as ET
-def render(lang):
- global renderpath,renderpathabs,sndfile
-
- #bpy.context.scene.render.resolution_percentage =
- #bpy.context.scene.render.use_compositing = 0
- bpy.context.scene.render.use_sequencer = 1
- renderpath = '//sequence/'+lang
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
- renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
- sndpath = "%s/snd" % (renderpathabs)
- sndfile = "%s/snd.flac" % (sndpath)
- if (not os.path.isdir(renderpathabs)):
- bpy.ops.render.render(animation=True)
- if (not os.path.isdir(sndpath)):
- os.mkdir(sndpath)
- bpy.ops.sound.mixdown(filepath=sndfile)
- else:
- print('already rendered',bpy.context.scene.render.frame_path())
-
-def transcode(lang):
- global renderpath,renderpathabs,sndfile
-
- regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
- framepath = renderpathabs
- webmfile = "%s.webm" % (regexobj.group(2))
- transcodepath = "../gnome-help/%s/figures/" % (lang)
-
- #print(transcodepath,webmfile,sndfile,framepath)
- transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=128000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! videorate ! vp8enc
threads=12 ! mux." % (transcodepath,webmfile,sndfile,framepath)
- if (not os.path.isfile(transcodepath+webmfile)):
- os.system(transcodecmd)
- else:
- print('already transcoded',transcodepath + webmfile)
-
-#translates strings and calls render
def main():
t = {}
@@ -51,8 +14,8 @@ def main():
if textobj.get('id') in bpy.data.objects: #prelozit jestli existuje jako index
bpy.data.objects[textobj.get('id')].data.body = textobj.text
bpy.data.objects['typewriter'].data.body = t[lang].find('t[ id="search"]').text
- render(lang)
- transcode(lang)
+ gnomerender.render(lang)
+ gnomerender.transcode(lang)
if __name__ == '__main__':
main()
diff --git a/animation/gnomerender.py b/animation/gnomerender.py
new file mode 100644
index 0000000..0701ac7
--- /dev/null
+++ b/animation/gnomerender.py
@@ -0,0 +1,41 @@
+import bpy,os,re
+
+def render(lang):
+ global renderpath,renderpathabs,sndfile
+
+ #bpy.context.scene.render.resolution_percentage =
+ #bpy.context.scene.render.use_compositing = 0
+ bpy.context.scene.render.use_sequencer = 1
+ renderpath = '//sequence/'+lang
+
+ regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
+ bpy.context.scene.render.filepath = "%s/%s/" % (renderpath,regexobj.group(2))
+ renderpathabs = "%ssequence/%s/%s" % (regexobj.group(1),lang,regexobj.group(2))
+ sndpath = "%s/snd" % (renderpathabs)
+ sndfile = "%s/snd.flac" % (sndpath)
+ if (not os.path.isdir(renderpathabs)):
+ bpy.ops.render.render(animation=True)
+ if (not os.path.isdir(sndpath)):
+ os.mkdir(sndpath)
+ bpy.ops.sound.mixdown(filepath=sndfile)
+ else:
+ print('already rendered',bpy.context.scene.render.frame_path())
+
+def transcode(lang):
+ global renderpath,renderpathabs,sndfile
+
+ regexobj = re.search(r"^(.*\/)*(.*)(\.blend)$", bpy.data.filepath)
+ framepath = renderpathabs
+ webmfile = "%s.webm" % (regexobj.group(2))
+ transcodepath = "../gnome-help/%s/figures/" % (lang)
+ x = 854 #output width
+ y = round(x/(1280/720))
+
+ #print(transcodepath,webmfile,sndfile,framepath)
+ transcodecmd = "ffmpeg -r 24 -f image2 -i %s/%%04d.png -i %s -vf scale=%s:%s -b 300k %s/%s" %
(framepath,sndfile,x,y,transcodepath,webmfile)
+ #transcodecmd = "gst-launch-1.0 webmmux name=mux ! filesink location=\"%s/%s\" file://%s ! decodebin !
audioconvert ! vorbisenc bitrate=96000 ! mux. multifilesrc location=\"%s/%%04d.png\" index=1
caps=\"image/png,framerate=\(fraction\)24/1\" ! pngdec ! videoconvert ! videoscale ! video/x-raw,
width=%s,height=%s ! videorate ! vp8enc threads=12 target-bitrate=300000 ! mux." %
(transcodepath,webmfile,sndfile,framepath,x,y)
+ if (not os.path.isfile(transcodepath+webmfile)):
+ os.system(transcodecmd)
+ else:
+ print('already transcoded',transcodepath + webmfile)
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]