Example #1
0
    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()
Example #2
0
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')
Example #3
0
    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()
Example #4
0
    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))