def success_upload(self, exitcode, swf, thumbnail, form, request): """Catch results of the process. If it seems to have worked, register the new thing.""" if exitcode: #request.write(exitcode) return self.failure_upload(exitcode, swf, thumbnail, form, request) # if the name is in use, mangle it until it is not. #XXX this is not perfect, but # a) it is kinder than making the person resubmit, without actually # telling them what a valid name would be. # b) it doens't actually matter what the name is. #natasha check name name = form.get('name', '') while self.name_is_used(name): name += random.choice('1234567890') #Added by Heath, Karena, Corey 26/08/2011 - added to store tags from the form tags = form.get('tags','') # if the thumbnail is not working (usually due to an swf file # being uploaded, which the img2swf script doesn't know how to # thumbnail), detect it now and delete it. has_streaming = form.get('hasstreaming','false') streamtype = form.get('streamtype','auto') streamserver = form.get('streamserver','') streamname = form.get('streamname','') log.msg("success_upload(): has streaming? %s" % has_streaming) log.msg("success_upload(): streamtype: %s" % streamtype) log.msg("success_upload(): streamserver: %s" % streamserver) log.msg("success_upload(): streamname: %s" % streamname) medium = '' if (has_streaming.lower() == 'true'): medium = 'stream' log.msg("success_upload(): medium: %s" % medium) # FIXME why determine mimetype of thumbnail only? # natasha add to dictionary thumbnail_full = os.path.join(config.THUMBNAILS_DIR, thumbnail) #_pin, pipe = os.popen4(('file', '-ib', thumbnail_full)) _pin, pipe = os.popen4(('file', '--brief', '--mime-type', thumbnail_full)) mimetype = str(pipe.read()).strip() pipe.close() now = datetime.datetime.now() # AC () - Unformated datetime value # FIXME insecure mimetype detection! log.msg("success_upload(): mimetype (thumbnail) = %s" % mimetype) swf_mimetypes = ["application/x-shockwave-flash"] image_mimetypes = ["image/jpeg","image/gif","image/png"] log.msg("success_upload(): image mimetypes: %s" % image_mimetypes) log.msg("success_upload(): swf mimetypes: %s" % swf_mimetypes) is_image = mimetype in image_mimetypes is_swf = mimetype in swf_mimetypes log.msg("success_upload(): mimetype: is_image = %s" % is_image) log.msg("success_upload(): mimetype: is_swf = %s" % is_swf) voice = form.get('voice','') log.msg("success_upload(): swf = %s" % swf) log.msg("success_upload(): form: name = %s" % name) log.msg("success_upload(): form: tags = %s" % tags) log.msg("success_upload(): thumbnail_full = %s" % thumbnail_full) log.msg("success_upload(): now = %s" % now) log.msg("success_upload(): voice = %s" % voice) size_x = '' size_y = '' # get actual swf width and height from the file if swf.endswith('.swf'): size_x = commands.getoutput("swfdump -X html/media/" + swf).split()[1]; size_y = commands.getoutput("swfdump -Y html/media/" + swf).split()[1]; success_message = '' if form.get('mode', '') == 'replace': oldfilename = form.get('oldfile') key = form.get('key') media = self.media_dict[key] setattr(media, 'file', swf) setattr(media, 'uploader', self.player.name) setattr(media, 'dateTime', now.strftime("%d/%m/%y @ %I:%M %p")) setattr(media, 'width', size_x) setattr(media, 'height', size_y) # thumbnail conversion is currently broken - not really converted # if is_image: # media.setThumbnail(config.THUMBNAILS_URL + thumbnail) media.setThumbnail('') media.setUrl(swf) self.media_dict.save() success_message = 'Your Media "' + form.get('name') + '" has been replaced successfully! ' # refresh assigned stages stages = form.get('stages', '') if stages: success_message += 'The following stage(s) has been reloaded:<strong> ' + stages +'</strong>.<br />' reloadStagesInList(self.stages, stages.split(', ')) success_message += 'Redirecting back to <a href="admin/workshop/mediaedit">Media Management...</a>' redirectTo = 'mediaedit' else: # upload new assets key = unique_custom_string(prefix=self.mediatype+'_', suffix='') # if not mimetype.startswith('image/'): if not is_image: self.media_dict.add(file=swf, name=name, voice=form.get('voice', ''), # AC (10.04.08) - This section needs uploader and dateTime also. uploader=self.player.name, dateTime=(now.strftime("%d/%m/%y @ %I:%M %p")), tags=tags, # Corey, Heath, Karena 24/08/2011 - Added for tagging media streamserver=streamserver, streamname=streamname, medium=medium, width=size_x, height=size_y, key=key ) else: #Corey, Heath, Karena 24/08/2011 self.media_dict.add(file=swf, name=name, voice=form.get('voice', ''), thumbnail=config.THUMBNAILS_URL + thumbnail, # AC (29.09.07) - Passed values to be added to media XML files. uploader=self.player.name, dateTime=(now.strftime("%d/%m/%y @ %I:%M %p")), tags=tags, # Corey, Heath, Karena 24/08/2011 - Added for tagging media streamserver=streamserver, streamname=streamname, medium=medium, width=size_x, height=size_y, key=key ) log.msg("success_upload(): got past media_dict.add, YES") #form['media'] = swf # NB: doing external redirect, but really there's no need! # could just call the other pages render method # assign_media_to_stages() #def _value(x): # return form.get(x, [None]) # assign to stage? self.media_dict = self.mediatypes[self.mediatype] if self.assignedstages is not None: log.msg("success_upload(): assigning to stages: %s" % self.assignedstages) self.assign_media_to_stages(self.assignedstages, key, self.mediatype) #self.refresh(request, swf) success_message = 'Your Media "' + name + '" has uploaded successfully' redirectTo = 'mediaupload' request.write(successpage(request, success_message, redirect=redirectTo)) request.finish()
class SwfConversionWrapper(Resource): """Start a subprocess to convert an image into swf. Upon completion of the process, redirect to NewAvatar page. Form should contain these elements: - name - name of the uploaded thing - contents - file contents of uploaded thing - type - media type May have: - voice - avatar voice - editmode - ' merely editing' signals non conversion, just metadata changes. """ isLeaf = True def __init__(self, mediatypes, player, stages): Resource.__init__(self) self.mediatypes = mediatypes # Alan (14/09/07) - Gets the player trying to upload self.player = player self.assignedstages = '' #natasha self.mediatype = '' # Natasha trying to make it a global variable self.stages = stages def render(self, request): """Don't actually render, but calls a process which returns a deferred. Callbacks on the deferred do the rendering, which is actually achieved through redirection. """ # natasha convert # turn form into simple dictionary, dropping multiple values. reqargs = request.args self.assignedstages = reqargs.get('assigned') form = dict([(k, v[0]) for k,v in request.args.iteritems()]) # DEBUG: print form sent by request for key in form.iterkeys(): if 'contents' in key: value = "[ binary data: %s Bytes ]" % len(form[key]) else: value = form[key] if(len(value)>256): value = value[:256] + " ... " # limit length to 256 chars value = "'" + value + "'" log.msg("SwfConversionWrapper render(): form: '%s' = %s" % (key, value)) # FIXME: trim spaces from form values? (#104) # handle kind of images: upload or library: imagetype = form.get('imagetype','unknown') # handle upload imagetype if imagetype == 'upload': log.msg('SwfConversionWrapper: render(): imagetype UPLOAD') # natasha: added prefix value prefix = '' try: self.mediatype = form.pop('type', None) if not self.mediatype in self.mediatypes: raise UpstageError('Not a real kind of thing: %s' % self.mediatype) self.media_dict = self.mediatypes[self.mediatype] #self.media_dict = self.collections # change to starswith 'avcontents' if self.mediatype == 'avatar': prefix = 'av' # self.media_dict = self.collection.avatars elif self.mediatype == 'prop': prefix = 'pr' elif self.mediatype == 'backdrop': prefix = 'bk' elif self.mediatype == 'audio': # remem audio not included as things prefix = 'au' # imgs = [ (k, v) for k, v in form.iteritems() if k.startswith('contents') and v ] contentname = prefix + 'contents' imgs = [ (k, v) for k, v in form.iteritems() if k.startswith(contentname) and v ] imgs.sort() # DEBUG: #log.msg("SwfConversionWrapper: imgs = %s" % imgs); # save input files in /tmp, also save file names tfns = [ save_tempfile(x[1]) for x in imgs ] # Alan (12/09/07) ==> Gets the size of image files using the previously created temp filenames. # natasha getfilesize fileSizes = getFileSizes(tfns) swf = unique_custom_string(suffix='.swf') if form.get('mode', '') == 'replace': oldfile = form.get('oldfile') try: self.media_dict.deleteFile(oldfile) except KeyError: log.msg('the file does not exist. nothing was deleted.') request.write(errorpage(request, 'The file you want to replace does not exist. Accidentally pressed the back button? Tut, tut..', 'mediaedit')) request.finish() thumbnail = swf.replace('.swf', '.jpg') # FIXME: see #20 (Uploaded media is not converted to JPEG) swf_full = os.path.join(config.MEDIA_DIR, swf) thumbnail_full = os.path.join(config.THUMBNAILS_DIR, thumbnail) except UpstageError, e: return errorpage(request, e, 'mediaupload') """ Alan (13/09/07) ==> Check the file sizes of avatar frame """ # natasha continue conversion if not (fileSizes is None): if validSizes(fileSizes, self.player.can_upload_big_file()): # call the process with swf filename and temp image filenames d = getProcessValue(config.IMG2SWF_SCRIPT, args=[swf_full, thumbnail_full] + tfns) args = (swf, thumbnail, form, request) d.addCallbacks(self.success_upload, self.failure_upload, args, {}, args, {}) d.addBoth(self.cleanup_upload, tfns) d.setTimeout(config.MEDIA_TIMEOUT, timeoutFunc=d.errback) d.addErrback(log.err) # Make sure errors get logged - TODO is this working? else: redirect = 'mediaupload' if form.get('mode', '') == 'replace': redirect = 'mediaedit' self.media_dict.restoreOldFile(form.get('oldfile')) ''' Send new avatar page back containing error message ''' self.player.set_setError(True) self.cleanup_upload(None, tfns) request.write(errorpage(request, 'You do not have the permission to upload a file over 1MB in size.', redirect)) # request.redirect('/admin/new/%s' %(self.mediatype)) request.finish() #return server.NOT_DONE_YET # handle library imagetype elif imagetype == 'library': log.msg('SwfConversionWrapper: render(): imagetype LIBRARY') name = form.get('name', '') while self.name_is_used(name): name += random.choice('1234567890') tags = form.get('tags','') has_streaming = form.get('hasstreaming','false') streamtype = form.get('streamtype','auto') streamserver = form.get('streamserver','') streamname = form.get('streamname','') medium = '' if (has_streaming.lower() == 'true'): medium = 'stream' now = datetime.datetime.now() voice = form.get('voice','') # create random strings for library items random_swf_id = util.random_string(config.LIBRARY_ID_LENGTH) random_thumbnail_id = util.random_string(config.LIBRARY_ID_LENGTH) # FIXME test if generated strings already exist, so choose another # set thumbnail according to streamtype thumbnail_image = 'IconLiveStream' # default if streamtype == 'audio': thumbnail_image = 'IconAudioStream' elif streamtype == 'video': thumbnail_image = 'IconVideoStream' thumbnail = config.LIBRARY_PREFIX + random_thumbnail_id + ":" + thumbnail_image swf_image = 'VideoOverlay' swf = config.LIBRARY_PREFIX + random_swf_id + ":" + swf_image log.msg("render(): has streaming? %s" % has_streaming) log.msg("render(): streamtype: %s" % streamtype) log.msg("render(): streamserver: %s" % streamserver) log.msg("render(): streamname: %s" % streamname) log.msg("render(): swf (file): %s" % swf) log.msg("render(): name: %s" % name) log.msg("render(): voice: %s" % voice) log.msg("render(): now: %s" % now) log.msg("render(): tags: %s" % tags) log.msg("render(): medium: %s" % medium) log.msg("render(): thumbnail: %s" % thumbnail) log.msg("render(): swf: %s" % swf) try: self.mediatype = form.pop('type', None) if not self.mediatype in self.mediatypes: raise UpstageError('Not a real kind of thing: %s' % self.mediatype) self.media_dict = self.mediatypes[self.mediatype] key = unique_custom_string(prefix=self.mediatype+'_', suffix='') # add avatar self.media_dict.add(file=swf, name=name, voice=voice, uploader=self.player.name, dateTime=(now.strftime("%d/%m/%y @ %I:%M %p")), tags=tags, streamserver=streamserver, streamname=streamname, medium=medium, thumbnail=thumbnail, key=key ) # assign to stage? if self.assignedstages is not None: log.msg("render(): assigning to stages: %s" % self.assignedstages) self.assign_media_to_stages(self.assignedstages, key, self.mediatype) except UpstageError, e: return errorpage(request, e, 'mediaupload')
def render(self, request): """Don't actually render, but calls a process which returns a deferred. Callbacks on the deferred do the rendering, which is actually achieved through redirection. """ # natasha convert # turn form into simple dictionary, dropping multiple values. reqargs = request.args self.assignedstages = reqargs.get('assigned') form = dict([(k, v[0]) for k,v in request.args.iteritems()]) # DEBUG: print form sent by request for key in form.iterkeys(): if 'contents' in key: value = "[ binary data: %s Bytes ]" % len(form[key]) else: value = form[key] if(len(value)>256): value = value[:256] + " ... " # limit length to 256 chars value = "'" + value + "'" log.msg("SwfConversionWrapper render(): form: '%s' = %s" % (key, value)) # FIXME: trim spaces from form values? (#104) # handle kind of images: upload or library: imagetype = form.get('imagetype','unknown') # handle upload imagetype if imagetype == 'upload': log.msg('SwfConversionWrapper: render(): imagetype UPLOAD') # natasha: added prefix value prefix = '' try: self.mediatype = form.pop('type', None) if not self.mediatype in self.mediatypes: raise UpstageError('Not a real kind of thing: %s' % self.mediatype) self.media_dict = self.mediatypes[self.mediatype] #self.media_dict = self.collections # change to starswith 'avcontents' if self.mediatype == 'avatar': prefix = 'av' # self.media_dict = self.collection.avatars elif self.mediatype == 'prop': prefix = 'pr' elif self.mediatype == 'backdrop': prefix = 'bk' elif self.mediatype == 'audio': # remem audio not included as things prefix = 'au' # imgs = [ (k, v) for k, v in form.iteritems() if k.startswith('contents') and v ] contentname = prefix + 'contents' imgs = [ (k, v) for k, v in form.iteritems() if k.startswith(contentname) and v ] imgs.sort() # DEBUG: #log.msg("SwfConversionWrapper: imgs = %s" % imgs); # save input files in /tmp, also save file names tfns = [ save_tempfile(x[1]) for x in imgs ] # Alan (12/09/07) ==> Gets the size of image files using the previously created temp filenames. # natasha getfilesize fileSizes = getFileSizes(tfns) swf = unique_custom_string(suffix='.swf') if form.get('mode', '') == 'replace': oldfile = form.get('oldfile') try: self.media_dict.deleteFile(oldfile) except KeyError: log.msg('the file does not exist. nothing was deleted.') request.write(errorpage(request, 'The file you want to replace does not exist. Accidentally pressed the back button? Tut, tut..', 'mediaedit')) request.finish() thumbnail = swf.replace('.swf', '.jpg') # FIXME: see #20 (Uploaded media is not converted to JPEG) swf_full = os.path.join(config.MEDIA_DIR, swf) thumbnail_full = os.path.join(config.THUMBNAILS_DIR, thumbnail) except UpstageError, e: return errorpage(request, e, 'mediaupload') """ Alan (13/09/07) ==> Check the file sizes of avatar frame """ # natasha continue conversion if not (fileSizes is None): if validSizes(fileSizes, self.player.can_upload_big_file()): # call the process with swf filename and temp image filenames d = getProcessValue(config.IMG2SWF_SCRIPT, args=[swf_full, thumbnail_full] + tfns) args = (swf, thumbnail, form, request) d.addCallbacks(self.success_upload, self.failure_upload, args, {}, args, {}) d.addBoth(self.cleanup_upload, tfns) d.setTimeout(config.MEDIA_TIMEOUT, timeoutFunc=d.errback) d.addErrback(log.err) # Make sure errors get logged - TODO is this working? else: redirect = 'mediaupload' if form.get('mode', '') == 'replace': redirect = 'mediaedit' self.media_dict.restoreOldFile(form.get('oldfile')) ''' Send new avatar page back containing error message ''' self.player.set_setError(True) self.cleanup_upload(None, tfns) request.write(errorpage(request, 'You do not have the permission to upload a file over 1MB in size.', redirect)) # request.redirect('/admin/new/%s' %(self.mediatype)) request.finish()
def render(self, request): #XXX not checking rights. args = request.args # FIXME see SwfConversionWrapper: prepare form data # FIXME: trim spaces from form values? (#104) # Natasha - get assigned stages self.assignedstages = request.args.get('assigned') name = args.pop('name',[''])[0] audio = args.pop('aucontents0', [''])[0] #was 'audio' before, aucontents0 is the name of the mp3 file field type = args.pop('audio_type', [''])[0] mediatype = args.pop('type',['audio'])[0] self.message = 'Audio file uploaded & registered as %s, called %s. ' % (type, name) #Corey, Heath, Karena 24/08/2011 - Added to store tags for this audiothing self.tags = args.pop('tags',[''])[0] # PQ & EB Added 13.10.07 # Chooses a thumbnail image depending on type (adds to audios.xml file) if type == 'sfx': thumbnail = config.SFX_ICON_IMAGE_URL else: thumbnail = config.MUSIC_ICON_IMAGE_URL self.media_dict = self.mediatypes[mediatype] mp3name = unique_custom_string(suffix=".mp3") mode = args.pop('mode', [''])[0] oldfile = args.pop('oldfile', [''])[0] if mode == 'replace': key = args.pop('key')[0] try: self.media_dict.deleteFile(oldfile) except KeyError: log.msg('the file does not exist. nothing was deleted.') request.write(errorpage(request, 'The file you want to replace does not exist. Accidentally pressed the back button? Tut, tut..', 'mediaedit')) request.finish() the_url = config.AUDIO_DIR +"/"+ mp3name file = open(the_url, 'wb') file.write(audio) file.close() filenames = [the_url] # Alan (09/05/08) ==> Gets the size of audio files using the previously created temp filenames. fileSizes = getFileSizes(filenames) from mad import MadFile duration = MadFile(the_url).total_time() if not (fileSizes is None and duration > 0): if validSizes(fileSizes, self.player.can_upload_big_file()): now = datetime.datetime.now() # AC () - Unformated datetime value duration = str(duration/float(1000)) success_message = '' if mode == 'replace': media = self.media_dict[key] media.setUrl(mp3name) setattr(media, 'file', mp3name) setattr(media, 'width', duration) # Ing - width attribute is already there setattr(media, 'uploader', self.player.name) setattr(media, 'dateTime', now.strftime("%d/%m/%y @ %I:%M %p")) self.media_dict.save() success_message = 'Your Media "' + name + '" has been replaced successfully! ' # refresh assigned stages stages = args.pop('stages', [''])[0] if stages: success_message += 'The following stage(s) has been reloaded:<strong> ' + stages +'</strong>.<br />' reloadStagesInList(self.stages, stages.split(', '), media.url) success_message += 'Redirecting back to <a href="admin/workshop/mediaedit">Media Management...</a>' redirectTo = 'mediaedit' else: key = unique_custom_string(prefix='audio_', suffix='') while self.name_is_used(name): name += random.choice('1234567890') # upload new assets self.media_dict.add(url='%s/%s' % (config.AUDIO_SUBURL, mp3name), #XXX dodgy? (windows safe?) file=mp3name, name=name, voice="", thumbnail=thumbnail, # PQ: 13.10.07 was "" medium="%s" %(type), # AC (14.08.08) - Passed values to be added to media XML files. uploader=self.player.name, dateTime=(now.strftime("%d/%m/%y @ %I:%M %p")), tags=self.tags, #Corey, Heath, Karena 24/08/2011 - Added for media tagging set the tags to self.tags key=key, width=duration) # Ing - width attribute is already there, width-length-length-width, kinda similar ;p if self.assignedstages is not None: for x in self.assignedstages: self.media_dict.set_media_stage(x, key) redirectTo = 'mediaupload' success_message = 'Your Media "' + name + '" has uploaded successfully' request.write(successpage(request, success_message, redirect=redirectTo)) request.finish() else: try: ''' Send new audio page back containing error message ''' """ self.player.set_setError(True) os.remove(the_url) request.redirect('/admin/new/%s' %(mediatype)) request.finish() """ errMsg = 'File over 1MB' #Change error message to file exceed - Gavin if mode == 'replace': errMsg += ' Your media was not replaced.' # restore old file self.media_dict.restoreOldFile(oldfile) AdminError.errorMsg = errMsg request.write(errorpage(request, 'Media uploads are limited to files of 1MB or less, \ to help ensure that unnecessarily large files do not cause long loading times for your stage. \ Please make your file smaller or, if you really need to upload a larger file, \ contact the administrator of this server to ask for permission.', 'mediaupload')) request.finish() except OSError, e: log.err("Error removing temp file %s (already gone?):\n %s" % (tfn, e))