This commit is contained in:
noirscape 2023-04-17 21:32:41 +02:00
commit 4fe5973db7
18 changed files with 316 additions and 160 deletions

View file

@ -1,7 +1,7 @@
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.0.1 rev: v4.4.0
hooks: hooks:
- id: trailing-whitespace - id: trailing-whitespace
- id: end-of-file-fixer - id: end-of-file-fixer
@ -10,12 +10,12 @@ repos:
- repo: https://github.com/Lucas-C/pre-commit-hooks - repo: https://github.com/Lucas-C/pre-commit-hooks
rev: v1.1.10 rev: v1.4.2
hooks: hooks:
- id: remove-tabs - id: remove-tabs
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: '22.3.0' rev: '23.1.0'
hooks: hooks:
- id: black - id: black
files: 'server/' files: 'server/'
@ -23,7 +23,7 @@ repos:
language_version: python3.9 language_version: python3.9
- repo: https://github.com/PyCQA/isort - repo: https://github.com/PyCQA/isort
rev: '5.10.1' rev: '5.12.0'
hooks: hooks:
- id: isort - id: isort
files: 'server/' files: 'server/'
@ -33,7 +33,7 @@ repos:
- toml - toml
- repo: https://github.com/pre-commit/mirrors-prettier - repo: https://github.com/pre-commit/mirrors-prettier
rev: v2.5.0 rev: v2.7.1
hooks: hooks:
- id: prettier - id: prettier
files: client/js/ files: client/js/
@ -41,7 +41,7 @@ repos:
args: ['--config', 'client/.prettierrc.yml'] args: ['--config', 'client/.prettierrc.yml']
- repo: https://github.com/pre-commit/mirrors-eslint - repo: https://github.com/pre-commit/mirrors-eslint
rev: v8.3.0 rev: v8.33.0
hooks: hooks:
- id: eslint - id: eslint
files: client/js/ files: client/js/
@ -49,8 +49,8 @@ repos:
additional_dependencies: additional_dependencies:
- eslint-config-prettier - eslint-config-prettier
- repo: https://gitlab.com/PyCQA/flake8 - repo: https://github.com/PyCQA/flake8
rev: '4.0.1' rev: '6.0.0'
hooks: hooks:
- id: flake8 - id: flake8
files: server/szurubooru/ files: server/szurubooru/
@ -58,33 +58,5 @@ repos:
- flake8-print - flake8-print
args: ['--config=server/.flake8'] args: ['--config=server/.flake8']
- repo: local
hooks:
- id: docker-build-client
name: Docker - build client
entry: bash -c 'docker build client/'
language: system
types: [file]
files: client/
pass_filenames: false
- id: docker-build-server
name: Docker - build server
entry: bash -c 'docker build server/'
language: system
types: [file]
files: server/
pass_filenames: false
- id: pytest
name: pytest
entry: bash -c 'docker run --rm -t $(docker build --target testing -q server/) szurubooru/'
language: system
types: [python]
files: server/szurubooru/
exclude: server/szurubooru/migrations/
pass_filenames: false
stages: [manual]
fail_fast: true fail_fast: true
exclude: LICENSE.md exclude: LICENSE.md

View file

@ -300,10 +300,10 @@ a .access-key
background-size: 20px 20px background-size: 20px 20px
img img
opacity: 0 opacity: 0
width: 100% width: auto
height: 100% height: 100%
video video
width: 100% width: auto
height: 100% height: 100%
.flexbox-dummy .flexbox-dummy

View file

@ -114,6 +114,29 @@
&[data-disabled] &[data-disabled]
background: rgba(200, 200, 200, 0.7) background: rgba(200, 200, 200, 0.7)
.delete-flipper
display: inline-block
padding: 0.5em
box-sizing: border-box
border: 0
&:after
display: inline-block
width: 1em
height: 1em
text-align: center
line-height: 1em
font-size: 2.2em
&.delete
background: rgba(255, 0, 0, 0.7)
&:after
color: white
font-family: FontAwesome;
content: "\f1f8"; // fa-trash
&:not(.delete)
background: rgba(200, 200, 200, 0.7)
&:after
color: white
content: '-'
.thumbnail .thumbnail
width: 100% width: 100%
@ -215,7 +238,19 @@
.append .append
@media (max-width: 1000px) @media (max-width: 1000px)
margin-left: 0 margin-left: 0
.bulk-edit-delete
&.opened
.start
@media (max-width: 1000px)
margin-left: 0
&:not(.opened)
.start
display: none
.append.open
@media (max-width: 1000px)
margin-left: 0
.start
margin-left: 1em
.safety .safety
margin-right: 0.25em margin-right: 0.25em
&.safety-safe &.safety-safe

