Example #1
0
def select_list(userid,
                rating,
                limit,
                otherid=None,
                pending=False,
                backid=None,
                nextid=None):
    statement = [
        "SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, "
        "su.userid, pr.username, cpr.username, cpr.userid "
    ]
    statement.extend(
        select_query(userid, rating, otherid, pending, backid, nextid))
    statement.append(" ORDER BY co.unixtime%s LIMIT %i" %
                     ("" if backid else " DESC", limit))

    query = []
    for i in d.execute("".join(statement)):
        query.append({
            "contype": 10,
            "collection": True,
            "submitid": i[0],
            "title": i[1],
            "subtype": i[2],
            "rating": i[3],
            "unixtime": i[4],
            "userid": i[5],
            "username": i[6],  # username of creator
            "collector": i[7],  # username of collector
            "collectorid": i[8],
            "sub_media": media.get_submission_media(i[0]),
        })

    return query[::-1] if backid else query
Example #2
0
def submission_media_(request):
    link_type = request.matchdict['linktype']
    submitid = int(request.matchdict['submitid'])
    if link_type == "submissions":
        link_type = "submission"

    submission = Submission.query.get(submitid)
    if submission is None:
        raise httpexceptions.HTTPForbidden()
    elif submission.is_hidden or submission.is_friends_only:
        raise httpexceptions.HTTPForbidden()
    media_items = media.get_submission_media(submitid)
    if not media_items.get(link_type):
        raise httpexceptions.HTTPNotFound()

    return Response(headerlist=[
        (
            'X-Accel-Redirect',
            str(media_items[link_type][0]['file_url']),
        ),
        (
            'Cache-Control',
            'max-age=0',
        ),
    ])
Example #3
0
def select_list(userid, rating, limit, otherid=None, pending=False, backid=None, nextid=None, config=None, options=[]):
    if config is None:
        config = d.get_config(userid)

    statement = ["SELECT su.submitid, su.title, su.rating, co.unixtime, "
                 "su.userid, pr.username, su.settings, cpr.username, cpr.userid "]
    statement.extend(select_query(userid, rating, otherid, pending,
                                  backid, nextid, config))
    statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit))

    query = []
    for i in d.execute("".join(statement)):
        query.append({
            "contype": 10,
            "collection": True,
            "submitid": i[0],
            "title": i[1],
            "rating": i[2],
            "unixtime": i[3],
            "userid": i[4],
            "username": i[5],  # username of creator
            "collector": i[7],  # username of collector
            "collectorid": i[8],
            "sub_media": media.get_submission_media(i[0]),
        })

    return query[::-1] if backid else query
Example #4
0
def twitter_card(submitid):
    query = d.execute(
        """
        SELECT
            su.title, su.settings, su.content, su.subtype, su.userid, pr.username, pr.full_name, pr.config, ul.link_value, su.rating
        FROM submission su
            INNER JOIN profile pr USING (userid)
            LEFT JOIN user_links ul ON su.userid = ul.userid AND ul.link_type = 'twitter'
        WHERE submitid = %i
        LIMIT 1
    """, [submitid], ["single"])

    if not query:
        raise WeasylError("submissionRecordMissing")
    title, settings, content, subtype, userid, username, full_name, config, twitter, rating = query
    if 'h' in settings:
        raise WeasylError("submissionRecordMissing")
    elif 'f' in settings:
        raise WeasylError("FriendsOnly")

    if 'v' in settings:
        content = d.text_first_line(content, strip=True)
    content = d.summarize(html.strip_html(content))
    if not content:
        content = "[This submission has no description.]"

    ret = {
        'url':
        d.absolutify_url('/submission/%s/%s' %
                         (submitid, text.slug_for(title))),
    }

    if twitter:
        ret['creator'] = '@%s' % (twitter.lstrip('@'), )
        ret['title'] = title
    else:
        ret['title'] = '%s by %s' % (title, full_name)

    if ratings.CODE_MAP[rating].minimum_age >= 18:
        ret['card'] = 'summary'
        ret['description'] = 'This image is rated 18+ and only viewable on weasyl.com'
        return ret

    ret['description'] = content

    subcat = subtype / 1000 * 1000
    media_items = media.get_submission_media(submitid)
    if subcat == m.ART_SUBMISSION_CATEGORY and media_items.get('submission'):
        ret['card'] = 'photo'
        ret['image:src'] = d.absolutify_url(
            media_items['submission'][0]['display_url'])
    else:
        ret['card'] = 'summary'
        thumb = media_items.get('thumbnail-custom') or media_items.get(
            'thumbnail-generated')
        if thumb:
            ret['image:src'] = d.absolutify_url(thumb[0]['display_url'])

    return ret
