Example #1
0
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        raise BadRequest()

    if not check_file_field(request, 'file'):
        _log.debug('File field not found')
        raise BadRequest()

    upload_limit, max_file_size = get_upload_file_limits(request.user)

    callback_url = request.form.get('callback_url')
    if callback_url:
        callback_url = unicode(callback_url)
    try:
        entry = submit_media(mg_app=request.app,
                             user=request.user,
                             submitted_file=request.files['file'],
                             filename=request.files['file'].filename,
                             title=unicode(request.form.get('title')),
                             description=unicode(
                                 request.form.get('description')),
                             license=unicode(request.form.get('license', '')),
                             tags_string=unicode(request.form.get('tags', '')),
                             upload_limit=upload_limit,
                             max_file_size=max_file_size,
                             callback_url=callback_url)

        return json_response(get_entry_serializable(entry, request.urlgen))

    # Handle upload limit issues
    except FileUploadLimit:
        raise BadRequest(_(u'Sorry, the file size is too big.'))
    except UserUploadLimit:
        raise BadRequest(
            _('Sorry, uploading this file will put you over your'
              ' upload limit.'))
    except UserPastUploadLimit:
        raise BadRequest(_('Sorry, you have reached your upload limit.'))

    except Exception as e:
        '''
        This section is intended to catch exceptions raised in
        mediagoblin.media_types
        '''
        if isinstance(e, InvalidFileType) or \
                isinstance(e, FileTypeNotSupported):
            raise BadRequest(unicode(e))
        else:
            raise
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        raise BadRequest()

    if not 'file' in request.files \
            or not isinstance(request.files['file'], FileStorage) \
            or not request.files['file'].stream:
        _log.debug('File field not found')
        raise BadRequest()

    media_file = request.files['file']

    media_type, media_manager = sniff_media(media_file)

    entry = request.db.MediaEntry()
    entry.media_type = unicode(media_type)
    entry.title = unicode(request.form.get('title')
            or splitext(media_file.filename)[0])

    entry.description = unicode(request.form.get('description'))
    entry.license = unicode(request.form.get('license', ''))

    entry.uploader = request.user.id

    entry.generate_slug()

    # queue appropriately
    queue_file = prepare_queue_task(request.app, entry, media_file.filename)

    with queue_file:
        queue_file.write(request.files['file'].stream.read())

    # Save now so we have this data before kicking off processing
    entry.save()

    if request.form.get('callback_url'):
        metadata = request.db.ProcessingMetaData()
        metadata.media_entry = entry
        metadata.callback_url = unicode(request.form['callback_url'])
        metadata.save()

    # Pass off to processing
    #
    # (... don't change entry after this point to avoid race
    # conditions with changes to the document via processing code)
    run_process_media(entry)

    return json_response(get_entry_serializable(entry, request.urlgen))
Example #3
0
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        raise BadRequest()

    if not check_file_field(request, 'file'):
        _log.debug('File field not found')
        raise BadRequest()

    upload_limit, max_file_size = get_upload_file_limits(request.user)

    callback_url = request.form.get('callback_url')
    if callback_url:
        callback_url = unicode(callback_url)
    try:
        entry = submit_media(
            mg_app=request.app, user=request.user,
            submitted_file=request.files['file'],
            filename=request.files['file'].filename,
            title=unicode(request.form.get('title')),
            description=unicode(request.form.get('description')),
            license=unicode(request.form.get('license', '')),
            upload_limit=upload_limit, max_file_size=max_file_size,
            callback_url=callback_url)

        return json_response(get_entry_serializable(entry, request.urlgen))

    # Handle upload limit issues
    except FileUploadLimit:
        raise BadRequest(
            _(u'Sorry, the file size is too big.'))
    except UserUploadLimit:
        raise BadRequest(
            _('Sorry, uploading this file will put you over your'
              ' upload limit.'))
    except UserPastUploadLimit:
        raise BadRequest(
            _('Sorry, you have reached your upload limit.'))

    except Exception as e:
        '''
        This section is intended to catch exceptions raised in
        mediagoblin.media_types
        '''
        if isinstance(e, InvalidFileType) or \
                isinstance(e, FileTypeNotSupported):
            raise BadRequest(unicode(e))
        else:
            raise