View file

@ -42,6 +42,7 @@
'image/heic': 'HEIC', 'image/heic': 'HEIC',
'video/webm': 'WEBM', 'video/webm': 'WEBM',
'video/mp4': 'MPEG-4', 'video/mp4': 'MPEG-4',
'video/quicktime': 'MOV',
'application/x-shockwave-flash': 'SWF', 'application/x-shockwave-flash': 'SWF',
}[ctx.post.mimeType] + }[ctx.post.mimeType] +
' (' + ' (' +

View file

@ -15,6 +15,7 @@
'image/heic': 'HEIC', 'image/heic': 'HEIC',
'video/webm': 'WEBM', 'video/webm': 'WEBM',
'video/mp4': 'MPEG-4', 'video/mp4': 'MPEG-4',
'video/quicktime': 'MOV',
'application/x-shockwave-flash': 'SWF', 'application/x-shockwave-flash': 'SWF',
}[ctx.post.mimeType] %> }[ctx.post.mimeType] %>
</a> </a>

View file

@ -28,4 +28,11 @@
%><a href class='mousetrap button append close'>Stop editing safety</a><% %><a href class='mousetrap button append close'>Stop editing safety</a><%
%></form><% %></form><%
%><% } %><% %><% } %><%
%><% if (ctx.canBulkDelete) { %><%
%><form class='horizontal bulk-edit bulk-edit-delete'><%
%><a href class='mousetrap button append open'>Mass delete</a><%
%><input class='mousetrap start' type='submit' value='Delete selected posts'/><%
%><a href class='mousetrap button append close'>Stop deleting</a><%
%></form><%
%><% } %><%
%></div> %></div>

View file

@ -50,6 +50,10 @@
<% } %> <% } %>
</span> </span>
<% } %> <% } %>
<% if (ctx.canBulkDelete && ctx.parameters && ctx.parameters.delete) { %>
<a href class='delete-flipper'>
</a>
<% } %>
</span> </span>
</li> </li>
<% } %> <% } %>

View file

@ -44,6 +44,7 @@ class PostListController {
enableSafety: api.safetyEnabled(), enableSafety: api.safetyEnabled(),
canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"), canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"),
canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"), canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"),
canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"),
bulkEdit: { bulkEdit: {
tags: this._bulkEditTags, tags: this._bulkEditTags,
}, },
@ -52,6 +53,16 @@ class PostListController {
this._evtNavigate(e) this._evtNavigate(e)
); );
if (this._headerView._bulkDeleteEditor) {
this._headerView._bulkDeleteEditor.addEventListener(
"deleteSelectedPosts",
(e) => {
this._evtDeleteSelectedPosts(e);
}
);
}
this._postsMarkedForDeletion = [];
this._syncPageController(); this._syncPageController();
} }
@ -91,6 +102,38 @@ class PostListController {
e.detail.post.save().catch((error) => window.alert(error.message)); e.detail.post.save().catch((error) => window.alert(error.message));
} }
_evtMarkForDeletion(e) {
const postId = e.detail;
// Add or remove post from delete list
if (e.detail.delete) {
this._postsMarkedForDeletion.push(e.detail.post);
} else {
this._postsMarkedForDeletion = this._postsMarkedForDeletion.filter(
(x) => x.id != e.detail.post.id
);
}
}
_evtDeleteSelectedPosts(e) {
if (this._postsMarkedForDeletion.length == 0) return;
if (
confirm(
`Are you sure you want to delete ${this._postsMarkedForDeletion.length} posts?`
)
) {
Promise.all(
this._postsMarkedForDeletion.map((post) => post.delete())
)
.catch((error) => window.alert(error.message))
.then(() => {
this._postsMarkedForDeletion = [];
this._headerView._navigate();
});
}
}
_syncPageController() { _syncPageController() {
this._pageController.run({ this._pageController.run({
parameters: this._ctx.parameters, parameters: this._ctx.parameters,
@ -117,8 +160,10 @@ class PostListController {
canBulkEditSafety: api.hasPrivilege( canBulkEditSafety: api.hasPrivilege(
"posts:bulk-edit:safety" "posts:bulk-edit:safety"
), ),
canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"),
bulkEdit: { bulkEdit: {
tags: this._bulkEditTags, tags: this._bulkEditTags,
markedForDeletion: this._postsMarkedForDeletion,
}, },
postFlow: settings.get().postFlow, postFlow: settings.get().postFlow,
}); });
@ -128,6 +173,9 @@ class PostListController {
view.addEventListener("changeSafety", (e) => view.addEventListener("changeSafety", (e) =>
this._evtChangeSafety(e) this._evtChangeSafety(e)
); );
view.addEventListener("markForDeletion", (e) =>
this._evtMarkForDeletion(e)
);
return view; return view;
}, },
}); });