Example #5
0
def thumbnail_source(submitid):
    media_items = media.get_submission_media(submitid)
    source = None
    for link_type in ['thumbnail-source', 'cover']:
        if media_items.get(link_type):
            source = media_items[link_type][0]
            break
    if source is None:
        raise WeasylError('noImageSource')
    return source
Example #6
0
def thumbnail_source(submitid):
    media_items = media.get_submission_media(submitid)
    source = None
    for link_type in ['thumbnail-source', 'cover']:
        if media_items.get(link_type):
            source = media_items[link_type][0]
            break
    if source is None:
        raise WeasylError('noImageSource')
    return source
Example #7
0
def twitter_card(submitid):
    query = d.execute("""
        SELECT
            su.title, su.settings, su.content, su.subtype, su.userid, pr.username, pr.full_name, pr.config, ul.link_value, su.rating
        FROM submission su
            INNER JOIN profile pr USING (userid)
            LEFT JOIN user_links ul ON su.userid = ul.userid AND ul.link_type = 'twitter'
        WHERE submitid = %i
        LIMIT 1
    """, [submitid], ["single"])

    if not query:
        raise WeasylError("submissionRecordMissing")
    title, settings, content, subtype, userid, username, full_name, config, twitter, rating = query
    if 'h' in settings:
        raise WeasylError("submissionRecordMissing")
    elif 'f' in settings:
        raise WeasylError("FriendsOnly")

    if 'v' in settings:
        content = d.text_first_line(content, strip=True)
    content = d.summarize(html.strip_html(content))
    if not content:
        content = "[This submission has no description.]"

    ret = {
        'url': d.absolutify_url(
            '/submission/%s/%s' % (submitid, text.slug_for(title))),
    }

    if twitter:
        ret['creator'] = '@%s' % (twitter.lstrip('@'),)
        ret['title'] = title
    else:
        ret['title'] = '%s by %s' % (title, full_name)

    if ratings.CODE_MAP[rating].minimum_age >= 18:
        ret['card'] = 'summary'
        ret['description'] = 'This image is rated 18+ and only viewable on weasyl.com'
        return ret

    ret['description'] = content

    subcat = subtype / 1000 * 1000
    media_items = media.get_submission_media(submitid)
    if subcat == m.ART_SUBMISSION_CATEGORY and media_items.get('submission'):
        ret['card'] = 'photo'
        ret['image:src'] = d.absolutify_url(media_items['submission'][0]['display_url'])
    else:
        ret['card'] = 'summary'
        thumb = media_items.get('thumbnail-custom') or media_items.get('thumbnail-generated')
        if thumb:
            ret['image:src'] = d.absolutify_url(thumb[0]['display_url'])

    return ret