Example #4
0
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        raise BadRequest()

    if not check_file_field(request, 'file'):
        _log.debug('File field not found')
        raise BadRequest()

    media_file = request.files['file']

    media_type, media_manager = sniff_media(media_file)

    entry = new_upload_entry(request.user)
    entry.media_type = unicode(media_type)
    entry.title = unicode(
        request.form.get('title') or splitext(media_file.filename)[0])

    entry.description = unicode(request.form.get('description'))
    entry.license = unicode(request.form.get('license', ''))

    entry.generate_slug()

    # queue appropriately
    queue_file = prepare_queue_task(request.app, entry, media_file.filename)

    with queue_file:
        queue_file.write(request.files['file'].stream.read())

    # Save now so we have this data before kicking off processing
    entry.save()

    if request.form.get('callback_url'):
        metadata = request.db.ProcessingMetaData()
        metadata.media_entry = entry
        metadata.callback_url = unicode(request.form['callback_url'])
        metadata.save()

    # Pass off to processing
    #
    # (... don't change entry after this point to avoid race
    # conditions with changes to the document via processing code)
    feed_url = request.urlgen('mediagoblin.user_pages.atom_feed',
                              qualified=True,
                              user=request.user.username)
    run_process_media(entry, feed_url)

    return json_response(get_entry_serializable(entry, request.urlgen))
Example #5
0
def post_entry(request):
    _log.debug("Posting entry")

    if request.method == "OPTIONS":
        return json_response({"status": 200})

    if request.method != "POST":
        _log.debug("Must POST against post_entry")
        raise BadRequest()

    if not check_file_field(request, "file"):
        _log.debug("File field not found")
        raise BadRequest()

    media_file = request.files["file"]

    media_type, media_manager = sniff_media(media_file)

    entry = request.db.MediaEntry()
    entry.media_type = unicode(media_type)
    entry.title = unicode(request.form.get("title") or splitext(media_file.filename)[0])

    entry.description = unicode(request.form.get("description"))
    entry.license = unicode(request.form.get("license", ""))

    entry.uploader = request.user.id

    entry.generate_slug()

    # queue appropriately
    queue_file = prepare_queue_task(request.app, entry, media_file.filename)

    with queue_file:
        queue_file.write(request.files["file"].stream.read())

    # Save now so we have this data before kicking off processing
    entry.save()

    if request.form.get("callback_url"):
        metadata = request.db.ProcessingMetaData()
        metadata.media_entry = entry
        metadata.callback_url = unicode(request.form["callback_url"])
        metadata.save()

    # Pass off to processing
    #
    # (... don't change entry after this point to avoid race
    # conditions with changes to the document via processing code)
    feed_url = request.urlgen("mediagoblin.user_pages.atom_feed", qualified=True, user=request.user.username)
    run_process_media(entry, feed_url)

    return json_response(get_entry_serializable(entry, request.urlgen))
Example #6
0
def oembed_with_media(request, media, maxheight=None, maxwidth=None, **kwargs):
    response = {}

    if media.media_type == IMAGE_MEDIA_TYPE:
        response['type'] = u'photo'
    elif media.media_type == VIDEO_MEDIA_TYPE:
        response['type'] = u'video'
    else:
        NotImplemented()

    response['version'] = u'1.0'
    media_dict = get_entry_serializable(media, request.urlgen)
    response['title'] = media.title
    response['author_name'] = media_dict['user']
    response['author_url'] = media_dict['user_permalink']
    response['provider_name'] = u'MediaGoblin'
    response['provider_url'] = request.host_url

    if media.media_type == IMAGE_MEDIA_TYPE:
        response['url'] = media_dict['media_files']['medium']
        response['height'] = media.get_file_metadata('medium', 'height')
        response['width'] = media.get_file_metadata('medium', 'width')

        if ((maxheight and response['height'] > maxheight) or
                (maxwidth and response['width'] > maxwidth)):
            response['url'] = media_dict['media_files']['thumb']
            response['height'] = media.get_file_metadata('thumb', 'height')
            response['width'] = media.get_file_metadata('thumb', 'width')

    elif media.media_type == VIDEO_MEDIA_TYPE:
        video_url = media_dict['media_files']['webm_video']

        response['width'], response['height'] = media.get_file_metadata(
            'webm_video', 'medium_size')

        if maxheight:
            response['height'] = maxheight
        if maxwidth:
            response['width'] = maxwidth

        response['html'] = (u'<video width="{0}" height="{1}" controls>'
                            '  <source src="{2}" type="video/webm">'
                            '   Your browser does not support the video tag.'
                            '</video>').format(response['width'],
                                               response['height'],
                                               video_url)

    return json_response(response, _disable_cors=True)
