mirror of
https://github.com/mikf/gallery-dl.git
synced 2024-11-22 02:32:33 +01:00
[pp:classify] rewrite & simplify (#5213)
Do not manually build paths, which get later overwritten by
pathfmt.build_path() anyway. Just update the target directory and let
the rest of the "path logic" handle it.
Fixes skipping previously downloaded and categorized files,
which was broken since 8124c16a50
This commit is contained in:
parent
00fe1c81b2
commit
9b2d782cb7
@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
# Copyright 2018-2021 Mike Fährmann
|
# Copyright 2018-2024 Mike Fährmann
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License version 2 as
|
# it under the terms of the GNU General Public License version 2 as
|
||||||
@ -15,44 +15,43 @@ import os
|
|||||||
class ClassifyPP(PostProcessor):
|
class ClassifyPP(PostProcessor):
|
||||||
|
|
||||||
DEFAULT_MAPPING = {
|
DEFAULT_MAPPING = {
|
||||||
"Music" : ("mp3", "aac", "flac", "ogg", "wma", "m4a", "wav"),
|
"Pictures" : ("jpg", "jpeg", "png", "gif", "bmp", "svg", "webp",
|
||||||
|
"avif", "heic", "heif", "ico", "psd"),
|
||||||
"Video" : ("flv", "ogv", "avi", "mp4", "mpg", "mpeg", "3gp", "mkv",
|
"Video" : ("flv", "ogv", "avi", "mp4", "mpg", "mpeg", "3gp", "mkv",
|
||||||
"webm", "vob", "wmv"),
|
"webm", "vob", "wmv", "m4v", "mov"),
|
||||||
"Pictures" : ("jpg", "jpeg", "png", "gif", "bmp", "svg", "webp"),
|
"Music" : ("mp3", "aac", "flac", "ogg", "wma", "m4a", "wav"),
|
||||||
"Archives" : ("zip", "rar", "7z", "tar", "gz", "bz2"),
|
"Archives" : ("zip", "rar", "7z", "tar", "gz", "bz2"),
|
||||||
|
"Documents": ("txt", "pdf"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, job, options):
|
def __init__(self, job, options):
|
||||||
PostProcessor.__init__(self, job)
|
PostProcessor.__init__(self, job)
|
||||||
mapping = options.get("mapping", self.DEFAULT_MAPPING)
|
self.directory = self.realdirectory = ""
|
||||||
|
|
||||||
|
mapping = options.get("mapping", self.DEFAULT_MAPPING)
|
||||||
self.mapping = {
|
self.mapping = {
|
||||||
ext: directory
|
ext: directory
|
||||||
for directory, exts in mapping.items()
|
for directory, exts in mapping.items()
|
||||||
for ext in exts
|
for ext in exts
|
||||||
}
|
}
|
||||||
job.register_hooks(
|
|
||||||
{"prepare": self.prepare, "file": self.move}, options)
|
job.register_hooks({
|
||||||
|
"post" : self.initialize,
|
||||||
|
"prepare": self.prepare,
|
||||||
|
}, options)
|
||||||
|
|
||||||
|
def initialize(self, pathfmt):
|
||||||
|
# store base directory paths
|
||||||
|
self.directory = pathfmt.directory
|
||||||
|
self.realdirectory = pathfmt.realdirectory
|
||||||
|
|
||||||
def prepare(self, pathfmt):
|
def prepare(self, pathfmt):
|
||||||
|
# extend directory paths depending on file extension
|
||||||
ext = pathfmt.extension
|
ext = pathfmt.extension
|
||||||
if ext in self.mapping:
|
if ext in self.mapping:
|
||||||
# set initial paths to enable download skips
|
extra = self.mapping[ext] + os.sep
|
||||||
self._build_paths(pathfmt, self.mapping[ext])
|
pathfmt.directory = self.directory + extra
|
||||||
|
pathfmt.realdirectory = self.realdirectory + extra
|
||||||
def move(self, pathfmt):
|
|
||||||
ext = pathfmt.extension
|
|
||||||
if ext in self.mapping:
|
|
||||||
# rebuild paths in case the filename extension changed
|
|
||||||
path = self._build_paths(pathfmt, self.mapping[ext])
|
|
||||||
os.makedirs(path, exist_ok=True)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _build_paths(pathfmt, extra):
|
|
||||||
path = pathfmt.realdirectory + extra
|
|
||||||
pathfmt.realpath = path + os.sep + pathfmt.filename
|
|
||||||
pathfmt.path = pathfmt.directory + extra + os.sep + pathfmt.filename
|
|
||||||
return path
|
|
||||||
|
|
||||||
|
|
||||||
__postprocessor__ = ClassifyPP
|
__postprocessor__ = ClassifyPP
|
||||||
|
@ -120,30 +120,37 @@ class ClassifyTest(BasePostprocessorTest):
|
|||||||
for directory, exts in pp.DEFAULT_MAPPING.items()
|
for directory, exts in pp.DEFAULT_MAPPING.items()
|
||||||
for ext in exts
|
for ext in exts
|
||||||
})
|
})
|
||||||
self.pathfmt.set_extension("jpg")
|
|
||||||
self.pathfmt.build_path()
|
|
||||||
|
|
||||||
pp.prepare(self.pathfmt)
|
self.assertEqual(pp.directory, "")
|
||||||
|
self._trigger(("post",))
|
||||||
|
self.assertEqual(pp.directory, self.pathfmt.directory)
|
||||||
|
|
||||||
|
self.pathfmt.set_extension("jpg")
|
||||||
|
self._trigger(("prepare",))
|
||||||
|
self.pathfmt.build_path()
|
||||||
path = os.path.join(self.dir.name, "test", "Pictures")
|
path = os.path.join(self.dir.name, "test", "Pictures")
|
||||||
self.assertEqual(self.pathfmt.path, path + "/file.jpg")
|
self.assertEqual(self.pathfmt.path, path + "/file.jpg")
|
||||||
self.assertEqual(self.pathfmt.realpath, path + "/file.jpg")
|
self.assertEqual(self.pathfmt.realpath, path + "/file.jpg")
|
||||||
|
|
||||||
with patch("os.makedirs") as mkdirs:
|
self.pathfmt.set_extension("mp4")
|
||||||
self._trigger()
|
self._trigger(("prepare",))
|
||||||
mkdirs.assert_called_once_with(path, exist_ok=True)
|
self.pathfmt.build_path()
|
||||||
|
path = os.path.join(self.dir.name, "test", "Video")
|
||||||
|
self.assertEqual(self.pathfmt.path, path + "/file.mp4")
|
||||||
|
self.assertEqual(self.pathfmt.realpath, path + "/file.mp4")
|
||||||
|
|
||||||
def test_classify_noop(self):
|
def test_classify_noop(self):
|
||||||
pp = self._create()
|
pp = self._create()
|
||||||
rp = self.pathfmt.realpath
|
rp = self.pathfmt.realpath
|
||||||
|
|
||||||
pp.prepare(self.pathfmt)
|
self.assertEqual(pp.directory, "")
|
||||||
|
self._trigger(("post",))
|
||||||
|
self._trigger(("prepare",))
|
||||||
|
|
||||||
|
self.assertEqual(pp.directory, self.pathfmt.directory)
|
||||||
self.assertEqual(self.pathfmt.path, rp)
|
self.assertEqual(self.pathfmt.path, rp)
|
||||||
self.assertEqual(self.pathfmt.realpath, rp)
|
self.assertEqual(self.pathfmt.realpath, rp)
|
||||||
|
|
||||||
with patch("os.makedirs") as mkdirs:
|
|
||||||
self._trigger()
|
|
||||||
self.assertEqual(mkdirs.call_count, 0)
|
|
||||||
|
|
||||||
def test_classify_custom(self):
|
def test_classify_custom(self):
|
||||||
pp = self._create({"mapping": {
|
pp = self._create({"mapping": {
|
||||||
"foo/bar": ["foo", "bar"],
|
"foo/bar": ["foo", "bar"],
|
||||||
@ -153,18 +160,18 @@ class ClassifyTest(BasePostprocessorTest):
|
|||||||
"foo": "foo/bar",
|
"foo": "foo/bar",
|
||||||
"bar": "foo/bar",
|
"bar": "foo/bar",
|
||||||
})
|
})
|
||||||
self.pathfmt.set_extension("foo")
|
|
||||||
self.pathfmt.build_path()
|
|
||||||
|
|
||||||
pp.prepare(self.pathfmt)
|
self.assertEqual(pp.directory, "")
|
||||||
|
self._trigger(("post",))
|
||||||
|
self.assertEqual(pp.directory, self.pathfmt.directory)
|
||||||
|
|
||||||
|
self.pathfmt.set_extension("foo")
|
||||||
|
self._trigger(("prepare",))
|
||||||
|
self.pathfmt.build_path()
|
||||||
path = os.path.join(self.dir.name, "test", "foo", "bar")
|
path = os.path.join(self.dir.name, "test", "foo", "bar")
|
||||||
self.assertEqual(self.pathfmt.path, path + "/file.foo")
|
self.assertEqual(self.pathfmt.path, path + "/file.foo")
|
||||||
self.assertEqual(self.pathfmt.realpath, path + "/file.foo")
|
self.assertEqual(self.pathfmt.realpath, path + "/file.foo")
|
||||||
|
|
||||||
with patch("os.makedirs") as mkdirs:
|
|
||||||
self._trigger()
|
|
||||||
mkdirs.assert_called_once_with(path, exist_ok=True)
|
|
||||||
|
|
||||||
|
|
||||||
class ExecTest(BasePostprocessorTest):
|
class ExecTest(BasePostprocessorTest):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user