Example #8
0
def select_view_api(userid, submitid, anyway=False, increment_views=False):
    rating = d.get_rating(userid)
    db = d.connect()
    sub = db.query(orm.Submission).get(submitid)
    if sub is None or 'hidden' in sub.settings:
        raise WeasylError("submissionRecordMissing")
    sub_rating = sub.rating.code
    if 'friends-only' in sub.settings and not frienduser.check(userid, sub.userid):
        raise WeasylError("submissionRecordMissing")
    elif sub_rating > rating and userid != sub.userid:
        raise WeasylError("RatingExceeded")
    elif not anyway and ignoreuser.check(userid, sub.userid):
        raise WeasylError("UserIgnored")
    elif not anyway and blocktag.check(userid, submitid=submitid):
        raise WeasylError("TagBlocked")

    description = sub.content
    embedlink = None
    if 'embedded-content' in sub.settings:
        embedlink, _, description = description.partition('\n')
    elif 'gdocs-embed' in sub.settings:
        embedlink = sub.google_doc_embed.embed_url

    views = sub.page_views
    if increment_views and d.common_view_content(userid, submitid, 'submit'):
        views += 1

    return {
        'submitid': submitid,
        'title': sub.title,
        'owner': sub.owner.profile.username,
        'owner_login': sub.owner.login_name,
        'owner_media': api.tidy_all_media(media.get_user_media(sub.userid)),
        'media': api.tidy_all_media(media.get_submission_media(submitid)),
        'description': text.markdown(description),
        'embedlink': embedlink,
        'folderid': sub.folderid,
        'folder_name': sub.folder.title if sub.folderid else None,
        'posted_at': d.iso8601(sub.unixtime),
        'tags': searchtag.select(submitid=submitid),
        'link': d.absolutify_url("/submission/%d/%s" % (submitid, text.slug_for(sub.title))),

        'type': 'submission',
        'subtype': m.CATEGORY_PARSABLE_MAP[sub.subtype // 1000 * 1000],
        'rating': sub.rating.name,

        'views': views,
        'favorites': favorite.count(submitid),
        'comments': comment.count(submitid),
        'favorited': favorite.check(userid, submitid=submitid),
        'friends_only': 'friends-only' in sub.settings,
    }
Example #9
0
def select_view_api(userid, submitid, anyway=False, increment_views=False):
    rating = d.get_rating(userid)
    db = d.connect()
    sub = db.query(orm.Submission).get(submitid)
    if sub is None or 'hidden' in sub.settings:
        raise WeasylError("submissionRecordMissing")
    sub_rating = sub.rating.code
    if 'friends-only' in sub.settings and not frienduser.check(userid, sub.userid):
        raise WeasylError("submissionRecordMissing")
    elif sub_rating > rating and userid != sub.userid:
        raise WeasylError("RatingExceeded")
    elif not anyway and ignoreuser.check(userid, sub.userid):
        raise WeasylError("UserIgnored")
    elif not anyway and blocktag.check(userid, submitid=submitid):
        raise WeasylError("TagBlocked")

    description = sub.content
    embedlink = None
    if 'embedded-content' in sub.settings:
        embedlink, _, description = description.partition('\n')
    elif 'gdocs-embed' in sub.settings:
        embedlink = sub.google_doc_embed.embed_url

    views = sub.page_views
    if increment_views and d.common_view_content(userid, submitid, 'submit'):
        views += 1

    return {
        'submitid': submitid,
        'title': sub.title,
        'owner': sub.owner.profile.username,
        'owner_login': sub.owner.login_name,
        'owner_media': api.tidy_all_media(media.get_user_media(sub.userid)),
        'media': api.tidy_all_media(media.get_submission_media(submitid)),
        'description': text.markdown(description),
        'embedlink': embedlink,
        'folderid': sub.folderid,
        'folder_name': sub.folder.title if sub.folderid else None,
        'posted_at': d.iso8601(sub.unixtime),
        'tags': searchtag.select(submitid=submitid),
        'link': d.absolutify_url("/submission/%d/%s" % (submitid, text.slug_for(sub.title))),

        'type': 'submission',
        'subtype': m.CATEGORY_PARSABLE_MAP[sub.subtype // 1000 * 1000],
        'rating': sub.rating.name,

        'views': views,
        'favorites': favorite.count(submitid),
        'comments': comment.count(submitid),
        'favorited': favorite.check(userid, submitid=submitid),
        'friends_only': 'friends-only' in sub.settings,
    }
Example #10
0
def select_manage(userid,
                  rating,
                  limit,
                  pending,
                  backid=None,
                  nextid=None,
                  config=None):
    query = []
    statement = [
        "SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, su.userid, pr.username"
        " FROM collection co"
        " INNER JOIN submission su ON co.submitid = su.submitid"
        " INNER JOIN profile pr ON su.userid = pr.userid"
        " WHERE (su.rating <= %i OR su.userid = %i) AND co.settings %s~ 'p' AND su.settings !~ '[fh]'"
        % (rating, userid, "" if pending else "!")
    ]

    # Content owner and browse selection
    statement.append(" AND co.userid = %i" % userid)

    if backid:
        statement.append(
            " AND co.unixtime > (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))"
            % (userid, backid))
    elif nextid:
        statement.append(
            " AND co.unixtime < (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))"
            % (userid, nextid))

    # Ignored users and blocked tags
    statement.append(" ORDER BY co.unixtime%s LIMIT %i" %
                     ("" if backid else " DESC", limit))

    try:
        for i in d.execute("".join(statement)):
            query.append({
                "contype": 10,
                "collection": True,
                "submitid": i[0],
                "title": i[1],
                "subtype": i[2],
                "rating": i[3],
                "unixtime": i[4],
                "userid": i[5],
                "username": i[6],
                "sub_media": media.get_submission_media(i[0]),
            })
    except PostgresError:
        return []

    return query[::-1] if backid else query
Example #11
0
    def GET(self, username, link_type, submitid):
        submitid = int(submitid)
        if link_type == "submissions":
            link_type = "submission"

        submission = Submission.query.get(submitid)
        if submission is None:
            return web.notfound()
        elif submission.is_hidden or submission.is_friends_only:
            return web.forbidden()
        media_items = media.get_submission_media(submitid)
        if not media_items.get(link_type):
            return web.notfound()
        web.header('X-Accel-Redirect', media_items[link_type][0]['file_url'])
        web.header('Cache-Control', 'max-age=0')
        return ''
Example #12
0
    def GET(self, username, link_type, submitid):
        submitid = int(submitid)
        if link_type == "submissions":
            link_type = "submission"

        submission = Submission.query.get(submitid)
        if submission is None:
            return web.notfound()
        elif submission.is_hidden or submission.is_friends_only:
            return web.forbidden()
        media_items = media.get_submission_media(submitid)
        if not media_items.get(link_type):
            return web.notfound()
        web.header('X-Accel-Redirect', media_items[link_type][0]['file_url'])
        web.header('Cache-Control', 'max-age=0')
        return ''
Example #13
0
def submission_media_(request):
    link_type = request.matchdict['linktype']
    submitid = int(request.matchdict['submitid'])
    if link_type == "submissions":
        link_type = "submission"

    submission = Submission.query.get(submitid)
    if submission is None:
        raise httpexceptions.HTTPForbidden()
    elif submission.is_hidden or submission.is_friends_only:
        raise httpexceptions.HTTPForbidden()
    media_items = media.get_submission_media(submitid)
    if not media_items.get(link_type):
        raise httpexceptions.HTTPNotFound()

    return Response(headerlist=[
        ('X-Accel-Redirect', str(media_items[link_type][0]['file_url']),),
        ('Cache-Control', 'max-age=0',),
    ])
Example #14
0
def select_manage(userid, rating, limit, pending, backid=None, nextid=None, config=None):
    query = []
    statement = ["SELECT su.submitid, su.title, su.subtype, su.rating, co.unixtime, su.userid, pr.username"
                 " FROM collection co"
                 " INNER JOIN submission su ON co.submitid = su.submitid"
                 " INNER JOIN profile pr ON su.userid = pr.userid"
                 " WHERE (su.rating <= %i OR su.userid = %i) AND co.settings %s~ 'p' AND su.settings !~ '[fh]'"
                 % (rating, userid, "" if pending else "!")]

    # Content owner and browse selection
    statement.append(" AND co.userid = %i" % userid)

    if backid:
        statement.append(" AND co.unixtime > (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))"
                         % (userid, backid))
    elif nextid:
        statement.append(" AND co.unixtime < (SELECT unixtime FROM collection WHERE (userid, submitid) = (%i, %i))"
                         % (userid, nextid))

    # Ignored users and blocked tags
    statement.append(" ORDER BY co.unixtime%s LIMIT %i" % ("" if backid else " DESC", limit))

    try:
        for i in d.execute("".join(statement)):
            query.append({
                "contype": 10,
                "collection": True,
                "submitid": i[0],
                "title": i[1],
                "subtype": i[2],
                "rating": i[3],
                "unixtime": i[4],
                "userid": i[5],
                "username": i[6],
                "sub_media": media.get_submission_media(i[0]),
            })
    except PostgresError:
        return []

    return query[::-1] if backid else query
Example #15
0
def select_preview(userid, otherid, rating, limit=3):
    """
    Picks out random folders up to the limit, and get a count, name, and random
    submission to use as a preview for each.

    The rules below ensure that the following images won't be used or counted:
    Hidden images, friends only images from non-friends, submissions above the
    specified rating. Except for hidden images, these rules are ignored when
    a user views their own folders.

    Params:
        userid: The id of the viewing user.
        otherid: The id of the users whose folders we're viewing.
        rating: The maximum rating of submissions that will be considered for
            counts or a preview.
        limit: The maximum number of folders to consider. Defaults to 3.

    Returns:
        An array of dicts, each of which has a folderid, a title, a count, and
        sub_media to use for a preview.
    """
    query = []
    folder_query = d.engine.execute("""
        SELECT
            fd.folderid, fd.title,
            (SELECT COUNT(*)
               FROM submission su
               WHERE folderid = fd.folderid
                 AND settings !~ '[hu]'
                 AND (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s))
                 AND (settings !~ 'f'
                      OR su.userid = %(userid)s
                      OR EXISTS (SELECT 0
                                   FROM frienduser
                                   WHERE ((userid, otherid) = (%(userid)s, su.userid)
                                          OR (userid, otherid) = (su.userid, %(userid)s))
                                     AND settings !~ 'p')))
        FROM folder fd
        WHERE fd.userid = %(otherid)s
            AND fd.settings !~ '[hu]'
            AND EXISTS (SELECT 0 FROM submission
                          WHERE folderid = fd.folderid
                            AND (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s)))
        ORDER BY RANDOM()
        LIMIT %(limit)s
    """, rating=rating, userid=userid, otherid=otherid, limit=limit, sfwmode=d.is_sfw_mode())

    for i in folder_query:
        submit = d.engine.execute("""
            SELECT submitid, settings FROM submission su
                WHERE (rating <= %(rating)s OR (userid = %(userid)s AND NOT %(sfwmode)s))
                AND folderid = %(folderid)s AND settings !~ 'h'
                AND (settings !~ 'f' OR su.userid = %(userid)s
                     OR EXISTS (SELECT 0 FROM frienduser
                                  WHERE ((userid, otherid) = (%(userid)s, su.userid)
                                         OR (userid, otherid) = (su.userid, %(userid)s))
                                    AND settings !~ 'p'))
                ORDER BY RANDOM() LIMIT 1
            """, rating=rating, folderid=i.folderid, userid=userid, sfwmode=d.is_sfw_mode()).first()

        if submit:
            query.append({
                "folderid": i.folderid,
                "title": i.title,
                "count": i.count,
                "userid": otherid,
                "sub_media": media.get_submission_media(submit.submitid),
            })

    return query
Example #16
0
def select_view(userid, submitid, rating, ignore=True, anyway=None):
    query = d.execute("""
        SELECT
            su.userid, pr.username, su.folderid, su.unixtime, su.title, su.content, su.subtype, su.rating, su.settings,
            su.page_views, su.sorttime, pr.config, fd.title
        FROM submission su
            INNER JOIN profile pr USING (userid)
            LEFT JOIN folder fd USING (folderid)
        WHERE su.submitid = %i
    """, [submitid], options=["single", "list"])

    # Sanity check
    if query and userid in staff.MODS and anyway == "true":
        pass
    elif not query or "h" in query[8]:
        raise WeasylError("submissionRecordMissing")
    elif query[7] > rating and ((userid != query[0] and userid not in staff.MODS) or d.is_sfw_mode()):
        raise WeasylError("RatingExceeded")
    elif "f" in query[8] and not frienduser.check(userid, query[0]):
        raise WeasylError("FriendsOnly")
    elif ignore and ignoreuser.check(userid, query[0]):
        raise WeasylError("UserIgnored")
    elif ignore and blocktag.check(userid, submitid=submitid):
        raise WeasylError("TagBlocked")

    # Get submission filename
    submitfile = media.get_submission_media(submitid).get('submission', [None])[0]

    # Get submission text
    if submitfile and submitfile['file_type'] in ['txt', 'htm']:
        submittext = files.read(submitfile['full_file_path'])
    else:
        submittext = None

    embedlink = d.text_first_line(query[5]) if "v" in query[8] else None

    google_doc_embed = None
    if 'D' in query[8]:
        db = d.connect()
        gde = d.meta.tables['google_doc_embeds']
        q = (sa.select([gde.c.embed_url])
             .where(gde.c.submitid == submitid))
        results = db.execute(q).fetchall()
        if not results:
            raise WeasylError("can't find embed information")
        google_doc_embed = results[0]

    tags, artist_tags = searchtag.select_with_artist_tags(submitid)
    settings = d.get_profile_settings(query[0])

    return {
        "submitid": submitid,
        "userid": query[0],
        "username": query[1],
        "folderid": query[2],
        "unixtime": query[3],
        "title": query[4],
        "content": (d.text_first_line(query[5], strip=True) if "v" in query[8] else query[5]),
        "subtype": query[6],
        "rating": query[7],
        "settings": query[8],
        "page_views": (
            query[9] + 1 if d.common_view_content(userid, 0 if anyway == "true" else submitid, "submit") else query[9]),
        "fave_count": d.execute(
            "SELECT COUNT(*) FROM favorite WHERE (targetid, type) = (%i, 's')",
            [submitid], ["element"]),


        "mine": userid == query[0],
        "reported": report.check(submitid=submitid),
        "favorited": favorite.check(userid, submitid=submitid),
        "friends_only": "f" in query[8],
        "hidden_submission": "h" in query[8],
        "collectors": collection.find_owners(submitid),
        "no_request": not settings.allow_collection_requests,

        "text": submittext,
        "sub_media": media.get_submission_media(submitid),
        "user_media": media.get_user_media(query[0]),
        "submit": submitfile,
        "embedlink": embedlink,
        "embed": embed.html(embedlink) if embedlink is not None else None,
        "google_doc_embed": google_doc_embed,


        "tags": tags,
        "artist_tags": artist_tags,
        "removable_tags": searchtag.removable_tags(userid, query[0], tags, artist_tags),
        "can_remove_tags": searchtag.can_remove_tags(userid, query[0]),
        "folder_more": select_near(userid, rating, 1, query[0], query[2], submitid),
        "folder_title": query[12] if query[12] else "Root",


        "comments": comment.select(userid, submitid=submitid),
    }
Example #17
0
def select_view(userid, submitid, rating, ignore=True, anyway=None):
    query = d.execute("""
        SELECT
            su.userid, pr.username, su.folderid, su.unixtime, su.title, su.content, su.subtype, su.rating, su.settings,
            su.page_views, su.sorttime, pr.config, fd.title
        FROM submission su
            INNER JOIN profile pr USING (userid)
            LEFT JOIN folder fd USING (folderid)
        WHERE su.submitid = %i
    """, [submitid],
                      options=["single", "list"])

    # Sanity check
    if query and userid in staff.MODS and anyway == "true":
        pass
    elif not query or "h" in query[8]:
        raise WeasylError("submissionRecordMissing")
    elif query[7] > rating and (
        (userid != query[0] and userid not in staff.MODS) or d.is_sfw_mode()):
        raise WeasylError("RatingExceeded")
    elif "f" in query[8] and not frienduser.check(userid, query[0]):
        raise WeasylError("FriendsOnly")
    elif ignore and ignoreuser.check(userid, query[0]):
        raise WeasylError("UserIgnored")
    elif ignore and blocktag.check(userid, submitid=submitid):
        raise WeasylError("TagBlocked")

    # Get submission filename
    submitfile = media.get_submission_media(submitid).get(
        'submission', [None])[0]

    # Get submission text
    if submitfile and submitfile['file_type'] in ['txt', 'htm']:
        submittext = files.read(submitfile['full_file_path'])
    else:
        submittext = None

    embedlink = d.text_first_line(query[5]) if "v" in query[8] else None

    google_doc_embed = None
    if 'D' in query[8]:
        db = d.connect()
        gde = d.meta.tables['google_doc_embeds']
        q = (sa.select([gde.c.embed_url]).where(gde.c.submitid == submitid))
        results = db.execute(q).fetchall()
        if not results:
            raise WeasylError("can't find embed information")
        google_doc_embed = results[0]

    tags, artist_tags = searchtag.select_with_artist_tags(submitid)
    settings = d.get_profile_settings(query[0])

    return {
        "submitid":
        submitid,
        "userid":
        query[0],
        "username":
        query[1],
        "folderid":
        query[2],
        "unixtime":
        query[3],
        "title":
        query[4],
        "content": (d.text_first_line(query[5], strip=True)
                    if "v" in query[8] else query[5]),
        "subtype":
        query[6],
        "rating":
        query[7],
        "settings":
        query[8],
        "page_views": (query[9] + 1 if d.common_view_content(
            userid, 0 if anyway == "true" else submitid, "submit") else
                       query[9]),
        "fave_count":
        d.execute(
            "SELECT COUNT(*) FROM favorite WHERE (targetid, type) = (%i, 's')",
            [submitid], ["element"]),
        "mine":
        userid == query[0],
        "reported":
        report.check(submitid=submitid),
        "favorited":
        favorite.check(userid, submitid=submitid),
        "friends_only":
        "f" in query[8],
        "hidden_submission":
        "h" in query[8],
        "collectors":
        collection.find_owners(submitid),
        "no_request":
        not settings.allow_collection_requests,
        "text":
        submittext,
        "sub_media":
        media.get_submission_media(submitid),
        "user_media":
        media.get_user_media(query[0]),
        "submit":
        submitfile,
        "embedlink":
        embedlink,
        "embed":
        embed.html(embedlink) if embedlink is not None else None,
        "google_doc_embed":
        google_doc_embed,
        "tags":
        tags,
        "artist_tags":
        artist_tags,
        "removable_tags":
        searchtag.removable_tags(userid, query[0], tags, artist_tags),
        "can_remove_tags":
        searchtag.can_remove_tags(userid, query[0]),
        "folder_more":
        select_near(userid, rating, 1, query[0], query[2], submitid),
        "folder_title":
        query[12] if query[12] else "Root",
        "comments":
        comment.select(userid, submitid=submitid),
    }