def get_entries(request):
    entries = request.db.MediaEntry.query

    # TODO: Make it possible to fetch unprocessed media, or media in-processing
    entries = entries.filter_by(state=u'processed')

    # TODO: Add sort order customization
    entries = entries.order_by(request.db.MediaEntry.created.desc())

    # TODO: Fetch default and upper limit from config
    entries = entries.limit(int(request.GET.get('limit') or 10))

    entries_serializable = []

    for entry in entries:
        entries_serializable.append(get_entry_serializable(entry, request.urlgen))

    return json_response(entries_serializable)
Example #8
0
def get_entries(request):
    entries = request.db.MediaEntry.query

    # TODO: Make it possible to fetch unprocessed media, or media in-processing
    entries = entries.filter_by(state=u'processed')

    # TODO: Add sort order customization
    entries = entries.order_by(request.db.MediaEntry.created.desc())

    # TODO: Fetch default and upper limit from config
    entries = entries.limit(int(request.GET.get('limit') or 10))

    entries_serializable = []

    for entry in entries:
        entries_serializable.append(get_entry_serializable(entry, request.urlgen))

    return json_response(entries_serializable)
Example #9
0
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        raise BadRequest()

    if not check_file_field(request, 'file'):
        _log.debug('File field not found')
        raise BadRequest()

    callback_url = request.form.get('callback_url')
    if callback_url:
        callback_url = six.text_type(callback_url)
    try:
        entry = submit_media(
            mg_app=request.app, user=request.user,
            submitted_file=request.files['file'],
            filename=request.files['file'].filename,
            title=six.text_type(request.form.get('title')),
            description=six.text_type(request.form.get('description')),
            license=six.text_type(request.form.get('license', '')),
            tags_string=six.text_type(request.form.get('tags', '')),
            callback_url=callback_url)

        return json_response(get_entry_serializable(entry, request.urlgen))

    # Handle upload limit issues
    except FileUploadLimit:
        raise BadRequest(
            _(u'Sorry, the file size is too big.'))
    except UserUploadLimit:
        raise BadRequest(
            _('Sorry, uploading this file will put you over your'
              ' upload limit.'))
    except UserPastUploadLimit:
        raise BadRequest(
            _('Sorry, you have reached your upload limit.'))
    except FileTypeNotSupported as e:
        raise BadRequest(e)
Example #10
0
def upload_handler(request):
	if request.GET.get('url') and request.GET.get('title') and request.user:
		upload_limit, max_file_size = get_upload_file_limits(request.user)
		try:
			f = urlopen(request.GET.get('url'))
			fname = request.GET.get('url')[request.GET.get('url').rfind('/')+1:]
			tmpfile = tempfile.NamedTemporaryFile()
			tmpfile.write(f.read)
			tmpfile.flush()
			local_file = open(tmpfile.name, "r")
			try:
				entry = submit_media(
					mg_app = request.app, user=request.user,
					submitted_file=local_file, filename=fname,
					title=request.GET.get('title'))
				entryinfo = get_entry_serializable(entry, request.urlgen)
				os.unlink(f.name)
				return json_response({'status':200, 'permalink':entryinfo['permalink']})
			except FileUploadLimit:
				return json_reponse({'status':400, 'error':'Past File size Upload Limit'})
			except UserUploadLimit:
				return json_response({'status':400, 'error':'Past User upload limit'})
			except UserPastUploadLimit:
				return json_response({'status':400, 'error':'Past upload limit'})
			except Exception as e:
				return json_response({'status':400, 'error':'Unspecified error'})

		except HTTPError as e:
			print("HTTP Error:", e.code, url)
			return json_response({'status':400, 'error':'unspecifice httperror'})
		except URLError as e:
			print("URL Error:", e.reason, url)
			return json_response({'status':400, 'error':'unspecified url error'})
	else:
		if not request.GET.get('url'):
			return json_response({'status':400, 'error':'No URL specified [GET, url]'})
		elif not request.GET.get('title'):
			return json_response({'status':400, 'error':'No title specified [GET, title]'})
		elif not request.user:
			return json_response({'status':401, 'error':'No user found'});
		else:
			return json_reponse({'status':400, 'error':'Unknown Error Occured'})
