Showing the changes to python (4 of 4 files). Show all
Unified · Split
Empty file added.
| @@ -0,0 +1,167 @@ | |||
| 1 | # | ||
| 2 | # Copyright 2004 Apache Software Foundation | ||
| 3 | # | ||
| 4 | # Licensed under the Apache License, Version 2.0 (the "License"); you | ||
| 5 | # may not use this file except in compliance with the License. You | ||
| 6 | # may obtain a copy of the License at | ||
| 7 | # | ||
| 8 | # http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | # | ||
| 10 | # Unless required by applicable law or agreed to in writing, software | ||
| 11 | # distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or | ||
| 13 | # implied. See the License for the specific language governing | ||
| 14 | # permissions and limitations under the License. | ||
| 15 | # | ||
| 16 | # Originally developed by Gregory Trubetskoy. | ||
| 17 | # | ||
| 18 | # $Id: publisher.py,v 1.36 2004/02/16 19:47:27 grisha Exp $ | ||
| 19 | |||
| 20 | """ | ||
| 21 | This handler is conceputally similar to Zope's ZPublisher, except | ||
| 22 | that it: | ||
| 23 | |||
| 24 | 1. Is written specifically for mod_python and is therefore much faster | ||
| 25 | 2. Does not require objects to have a documentation string | ||
| 26 | 3. Passes all arguments as simply string | ||
| 27 | 4. Does not try to match Python errors to HTTP errors | ||
| 28 | 5. Does not give special meaning to '.' and '..'. | ||
| 29 | |||
| 30 | This is a modified version of mod_python.publisher.handler Only the first | ||
| 31 | directory argument is matched, the rest is left for path_info. A default | ||
| 32 | one must be provided. | ||
| 33 | |||
| 34 | """ | ||
| 35 | |||
| 36 | from mod_python import apache | ||
| 37 | from mod_python import util | ||
| 38 | from mod_python.publisher import resolve_object,process_auth,imp_suffixes | ||
| 39 | |||
| 40 | import sys | ||
| 41 | import os | ||
| 42 | import re | ||
| 43 | |||
| 44 | from types import * | ||
| 45 | |||
| 46 | def configure_handler(req,default): | ||
| 47 | |||
| 48 | req.allow_methods(["GET", "POST"]) | ||
| 49 | if req.method not in ["GET", "POST"]: | ||
| 50 | raise apache.SERVER_RETURN, apache.HTTP_METHOD_NOT_ALLOWED | ||
| 51 | |||
| 52 | func_path = "" | ||
| 53 | if req.path_info: | ||
| 54 | func_path = req.path_info[1:] # skip first / | ||
| 55 | #func_path = func_path.replace("/", ".") | ||
| 56 | #if func_path[-1:] == ".": | ||
| 57 | # func_path = func_path[:-1] | ||
| 58 | # changed: only keep the first directory | ||
| 59 | func_path = re.sub('/.*','',func_path) | ||
| 60 | |||
| 61 | # default to 'index' if no path_info was given | ||
| 62 | if not func_path: | ||
| 63 | func_path = "index" | ||
| 64 | |||
| 65 | # if any part of the path begins with "_", abort | ||
| 66 | if func_path[0] == '_' or func_path.count("._"): | ||
| 67 | raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 68 | |||
| 69 | ## import the script | ||
| 70 | path, module_name = os.path.split(req.filename) | ||
| 71 | if not module_name: | ||
| 72 | module_name = "index" | ||
| 73 | |||
| 74 | # get rid of the suffix | ||
| 75 | # explanation: Suffixes that will get stripped off | ||
| 76 | # are those that were specified as an argument to the | ||
| 77 | # AddHandler directive. Everything else will be considered | ||
| 78 | # a package.module rather than module.suffix | ||
| 79 | exts = req.get_addhandler_exts() | ||
| 80 | if not exts: | ||
| 81 | # this is SetHandler, make an exception for Python suffixes | ||
| 82 | exts = imp_suffixes | ||
| 83 | if req.extension: # this exists if we're running in a | .ext handler | ||
| 84 | exts += req.extension[1:] | ||
| 85 | if exts: | ||
| 86 | suffixes = exts.strip().split() | ||
| 87 | exp = "\\." + "$|\\.".join(suffixes) | ||
| 88 | suff_matcher = re.compile(exp) # python caches these, so its fast | ||
| 89 | module_name = suff_matcher.sub("", module_name) | ||
| 90 | |||
| 91 | # import module (or reload if needed) | ||
| 92 | # the [path] argument tells import_module not to allow modules whose | ||
| 93 | # full path is not in [path] or below. | ||
| 94 | config = req.get_config() | ||
| 95 | autoreload=int(config.get("PythonAutoReload", 1)) | ||
| 96 | log=int(config.get("PythonDebug", 0)) | ||
| 97 | try: | ||
| 98 | module = apache.import_module(module_name, | ||
| 99 | autoreload=autoreload, | ||
| 100 | log=log, | ||
| 101 | path=[path]) | ||
| 102 | except ImportError: | ||
| 103 | et, ev, etb = sys.exc_info() | ||
| 104 | # try again, using default module, perhaps this is a | ||
| 105 | # /directory/function (as opposed to /directory/module/function) | ||
| 106 | func_path = module_name | ||
| 107 | module_name = "index" | ||
| 108 | try: | ||
| 109 | module = apache.import_module(module_name, | ||
| 110 | autoreload=autoreload, | ||
| 111 | log=log, | ||
| 112 | path=[path]) | ||
| 113 | except ImportError: | ||
| 114 | # raise the original exception | ||
| 115 | raise et, ev, etb | ||
| 116 | |||
| 117 | # does it have an __auth__? | ||
| 118 | realm, user, passwd = process_auth(req, module) | ||
| 119 | |||
| 120 | # resolve the object ('traverse') | ||
| 121 | try: | ||
| 122 | object = resolve_object(req, module, func_path, realm, user, passwd) | ||
| 123 | except AttributeError: | ||
| 124 | # changed, return the default path instead | ||
| 125 | #raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 126 | object = default | ||
| 127 | # not callable, a class or an unbound method | ||
| 128 | if (not callable(object) or | ||
| 129 | type(object) is ClassType or | ||
| 130 | (hasattr(object, 'im_self') and not object.im_self)): | ||
| 131 | |||
| 132 | result = str(object) | ||
| 133 | |||
| 134 | else: | ||
| 135 | # callable, (but not a class or unbound method) | ||
| 136 | |||
| 137 | # process input, if any | ||
| 138 | req.form = util.FieldStorage(req, keep_blank_values=1) | ||
| 139 | |||
| 140 | result = util.apply_fs_data(object, req.form, req=req) | ||
| 141 | |||
| 142 | if result or req.bytes_sent > 0 or req.next: | ||
| 143 | |||
| 144 | if result is None: | ||
| 145 | result = "" | ||
| 146 | else: | ||
| 147 | result = str(result) | ||
| 148 | |||
| 149 | # unless content_type was manually set, we will attempt | ||
| 150 | # to guess it | ||
| 151 | if not req._content_type_set: | ||
| 152 | # make an attempt to guess content-type | ||
| 153 | if result[:100].strip()[:6].lower() == '<html>' \ | ||
| 154 | or result.find('</') > 0: | ||
| 155 | req.content_type = 'text/html' | ||
| 156 | else: | ||
| 157 | req.content_type = 'text/plain' | ||
| 158 | |||
| 159 | if req.method != "HEAD": | ||
| 160 | req.write(result) | ||
| 161 | else: | ||
| 162 | req.write("") | ||
| 163 | return apache.OK | ||
| 164 | else: | ||
| 165 | req.log_error("mod_python.publisher: %s returned nothing." % `object`) | ||
| 166 | return apache.HTTP_INTERNAL_SERVER_ERROR | ||
| 167 | |||
| @@ -0,0 +1,287 @@ | |||
| 1 | from aubio.bench.node import * | ||
| 2 | |||
| 3 | def parse_args(req): | ||
| 4 | req.basehref = BASEHREF | ||
| 5 | req.datadir = DATADIR | ||
| 6 | if req.path_info: path_info = req.path_info | ||
| 7 | else: path_info = '/' | ||
| 8 | location = re.sub('^/show_[a-z0-9]*/','',path_info) | ||
| 9 | location = re.sub('^/play_[a-z0-9]*/','',location) | ||
| 10 | location = re.sub('^/index/','',location) | ||
| 11 | location = re.sub('^/','',location) | ||
| 12 | location = re.sub('/$','',location) | ||
| 13 | datapath = "%s/%s" % (DATADIR,location) | ||
| 14 | respath = "%s/%s" % (DATADIR,location) | ||
| 15 | last = re.sub('/$','',location) | ||
| 16 | last = last.split('/')[-1] | ||
| 17 | first = path_info.split('/')[1] | ||
| 18 | # store some of this in the mp_request | ||
| 19 | req.location, req.datapath, req.respath = location, datapath, respath | ||
| 20 | req.first, req.last = first, last | ||
| 21 | |||
| 22 | if location: | ||
| 23 | if not (os.path.isfile(datapath) or | ||
| 24 | os.path.isdir(datapath) or | ||
| 25 | location in ['feedback','email']): | ||
| 26 | # the path was not understood | ||
| 27 | from mod_python import apache | ||
| 28 | req.write("<html> path not found %s</html>" % (datapath)) | ||
| 29 | raise apache.SERVER_RETURN, apache.OK | ||
| 30 | #from mod_python import apache | ||
| 31 | #raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 32 | |||
| 33 | def navigation(req): | ||
| 34 | """ main html navigation header """ | ||
| 35 | from mod_python import psp | ||
| 36 | req.content_type = "text/html" | ||
| 37 | parse_args(req) | ||
| 38 | datapath = req.datapath | ||
| 39 | location = req.location | ||
| 40 | |||
| 41 | # deal with session | ||
| 42 | if req.sess.is_new(): | ||
| 43 | msg = "<b>Welcome %s</b><br>" % req.sess['login'] | ||
| 44 | else: | ||
| 45 | msg = "<b>Welcome back %s</b><br>" % req.sess['login'] | ||
| 46 | |||
| 47 | # start writing | ||
| 48 | tmpl = psp.PSP(req, filename='header.tmpl') | ||
| 49 | tmpl.run(vars = { 'title': "aubioweb / %s / %s" % (req.first,location), | ||
| 50 | 'basehref': '/~piem/', | ||
| 51 | 'message': msg, | ||
| 52 | 'action': req.first}) | ||
| 53 | |||
| 54 | req.write("<h2>Content of ") | ||
| 55 | print_link(req,"","/") | ||
| 56 | y = location.split('/') | ||
| 57 | for i in range(len(y)-1): | ||
| 58 | print_link(req,"/".join(y[:i+1]),y[i]) | ||
| 59 | req.write(" / ") | ||
| 60 | req.write("%s</h2>\n" % y[-1]) | ||
| 61 | |||
| 62 | a = {'show_info' : 'info', | ||
| 63 | 'show_sound': 'waveform', | ||
| 64 | 'show_onset': 'onset', | ||
| 65 | 'index' : 'index', | ||
| 66 | 'show_pitch': 'pitch', | ||
| 67 | 'play_m3u': 'stream (m3u/ogg)', | ||
| 68 | 'play_ogg': 'save (ogg)', | ||
| 69 | 'play_wav': 'save (wav)', | ||
| 70 | } | ||
| 71 | |||
| 72 | # print task lists (only remaining tasks) | ||
| 73 | print_link(req,re.sub('%s.*'%req.last,'',location),"go up") | ||
| 74 | akeys = a.keys(); akeys.sort(); | ||
| 75 | curkey = req.first | ||
| 76 | for akey in akeys: | ||
| 77 | if akey != curkey: | ||
| 78 | req.write(":: ") | ||
| 79 | print_link(req,"/".join((akey,location)),a[akey]) | ||
| 80 | else: | ||
| 81 | req.write(":: ") | ||
| 82 | req.write("<b>%s</b>" % a[akey]) | ||
| 83 | req.write("<br>") | ||
| 84 | |||
| 85 | # list the content of the directories | ||
| 86 | listdir,listfiles = [],[] | ||
| 87 | if os.path.isdir(datapath): | ||
| 88 | listfiles = list_snd_files(datapath) | ||
| 89 | listdir = list_dirs(datapath) | ||
| 90 | listdir.pop(0) # kick the current dir | ||
| 91 | elif os.path.isfile(datapath): | ||
| 92 | listfiles = [datapath] | ||
| 93 | listdir = [re.sub(req.last,'',location)] | ||
| 94 | |||
| 95 | link_list(req,listdir,title="Subdirectories") | ||
| 96 | link_list(req,listfiles,title="Files") | ||
| 97 | |||
| 98 | def footer(req): | ||
| 99 | """ html navigation footer """ | ||
| 100 | from mod_python import psp | ||
| 101 | tmpl = psp.PSP(req, filename='footer.tmpl') | ||
| 102 | tmpl.run(vars = { 'time': -req.mtime+req.request_time }) | ||
| 103 | |||
| 104 | def apply_on_data(req, func,**keywords): | ||
| 105 | # bug: hardcoded snd file filter | ||
| 106 | act_on_data(func,req.datapath,req.respath, | ||
| 107 | filter="f -maxdepth 1 -name '*.wav' -o -name '*.aif'",**keywords) | ||
| 108 | |||
| 109 | def print_link(req,target,name,basehref=BASEHREF): | ||
| 110 | req.write("<a href='%s/%s'>%s</a>\n" % (basehref,target,name)) | ||
| 111 | |||
| 112 | def print_img(req,target,name='',basehref=BASEHREF): | ||
| 113 | if name == '': name = target | ||
| 114 | req.write("<img src='%s/%s' alt='%s' title='%s'>\n" % (basehref,target,name,name)) | ||
| 115 | |||
| 116 | def link_list(req,targetlist,basehref=BASEHREF,title=None): | ||
| 117 | if len(targetlist) > 1: | ||
| 118 | if title: req.write("<h3>%s</h3>"%title) | ||
| 119 | req.write('<ul>') | ||
| 120 | for i in targetlist: | ||
| 121 | s = re.split('%s/'%DATADIR,i,maxsplit=1)[1] | ||
| 122 | if s: | ||
| 123 | req.write('<li>') | ||
| 124 | print_link(req,s,s) | ||
| 125 | req.write('</li>') | ||
| 126 | req.write('</ul>') | ||
| 127 | |||
| 128 | def print_list(req,list): | ||
| 129 | req.write("<pre>\n") | ||
| 130 | for i in list: req.write("%s\n" % i) | ||
| 131 | req.write("</pre>\n") | ||
| 132 | |||
| 133 | def print_command(req,command): | ||
| 134 | req.write("<h4>%s</h4>\n" % re.sub('%%','%',command)) | ||
| 135 | def print_runcommand(input,output): | ||
| 136 | cmd = re.sub('(%)?%i','%s' % input, command) | ||
| 137 | cmd = re.sub('(%)?%o','%s' % output, cmd) | ||
| 138 | print_list(req,runcommand(cmd)) | ||
| 139 | apply_on_data(req,print_runcommand) | ||
| 140 | |||
| 141 | def datapath_to_location(input): | ||
| 142 | location = re.sub(DATADIR,'',input) | ||
| 143 | return re.sub('^/*','',location) | ||
| 144 | |||
| 145 | ## drawing hacks | ||
| 146 | def draw_func(req,func): | ||
| 147 | import re | ||
| 148 | req.content_type = "image/png" | ||
| 149 | # build location (strip the func_path, add DATADIR) | ||
| 150 | location = re.sub('^/draw_[a-z]*/','%s/'%DATADIR,req.path_info) | ||
| 151 | location = re.sub('.png$','',location) | ||
| 152 | if not os.path.isfile(location): | ||
| 153 | from mod_python import apache | ||
| 154 | raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 155 | # replace location in func | ||
| 156 | cmd = re.sub('(%)?%i','%s' % location, func) | ||
| 157 | # add PYTHONPATH at the beginning, | ||
| 158 | cmd = "%s%s 2> /dev/null" % (PYTHONPATH,cmd) | ||
| 159 | for each in runcommand(cmd): | ||
| 160 | req.write("%s\n"%each) | ||
| 161 | |||
| 162 | def show_task(req,task): | ||
| 163 | def show_task_file(input,output,task): | ||
| 164 | location = datapath_to_location(input) | ||
| 165 | print_img(req,"draw_%s/%s" % (task,location)) | ||
| 166 | navigation(req) | ||
| 167 | req.write("<h3>%s</h3>\n" % task) | ||
| 168 | apply_on_data(req,show_task_file,task=task) | ||
| 169 | footer(req) | ||
| 170 | |||
| 171 | ## waveform_foo | ||
| 172 | def draw_sound(req): | ||
| 173 | #draw_func(req,"aubioplot-audio %%i stdout 2> /dev/null") | ||
| 174 | draw_func(req,"gdtest %%i 2> /dev/null") | ||
| 175 | |||
| 176 | def show_sound(req): | ||
| 177 | show_task(req,"sound") | ||
| 178 | |||
| 179 | ## pitch foo | ||
| 180 | def draw_pitch(req,threshold='0.3'): | ||
| 181 | draw_func(req,"aubiopitch -i %%i -p -m yin -t %s -O stdout -B 2048 -H 1024" % threshold) | ||
| 182 | |||
| 183 | def show_pitch(req): | ||
| 184 | show_task(req,"pitch") | ||
| 185 | |||
| 186 | ## onset foo | ||
| 187 | def draw_onset(req,threshold='0.3'): | ||
| 188 | draw_func(req,"aubiocut -i %%i -p -m complex -t %s -O stdout" % threshold) | ||
| 189 | |||
| 190 | def show_onset(req,threshold='0.3',details=''): | ||
| 191 | def onset_file(input,output): | ||
| 192 | location = datapath_to_location(input) | ||
| 193 | print_img(req,"draw_onset/%s?threshold=%s"%(location,threshold)) | ||
| 194 | print_link(req,"?threshold=%s" % (float(threshold)-0.1),"-") | ||
| 195 | req.write("%s\n" % threshold) | ||
| 196 | print_link(req,"?threshold=%s" % (float(threshold)+0.1),"+") | ||
| 197 | # bug: hardcoded sndfile extension | ||
| 198 | anote = re.sub('\.wav$','.txt',input) | ||
| 199 | if anote == input: anote = "" | ||
| 200 | res = get_extract(input,threshold) | ||
| 201 | if os.path.isfile(anote): | ||
| 202 | tru = get_anote(anote) | ||
| 203 | print_list(req,get_results(tru,res,0.05)) | ||
| 204 | else: | ||
| 205 | req.write("no ground truth found<br>\n") | ||
| 206 | if details: | ||
| 207 | req.write("<h4>Extraction</h4>\n") | ||
| 208 | print_list(req,res) | ||
| 209 | else: | ||
| 210 | req.write("<a href='%s/show_onset/%s?details=yes&threshold=%s'>details</a><br>\n" % | ||
| 211 | (req.basehref,location,threshold)) | ||
| 212 | if details and os.path.isfile(anote): | ||
| 213 | req.write("<h4>Computed differences</h4>\n") | ||
| 214 | ldiffs = get_diffs(tru,res,0.05) | ||
| 215 | print_list(req,ldiffs) | ||
| 216 | req.write("<h4>Annotations</h4>\n") | ||
| 217 | print_list(req,tru) | ||
| 218 | navigation(req) | ||
| 219 | req.write("<h3>Onset</h3>\n") | ||
| 220 | apply_on_data(req,onset_file) | ||
| 221 | footer(req) | ||
| 222 | |||
| 223 | def get_anote(anote): | ||
| 224 | import aubio.onsetcompare | ||
| 225 | # FIXME: should import with txtfile.read_datafile | ||
| 226 | return aubio.onsetcompare.load_onsets(anote) | ||
| 227 | |||
| 228 | def get_diffs(anote,extract,tol): | ||
| 229 | import aubio.onsetcompare | ||
| 230 | return aubio.onsetcompare.onset_diffs(anote,extract,tol) | ||
| 231 | |||
| 232 | def get_extract(datapath,threshold='0.3'): | ||
| 233 | cmd = "%saubiocut -v -m complex -t %s -i %s" % (PYTHONPATH,threshold,datapath) | ||
| 234 | lo = runcommand(cmd) | ||
| 235 | for i in range(len(lo)): lo[i] = float(lo[i]) | ||
| 236 | return lo | ||
| 237 | |||
| 238 | def get_results(anote,extract,tol): | ||
| 239 | import aubio.onsetcompare | ||
| 240 | orig, missed, merged, expc, bad, doubled = aubio.onsetcompare.onset_roc(anote,extract,tol) | ||
| 241 | s =("GD %2.8f\t" % (100*float(orig-missed-merged)/(orig)), | ||
| 242 | "FP %2.8f\t" % (100*float(bad+doubled)/(orig)) , | ||
| 243 | "GD-merged %2.8f\t" % (100*float(orig-missed)/(orig)) , | ||
| 244 | "FP-pruned %2.8f\t" % (100*float(bad)/(orig)) ) | ||
| 245 | return s | ||
| 246 | |||
| 247 | # play m3u foo | ||
| 248 | def play_m3u(req): | ||
| 249 | def show_task_file(input,output,task): | ||
| 250 | location = datapath_to_location(input) | ||
| 251 | req.write("http://%s%s/play_ogg/%s\n" % (HOSTNAME,BASEHREF,re.sub("play_m3u",task,location))) | ||
| 252 | req.content_type = "audio/mpegurl" | ||
| 253 | parse_args(req) | ||
| 254 | apply_on_data(req,show_task_file,task="play_ogg") | ||
| 255 | |||
| 256 | # play wav foo | ||
| 257 | def play_wav(req): | ||
| 258 | req.content_type = "audio/x-wav" | ||
| 259 | func = "cat %%i" | ||
| 260 | # build location (strip the func_path, add DATADIR) | ||
| 261 | location = re.sub('^/play_wav/','%s/'%DATADIR,req.path_info) | ||
| 262 | if not os.path.isfile(location): | ||
| 263 | from mod_python import apache | ||
| 264 | raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 265 | # replace location in func | ||
| 266 | cmd = re.sub('(%)?%i','%s' % location, func) | ||
| 267 | # add PYTHONPATH at the beginning, | ||
| 268 | cmd = "%s 2> /dev/null" % cmd | ||
| 269 | for each in runcommand(cmd): | ||
| 270 | req.write("%s\n"%each) | ||
| 271 | |||
| 272 | # play ogg foo | ||
| 273 | def play_ogg(req): | ||
| 274 | req.content_type = "application/ogg" | ||
| 275 | func = "oggenc -o - %%i" | ||
| 276 | # build location (strip the func_path, add DATADIR) | ||
| 277 | location = re.sub('^/play_ogg/','%s/'%DATADIR,req.path_info) | ||
| 278 | location = re.sub('.ogg$','',location) | ||
| 279 | if not os.path.isfile(location): | ||
| 280 | from mod_python import apache | ||
| 281 | raise apache.SERVER_RETURN, apache.HTTP_NOT_FOUND | ||
| 282 | # replace location in func | ||
| 283 | cmd = re.sub('(%)?%i','%s' % location, func) | ||
| 284 | # add PYTHONPATH at the beginning, | ||
| 285 | cmd = "%s 2> /dev/null" % cmd | ||
| 286 | for each in runcommand(cmd): | ||
| 287 | req.write("%s\n"%each) | ||
| @@ -0,0 +1,113 @@ | |||
| 1 | #!/usr/bin/python | ||
| 2 | |||
| 3 | doc = """ | ||
| 4 | This script works with mod_python to browse a collection of annotated wav files | ||
| 5 | and results. | ||
| 6 | |||
| 7 | you will need to have at least the following packages need to be installed (the | ||
| 8 | name of the command line tool is precised in parenthesis): | ||
| 9 | |||
| 10 | libapache-mod-python (apache2 prefered) | ||
| 11 | sndfile-programs (sndfile-info) | ||
| 12 | vorbis-tools (oggenc) | ||
| 13 | python-gnuplot | ||
| 14 | python-numarray | ||
| 15 | |||
| 16 | Try the command line tools in aubio/python to test your installation. | ||
| 17 | |||
| 18 | NOTE: this script is probably horribly insecure. | ||
| 19 | |||
| 20 | example configuration for apache to put in your preferred virtual host. | ||
| 21 | |||
| 22 | <Directory /home/piem/public_html/aubioweb> | ||
| 23 | # Minimal config | ||
| 24 | AddHandler mod_python .py | ||
| 25 | # Disable these in production | ||
| 26 | PythonDebug On | ||
| 27 | PythonAutoReload on | ||
| 28 | # Default handler in url | ||
| 29 | PythonHandler aubioweb | ||
| 30 | ## Authentication stuff (optional) | ||
| 31 | #PythonAuthenHandler aubioweb | ||
| 32 | #AuthType Basic | ||
| 33 | #AuthName "Restricted Area" | ||
| 34 | #require valid-user | ||
| 35 | # make default listing | ||
| 36 | DirectoryIndex aubioweb/ | ||
| 37 | </Directory> | ||
| 38 | |||
| 39 | """ | ||
| 40 | |||
| 41 | from aubio.web.html import * | ||
| 42 | |||
| 43 | def handler(req): | ||
| 44 | from aubio.web.browser import * | ||
| 45 | from mod_python import Session | ||
| 46 | req.sess = Session.Session(req) | ||
| 47 | req.sess['login']='new aubio user' | ||
| 48 | req.sess.save() | ||
| 49 | return configure_handler(req,index) | ||
| 50 | |||
| 51 | def index(req,threshold='0.3'): | ||
| 52 | navigation(req) | ||
| 53 | print_command(req,"sfinfo %%i") | ||
| 54 | return footer(req) | ||
| 55 | |||
| 56 | def show_info(req,verbose=''): | ||
| 57 | navigation(req) | ||
| 58 | print_command(req,"sndfile-info %%i") | ||
| 59 | return footer(req) | ||
| 60 | |||
| 61 | def feedback(req): | ||
| 62 | navigation(req) | ||
| 63 | req.write(""" | ||
| 64 | Please provide feedback below: | ||
| 65 | <p> | ||
| 66 | <form action="/~piem/aubioweb/email" method="POST"> | ||
| 67 | Name: <input type="text" name="name"><br> | ||
| 68 | Email: <input type="text" name="email"><br> | ||
| 69 | Comment: <textarea name="comment" rows=4 cols=20></textarea><br> | ||
| 70 | <input type="submit"> | ||
| 71 | </form> | ||
| 72 | """) | ||
| 73 | |||
| 74 | WEBMASTER='piem@calabaza' | ||
| 75 | SMTP_SERVER='localhost' | ||
| 76 | |||
| 77 | def email(req,name,email,comment): | ||
| 78 | import smtplib | ||
| 79 | # make sure the user provided all the parameters | ||
| 80 | if not (name and email and comment): | ||
| 81 | return "A required parameter is missing, \ | ||
| 82 | please go back and correct the error" | ||
| 83 | # create the message text | ||
| 84 | msg = """\ | ||
| 85 | From: %s | ||
| 86 | Subject: feedback | ||
| 87 | To: %s | ||
| 88 | |||
| 89 | I have the following comment: | ||
| 90 | |||
| 91 | %s | ||
| 92 | |||
| 93 | Thank You, | ||
| 94 | |||
| 95 | %s | ||
| 96 | |||
| 97 | """ % (email, WEBMASTER, comment, name) | ||
| 98 | # send it out | ||
| 99 | conn = smtplib.SMTP(SMTP_SERVER) | ||
| 100 | try: | ||
| 101 | conn.sendmail(email, [WEBMASTER], msg) | ||
| 102 | except smtplib.SMTPSenderRefused: | ||
| 103 | return """<html>please provide a valid email</html>""" | ||
| 104 | |||
| 105 | conn.quit() | ||
| 106 | # provide feedback to the user | ||
| 107 | s = """\ | ||
| 108 | <html> | ||
| 109 | Dear %s,<br> | ||
| 110 | Thank You for your kind comments, we | ||
| 111 | will get back to you shortly. | ||
| 112 | </html>""" % name | ||
| 113 | return s | ||