View file

@ -22,6 +22,7 @@ function _mimeTypeToPostType(mimeType) {
"image/heic": "image", "image/heic": "image",
"video/mp4": "video", "video/mp4": "video",
"video/webm": "video", "video/webm": "video",
"video/quicktime": "video",
}[mimeType] || "unknown" }[mimeType] || "unknown"
); );
} }
@ -120,6 +121,7 @@ class Url extends Uploadable {
heif: "image/heif", heif: "image/heif",
heic: "image/heic", heic: "image/heic",
mp4: "video/mp4", mp4: "video/mp4",
mov: "video/quicktime",
webm: "video/webm", webm: "video/webm",
}; };
for (let extension of Object.keys(mime)) { for (let extension of Object.keys(mime)) {

View file

@ -141,6 +141,34 @@ class BulkTagEditor extends BulkEditor {
} }
} }
class BulkDeleteEditor extends BulkEditor {
constructor(hostNode) {
super(hostNode);
this._hostNode.addEventListener("submit", (e) =>
this._evtFormSubmit(e)
);
}
_evtFormSubmit(e) {
e.preventDefault();
this.dispatchEvent(
new CustomEvent("deleteSelectedPosts", { detail: {} })
);
}
_evtOpenLinkClick(e) {
e.preventDefault();
this.toggleOpen(true);
this.dispatchEvent(new CustomEvent("open", { detail: {} }));
}
_evtCloseLinkClick(e) {
e.preventDefault();
this.toggleOpen(false);
this.dispatchEvent(new CustomEvent("close", { detail: {} }));
}
}
class PostsHeaderView extends events.EventTarget { class PostsHeaderView extends events.EventTarget {
constructor(ctx) { constructor(ctx) {
super(); super();
@ -186,6 +214,13 @@ class PostsHeaderView extends events.EventTarget {
this._bulkEditors.push(this._bulkSafetyEditor); this._bulkEditors.push(this._bulkSafetyEditor);
} }
if (this._bulkEditDeleteNode) {
this._bulkDeleteEditor = new BulkDeleteEditor(
this._bulkEditDeleteNode
);
this._bulkEditors.push(this._bulkDeleteEditor);
}
for (let editor of this._bulkEditors) { for (let editor of this._bulkEditors) {
editor.addEventListener("submit", (e) => { editor.addEventListener("submit", (e) => {
this._navigate(); this._navigate();
@ -204,6 +239,8 @@ class PostsHeaderView extends events.EventTarget {
this._openBulkEditor(this._bulkTagEditor); this._openBulkEditor(this._bulkTagEditor);
} else if (ctx.parameters.safety && this._bulkSafetyEditor) { } else if (ctx.parameters.safety && this._bulkSafetyEditor) {
this._openBulkEditor(this._bulkSafetyEditor); this._openBulkEditor(this._bulkSafetyEditor);
} else if (ctx.parameters.delete && this._bulkDeleteEditor) {
this._openBulkEditor(this._bulkDeleteEditor);
} }
} }
@ -227,6 +264,10 @@ class PostsHeaderView extends events.EventTarget {
return this._hostNode.querySelector(".bulk-edit-safety"); return this._hostNode.querySelector(".bulk-edit-safety");
} }
get _bulkEditDeleteNode() {
return this._hostNode.querySelector(".bulk-edit-delete");
}
_openBulkEditor(editor) { _openBulkEditor(editor) {
editor.toggleOpen(true); editor.toggleOpen(true);
this._hideBulkEditorsExcept(editor); this._hideBulkEditorsExcept(editor);
@ -293,6 +334,10 @@ class PostsHeaderView extends events.EventTarget {
this._bulkSafetyEditor && this._bulkSafetyEditor.opened this._bulkSafetyEditor && this._bulkSafetyEditor.opened
? "1" ? "1"
: null; : null;
parameters.delete =
this._bulkDeleteEditor && this._bulkDeleteEditor.opened
? "1"
: null;
this.dispatchEvent( this.dispatchEvent(
new CustomEvent("navigate", { detail: { parameters: parameters } }) new CustomEvent("navigate", { detail: { parameters: parameters } })
); );

View file

@ -39,6 +39,13 @@ class PostsPageView extends events.EventTarget {
); );
} }
} }
const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
if (deleteFlipperNode) {
deleteFlipperNode.addEventListener("click", (e) =>
this._evtBulkToggleDeleteClick(e, post)
);
}
} }
this._syncBulkEditorsHighlights(); this._syncBulkEditorsHighlights();
@ -56,6 +63,10 @@ class PostsPageView extends events.EventTarget {
return listItemNode.querySelector(".safety-flipper"); return listItemNode.querySelector(".safety-flipper");
} }
_getDeleteFlipperNode(listItemNode) {
return listItemNode.querySelector(".delete-flipper");
}
_evtPostChange(e) { _evtPostChange(e) {
const listItemNode = this._postIdToListItemNode[e.detail.post.id]; const listItemNode = this._postIdToListItemNode[e.detail.post.id];
for (let node of listItemNode.querySelectorAll("[data-disabled]")) { for (let node of listItemNode.querySelectorAll("[data-disabled]")) {
@ -99,6 +110,20 @@ class PostsPageView extends events.EventTarget {
); );
} }
_evtBulkToggleDeleteClick(e, post) {
e.preventDefault();
const linkNode = e.target;
linkNode.classList.toggle("delete");
this.dispatchEvent(
new CustomEvent("markForDeletion", {
detail: {
post,
delete: linkNode.classList.contains("delete"),
},
})
);
}
_syncBulkEditorsHighlights() { _syncBulkEditorsHighlights() {
for (let listItemNode of this._listItemNodes) { for (let listItemNode of this._listItemNodes) {
const postId = listItemNode.getAttribute("data-post-id"); const postId = listItemNode.getAttribute("data-post-id");
@ -123,6 +148,16 @@ class PostsPageView extends events.EventTarget {
); );
} }
} }
const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
if (deleteFlipperNode) {
deleteFlipperNode.classList.toggle(
"delete",
this._ctx.bulkEdit.markedForDeletion.some(
(x) => x.id == postId
)
);
}
} }
} }
} }