Example #11
0
def upload_handler(request):
    if request.GET.get('url') and request.GET.get('title') and request.user:
        upload_limit, max_file_size = get_upload_file_limits(request.user)
        try:
            f = urlopen(request.GET.get('url'))
            fname = request.GET.get('url')[request.GET.get('url').rfind('/') +
                                           1:]
            tmpfile = tempfile.NamedTemporaryFile()
            tmpfile.write(f.read)
            tmpfile.flush()
            local_file = open(tmpfile.name, "r")
            try:
                entry = submit_media(mg_app=request.app,
                                     user=request.user,
                                     submitted_file=local_file,
                                     filename=fname,
                                     title=request.GET.get('title'))
                entryinfo = get_entry_serializable(entry, request.urlgen)
                os.unlink(f.name)
                return json_response({
                    'status': 200,
                    'permalink': entryinfo['permalink']
                })
            except FileUploadLimit:
                return json_reponse({
                    'status': 400,
                    'error': 'Past File size Upload Limit'
                })
            except UserUploadLimit:
                return json_response({
                    'status': 400,
                    'error': 'Past User upload limit'
                })
            except UserPastUploadLimit:
                return json_response({
                    'status': 400,
                    'error': 'Past upload limit'
                })
            except Exception as e:
                return json_response({
                    'status': 400,
                    'error': 'Unspecified error'
                })

        except HTTPError as e:
            print("HTTP Error:", e.code, url)
            return json_response({
                'status': 400,
                'error': 'unspecifice httperror'
            })
        except URLError as e:
            print("URL Error:", e.reason, url)
            return json_response({
                'status': 400,
                'error': 'unspecified url error'
            })
    else:
        if not request.GET.get('url'):
            return json_response({
                'status': 400,
                'error': 'No URL specified [GET, url]'
            })
        elif not request.GET.get('title'):
            return json_response({
                'status': 400,
                'error': 'No title specified [GET, title]'
            })
        elif not request.user:
            return json_response({
                'status': 401,
                'error': 'No user found'
            })
        else:
            return json_reponse({
                'status': 400,
                'error': 'Unknown Error Occured'
            })
Example #12
0
def post_entry(request):
    _log.debug('Posting entry')

    if request.method == 'OPTIONS':
        return json_response({'status': 200})

    if request.method != 'POST':
        _log.debug('Must POST against post_entry')
        return exc.HTTPBadRequest()

    if not 'file' in request.files \
            or not isinstance(request.files['file'], FileStorage) \
            or not request.files['file'].stream:
        _log.debug('File field not found')
        return exc.HTTPBadRequest()

    media_file = request.files['file']

    media_type, media_manager = sniff_media(media_file)

    entry = request.db.MediaEntry()
    entry.id = ObjectId()
    entry.media_type = unicode(media_type)
    entry.title = unicode(request.form.get('title')
            or splitext(media_file.filename)[0])

    entry.description = unicode(request.form.get('description'))
    entry.license = unicode(request.form.get('license', ''))

    entry.uploader = request.user.id

    entry.generate_slug()

    task_id = unicode(uuid.uuid4())

    # Now store generate the queueing related filename
    queue_filepath = request.app.queue_store.get_unique_filepath(
        ['media_entries',
            task_id,
            secure_filename(media_file.filename)])

    # queue appropriately
    queue_file = request.app.queue_store.get_file(
        queue_filepath, 'wb')

    with queue_file:
        queue_file.write(request.files['file'].stream.read())

    # Add queued filename to the entry
    entry.queued_media_file = queue_filepath

    entry.queued_task_id = task_id

    # Save now so we have this data before kicking off processing
    entry.save(validate=True)

    if request.form.get('callback_url'):
        metadata = request.db.ProcessingMetaData()
        metadata.media_entry = entry
        metadata.callback_url = unicode(request.form['callback_url'])
        metadata.save()

    # Pass off to processing
    #
    # (... don't change entry after this point to avoid race
    # conditions with changes to the document via processing code)
    process_media = registry.tasks[ProcessMedia.name]
    try:
        process_media.apply_async(
            [unicode(entry._id)], {},
            task_id=task_id)
    except BaseException as e:
        # The purpose of this section is because when running in "lazy"
        # or always-eager-with-exceptions-propagated celery mode that
        # the failure handling won't happen on Celery end.  Since we
        # expect a lot of users to run things in this way we have to
        # capture stuff here.
        #
        # ... not completely the diaper pattern because the
        # exception is re-raised :)
        mark_entry_failed(entry._id, e)
        # re-raise the exception
        raise

    return json_response(get_entry_serializable(entry, request.urlgen))