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))
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
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))
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))
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)
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)
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'})
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' })
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))