def create_visual(userid, submission, friends_only, tags, imageURL, thumbfile, submitfile, critique, create_notifications): if imageURL: resp = d.http_get(imageURL, timeout=5) submitfile = resp.content # Determine filesizes thumbsize = len(thumbfile) submitsize = len(submitfile) if not submitsize: raise WeasylError("submitSizeZero") elif thumbsize > 10 * _MEGABYTE: raise WeasylError("thumbSizeExceedsLimit") im = image.from_string(submitfile) submitextension = image.image_extension(im) if submitextension not in [".jpg", ".png", ".gif"]: raise WeasylError("submitType") if _limit(submitsize, submitextension): raise WeasylError("submitSizeExceedsLimit") # Check if the submission is spam is_spam = _check_for_spam(submission=submission, userid=userid) submit_file_type = submitextension.lstrip('.') submit_media_item = orm.MediaItem.fetch_or_create( submitfile, file_type=submit_file_type, im=im) check_for_duplicate_media(userid, submit_media_item.mediaid) cover_media_item = submit_media_item.ensure_cover_image(im) # Thumbnail stuff. # Always create a 'generated' thumbnail from the source image. with BytesIO(submitfile) as buf: thumbnail_formats = images_new.get_thumbnail(buf) thumb_generated, thumb_generated_file_type, thumb_generated_attributes = thumbnail_formats.compatible thumb_generated_media_item = orm.MediaItem.fetch_or_create( thumb_generated, file_type=thumb_generated_file_type, attributes=thumb_generated_attributes, ) if thumbnail_formats.webp is None: thumb_generated_media_item_webp = None else: thumb_generated, thumb_generated_file_type, thumb_generated_attributes = thumbnail_formats.webp thumb_generated_media_item_webp = orm.MediaItem.fetch_or_create( thumb_generated, file_type=thumb_generated_file_type, attributes=thumb_generated_attributes, ) # If requested, also create a 'custom' thumbnail. thumb_media_item = media.make_cover_media_item(thumbfile) if thumb_media_item: thumb_custom = images.make_thumbnail(image.from_string(thumbfile)) thumb_custom_media_item = orm.MediaItem.fetch_or_create( thumb_custom.to_buffer(format=submit_file_type), file_type=submit_file_type, im=thumb_custom) # Assign settings settings = [] settings.append("f" if friends_only else "") settings.append("q" if critique else "") settings = "".join(settings) # TODO(kailys): maintain ORM object db = d.connect() now = arrow.get() q = (d.meta.tables['submission'].insert().values([{ "folderid": submission.folderid, "userid": userid, "unixtime": now, "title": submission.title, "content": submission.content, "subtype": submission.subtype, "rating": submission.rating.code, "settings": settings, "favorites": 0, "is_spam": is_spam, "submitter_ip_address": submission.submitter_ip_address, "submitter_user_agent_id": submission.submitter_user_agent_id, }]).returning(d.meta.tables['submission'].c.submitid)) submitid = db.scalar(q) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'submission', submit_media_item) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'cover', cover_media_item) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'thumbnail-generated', thumb_generated_media_item) if thumb_generated_media_item_webp is not None: orm.SubmissionMediaLink.make_or_replace_link( submitid, 'thumbnail-generated-webp', thumb_generated_media_item_webp) if thumb_media_item: orm.SubmissionMediaLink.make_or_replace_link(submitid, 'thumbnail-source', thumb_media_item) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'thumbnail-custom', thumb_custom_media_item) # Assign search tags searchtag.associate(userid, tags, submitid=submitid) # Create notifications if create_notifications: _create_notifications(userid, submitid, submission.rating, settings) d.metric('increment', 'submissions') d.metric('increment', 'visualsubmissions') return submitid
def reupload(userid, submitid, submitfile): submitsize = len(submitfile) # Select submission data query = d.engine.execute( "SELECT userid, subtype, settings FROM submission WHERE submitid = %(id)s AND settings !~ 'h'", id=submitid, ).first() if not query: raise WeasylError("Unexpected") elif userid != query[0]: raise WeasylError("Unexpected") elif "v" in query[2] or "D" in query[2]: raise WeasylError("Unexpected") subcat = query[1] // 1000 * 1000 if subcat not in m.ALL_SUBMISSION_CATEGORIES: raise WeasylError("Unexpected") # Check invalid file data if not submitsize: raise WeasylError("submitSizeZero") # Write temporary submission file submitextension = files.get_extension_for_category(submitfile, subcat) if submitextension is None: raise WeasylError("submitType") elif subcat == m.ART_SUBMISSION_CATEGORY and submitextension not in [ ".jpg", ".png", ".gif" ]: raise WeasylError("submitType") elif subcat == m.MULTIMEDIA_SUBMISSION_CATEGORY and submitextension not in [ ".mp3", ".swf" ]: raise WeasylError("submitType") elif _limit(submitsize, submitextension): raise WeasylError("submitSizeExceedsLimit") submit_file_type = submitextension.lstrip('.') im = None if submit_file_type in {'jpg', 'png', 'gif'}: im = image.from_string(submitfile) submit_media_item = orm.MediaItem.fetch_or_create( submitfile, file_type=submit_file_type, im=im) check_for_duplicate_media(userid, submit_media_item.mediaid) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'submission', submit_media_item) if subcat == m.ART_SUBMISSION_CATEGORY: cover_media_item = submit_media_item.ensure_cover_image(im) orm.SubmissionMediaLink.make_or_replace_link(submitid, 'cover', cover_media_item) # Always create a 'generated' thumbnail from the source image. with BytesIO(submitfile) as buf: thumbnail_formats = images_new.get_thumbnail(buf) thumb_generated, thumb_generated_file_type, thumb_generated_attributes = thumbnail_formats.compatible thumb_generated_media_item = orm.MediaItem.fetch_or_create( thumb_generated, file_type=thumb_generated_file_type, attributes=thumb_generated_attributes, ) if thumbnail_formats.webp is None: thumb_generated_media_item_webp = None else: thumb_generated, thumb_generated_file_type, thumb_generated_attributes = thumbnail_formats.webp thumb_generated_media_item_webp = orm.MediaItem.fetch_or_create( thumb_generated, file_type=thumb_generated_file_type, attributes=thumb_generated_attributes, ) orm.SubmissionMediaLink.make_or_replace_link( submitid, 'thumbnail-generated', thumb_generated_media_item) if thumbnail_formats.webp is not None: orm.SubmissionMediaLink.make_or_replace_link( submitid, 'thumbnail-generated-webp', thumb_generated_media_item_webp)