206
client/package-lock.json generated
View file

@ -28,7 +28,7 @@
"jimp": "^0.13.0", "jimp": "^0.13.0",
"pretty-error": "^3.0.3", "pretty-error": "^3.0.3",
"stylus": "^0.54.8", "stylus": "^0.54.8",
"terser": "^3.7.7", "terser": "^4.8.1",
"underscore": "^1.12.1", "underscore": "^1.12.1",
"watchify": "^4.0.0", "watchify": "^4.0.0",
"ws": "^7.4.6" "ws": "^7.4.6"
@ -476,24 +476,6 @@
"node": ">= 8" "node": ">= 8"
} }
}, },
"node_modules/array-filter": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
"dev": true
},
"node_modules/array-map": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
"integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
"dev": true
},
"node_modules/array-reduce": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
"integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
"dev": true
},
"node_modules/asn1.js": { "node_modules/asn1.js": {
"version": "4.10.1", "version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
@ -1515,7 +1497,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"dependencies": { "dependencies": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2" "get-intrinsic": "^1.0.2"
@ -1682,9 +1663,9 @@
"dev": true "dev": true
}, },
"node_modules/cookiejar": { "node_modules/cookiejar": {
"version": "2.1.2", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
}, },
"node_modules/core-js": { "node_modules/core-js": {
"version": "2.5.7", "version": "2.5.7",
@ -1850,9 +1831,9 @@
} }
}, },
"node_modules/decode-uri-component": { "node_modules/decode-uri-component": {
"version": "0.2.0", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=0.10" "node": ">=0.10"
@ -2254,8 +2235,7 @@
"node_modules/function-bind": { "node_modules/function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"dev": true
}, },
"node_modules/get-assigned-identifiers": { "node_modules/get-assigned-identifiers": {
"version": "1.2.0", "version": "1.2.0",
@ -2267,7 +2247,6 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"dependencies": { "dependencies": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"has": "^1.0.3", "has": "^1.0.3",
@ -2351,7 +2330,6 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": { "dependencies": {
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
}, },
@ -2384,7 +2362,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true,
"engines": { "engines": {
"node": ">= 0.4" "node": ">= 0.4"
}, },
@ -2859,9 +2836,9 @@
"dev": true "dev": true
}, },
"node_modules/jpeg-js": { "node_modules/jpeg-js": {
"version": "0.4.0", "version": "0.4.4",
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
"integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w==", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
"dev": true "dev": true
}, },
"node_modules/js-cookie": { "node_modules/js-cookie": {
@ -3224,7 +3201,6 @@
"version": "1.10.3", "version": "1.10.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
"dev": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
@ -3507,11 +3483,17 @@
"dev": true "dev": true
}, },
"node_modules/qs": { "node_modules/qs": {
"version": "6.5.2", "version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": { "engines": {
"node": ">=0.6" "node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/querystring": { "node_modules/querystring": {
@ -3770,15 +3752,22 @@
} }
}, },
"node_modules/shell-quote": { "node_modules/shell-quote": {
"version": "1.6.1", "version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true, "dev": true
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": { "dependencies": {
"array-filter": "~0.0.0", "call-bind": "^1.0.0",
"array-map": "~0.0.0", "get-intrinsic": "^1.0.2",
"array-reduce": "~0.0.0", "object-inspect": "^1.9.0"
"jsonify": "~0.0.0" },
"funding": {
"url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/simple-concat": { "node_modules/simple-concat": {
@ -4022,26 +4011,26 @@
} }
}, },
"node_modules/terser": { "node_modules/terser": {
"version": "3.7.7", "version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-3.7.7.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-RRLIxE7S52vSOI9cEbOaisgBd2y6MNgfg2ihUkidsFnuP1eDmZ79+lBWbyvgfFTAc/r8nSjL0k3cpZDDIYiYiA==", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"commander": "~2.14.1", "commander": "^2.20.0",
"source-map": "~0.6.1", "source-map": "~0.6.1",
"source-map-support": "~0.5.6" "source-map-support": "~0.5.12"
}, },
"bin": { "bin": {
"terser": "bin/uglifyjs" "terser": "bin/terser"
}, },
"engines": { "engines": {
"node": ">=0.8.0" "node": ">=6.0.0"
} }
}, },
"node_modules/terser/node_modules/commander": { "node_modules/terser/node_modules/commander": {
"version": "2.14.1", "version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true "dev": true
}, },
"node_modules/terser/node_modules/source-map": { "node_modules/terser/node_modules/source-map": {
@ -4054,9 +4043,9 @@
} }
}, },
"node_modules/terser/node_modules/source-map-support": { "node_modules/terser/node_modules/source-map-support": {
"version": "0.5.6", "version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"buffer-from": "^1.0.0", "buffer-from": "^1.0.0",
@ -5041,24 +5030,6 @@
"picomatch": "^2.0.4" "picomatch": "^2.0.4"
} }
}, },
"array-filter": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
"dev": true
},
"array-map": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
"integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
"dev": true
},
"array-reduce": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
"integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
"dev": true
},
"asn1.js": { "asn1.js": {
"version": "4.10.1", "version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
@ -6056,7 +6027,6 @@
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2" "get-intrinsic": "^1.0.2"
@ -6205,9 +6175,9 @@
"dev": true "dev": true
}, },
"cookiejar": { "cookiejar": {
"version": "2.1.2", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
}, },
"core-js": { "core-js": {
"version": "2.5.7", "version": "2.5.7",
@ -6357,9 +6327,9 @@
} }
}, },
"decode-uri-component": { "decode-uri-component": {
"version": "0.2.0", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
"dev": true "dev": true
}, },
"define-properties": { "define-properties": {
@ -6691,8 +6661,7 @@
"function-bind": { "function-bind": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"dev": true
}, },
"get-assigned-identifiers": { "get-assigned-identifiers": {
"version": "1.2.0", "version": "1.2.0",
@ -6704,7 +6673,6 @@
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1", "function-bind": "^1.1.1",
"has": "^1.0.3", "has": "^1.0.3",
@ -6772,7 +6740,6 @@
"version": "1.0.3", "version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": { "requires": {
"function-bind": "^1.1.1" "function-bind": "^1.1.1"
} }
@ -6795,8 +6762,7 @@
"has-symbols": { "has-symbols": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
"dev": true
}, },
"hash-base": { "hash-base": {
"version": "3.0.4", "version": "3.0.4",
@ -7152,9 +7118,9 @@
} }
}, },
"jpeg-js": { "jpeg-js": {
"version": "0.4.0", "version": "0.4.4",
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
"integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w==", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
"dev": true "dev": true
}, },
"js-cookie": { "js-cookie": {
@ -7460,8 +7426,7 @@
"object-inspect": { "object-inspect": {
"version": "1.10.3", "version": "1.10.3",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw=="
"dev": true
}, },
"object-keys": { "object-keys": {
"version": "1.1.1", "version": "1.1.1",
@ -7699,9 +7664,12 @@
"dev": true "dev": true
}, },
"qs": { "qs": {
"version": "6.5.2", "version": "6.11.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
"requires": {
"side-channel": "^1.0.4"
}
}, },
"querystring": { "querystring": {
"version": "0.2.0", "version": "0.2.0",
@ -7930,15 +7898,19 @@
} }
}, },
"shell-quote": { "shell-quote": {
"version": "1.6.1", "version": "1.7.3",
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
"integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true, "dev": true
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": { "requires": {
"array-filter": "~0.0.0", "call-bind": "^1.0.0",
"array-map": "~0.0.0", "get-intrinsic": "^1.0.2",
"array-reduce": "~0.0.0", "object-inspect": "^1.9.0"
"jsonify": "~0.0.0"
} }
}, },
"simple-concat": { "simple-concat": {
@ -8145,20 +8117,20 @@
} }
}, },
"terser": { "terser": {
"version": "3.7.7", "version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-3.7.7.tgz", "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-RRLIxE7S52vSOI9cEbOaisgBd2y6MNgfg2ihUkidsFnuP1eDmZ79+lBWbyvgfFTAc/r8nSjL0k3cpZDDIYiYiA==", "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true, "dev": true,
"requires": { "requires": {
"commander": "~2.14.1", "commander": "^2.20.0",
"source-map": "~0.6.1", "source-map": "~0.6.1",
"source-map-support": "~0.5.6" "source-map-support": "~0.5.12"
}, },
"dependencies": { "dependencies": {
"commander": { "commander": {
"version": "2.14.1", "version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true "dev": true
}, },
"source-map": { "source-map": {
@ -8168,9 +8140,9 @@
"dev": true "dev": true
}, },
"source-map-support": { "source-map-support": {
"version": "0.5.6", "version": "0.5.21",
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true, "dev": true,
"requires": { "requires": {
"buffer-from": "^1.0.0", "buffer-from": "^1.0.0",

View file

@ -3,7 +3,8 @@
"private": true, "private": true,
"scripts": { "scripts": {
"build": "node build.js", "build": "node build.js",
"watch": "node build.js --watch" "watch": "node build.js --watch",
"build-container": "docker build -t szurubooru/client:dev ."
}, },
"dependencies": { "dependencies": {
"dompurify": "^2.0.17", "dompurify": "^2.0.17",
@ -28,7 +29,7 @@
"jimp": "^0.13.0", "jimp": "^0.13.0",
"pretty-error": "^3.0.3", "pretty-error": "^3.0.3",
"stylus": "^0.54.8", "stylus": "^0.54.8",
"terser": "^3.7.7", "terser": "^4.8.1",
"underscore": "^1.12.1", "underscore": "^1.12.1",
"watchify": "^4.0.0", "watchify": "^4.0.0",
"ws": "^7.4.6" "ws": "^7.4.6"

View file

@ -115,6 +115,7 @@ privileges:
'posts:favorite': regular 'posts:favorite': regular
'posts:bulk-edit:tags': power 'posts:bulk-edit:tags': power
'posts:bulk-edit:safety': power 'posts:bulk-edit:safety': power
'posts:bulk-edit:delete': power
'tags:create': regular 'tags:create': regular
'tags:edit:names': power 'tags:edit:names': power

View file

@ -39,6 +39,9 @@ def get_mime_type(content: bytes) -> str:
if content[4:12] in (b"ftypisom", b"ftypiso5", b"ftypiso6", b"ftypmp42", b"ftypM4V "): if content[4:12] in (b"ftypisom", b"ftypiso5", b"ftypiso6", b"ftypmp42", b"ftypM4V "):
return "video/mp4" return "video/mp4"
if content[4:12] == b"ftypqt ":
return "video/quicktime"
return "application/octet-stream" return "application/octet-stream"
@ -54,6 +57,7 @@ def get_extension(mime_type: str) -> Optional[str]:
"image/heif": "heif", "image/heif": "heif",
"image/heic": "heic", "image/heic": "heic",
"video/mp4": "mp4", "video/mp4": "mp4",
"video/quicktime": "mov",
"video/webm": "webm", "video/webm": "webm",
"application/octet-stream": "dat", "application/octet-stream": "dat",
} }
@ -65,7 +69,12 @@ def is_flash(mime_type: str) -> bool:
def is_video(mime_type: str) -> bool: def is_video(mime_type: str) -> bool:
return mime_type.lower() in ("application/ogg", "video/mp4", "video/webm") return mime_type.lower() in (
"application/ogg",
"video/mp4",
"video/quicktime",
"video/webm",
)
def is_image(mime_type: str) -> bool: def is_image(mime_type: str) -> bool:

Binary file not shown.

View file

@ -7,6 +7,7 @@ from szurubooru.func import mime
"input_path,expected_mime_type", "input_path,expected_mime_type",
[ [
("mp4.mp4", "video/mp4"), ("mp4.mp4", "video/mp4"),
("mov.mov", "video/quicktime"),
("webm.webm", "video/webm"), ("webm.webm", "video/webm"),
("flash.swf", "application/x-shockwave-flash"), ("flash.swf", "application/x-shockwave-flash"),
("png.png", "image/png"), ("png.png", "image/png"),
@ -35,6 +36,7 @@ def test_get_mime_type_for_empty_file():
[ [
("video/mp4", "mp4"), ("video/mp4", "mp4"),
("video/webm", "webm"), ("video/webm", "webm"),
("video/quicktime", "mov"),
("application/x-shockwave-flash", "swf"), ("application/x-shockwave-flash", "swf"),
("image/png", "png"), ("image/png", "png"),
("image/jpeg", "jpg"), ("image/jpeg", "jpg"),
@ -70,6 +72,8 @@ def test_is_flash(input_mime_type, expected_state):
("VIDEO/WEBM", True), ("VIDEO/WEBM", True),
("video/mp4", True), ("video/mp4", True),
("VIDEO/MP4", True), ("VIDEO/MP4", True),
("video/quicktime", True),
("VIDEO/QUICKTIME", True),
("video/anything_else", False), ("video/anything_else", False),
("application/ogg", True), ("application/ogg", True),
("not a video", False), ("not a video", False),

View file

@ -1,3 +1,5 @@
import os
import pytest import pytest
from szurubooru import errors from szurubooru import errors
@ -16,6 +18,9 @@ def inject_config(tmpdir, config_injector):
) )
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
def test_download(): def test_download():
url = "http://info.cern.ch/hypertext/WWW/TheProject.html" url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
@ -62,6 +67,9 @@ def test_download():
assert actual_content == expected_content assert actual_content == expected_content
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"url", "url",
[ [
@ -74,6 +82,9 @@ def test_too_large_download(url):
net.download(url, use_video_downloader=True) net.download(url, use_video_downloader=True)
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"url,expected_sha1", "url,expected_sha1",
[ [
@ -96,6 +107,9 @@ def test_content_download(url, expected_sha1):
assert get_sha1(actual_content) == expected_sha1 assert get_sha1(actual_content) == expected_sha1
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
def test_bad_content_downlaod(): def test_bad_content_downlaod():
url = "http://info.cern.ch/hypertext/WWW/TheProject.html" url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
with pytest.raises(errors.ThirdPartyError): with pytest.raises(errors.ThirdPartyError):
@ -108,11 +122,13 @@ def test_no_webhooks(config_injector):
assert len(res) == 0 assert len(res) == 0
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
@pytest.mark.parametrize( @pytest.mark.parametrize(
"webhook,status_code", "webhook,status_code",
[ [
("https://postman-echo.com/post", 200), ("https://postman-echo.com/post", 200),
("http://localhost/", 400),
("https://postman-echo.com/get", 400), ("https://postman-echo.com/get", 400),
], ],
) )
@ -121,6 +137,9 @@ def test_single_webhook(config_injector, webhook, status_code):
assert ret == status_code assert ret == status_code
@pytest.mark.skipif(
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
)
def test_multiple_webhooks(config_injector): def test_multiple_webhooks(config_injector):
config_injector( config_injector(
{ {