Skip to content
Merged

Dev #75

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 0 additions & 10 deletions README.en.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,4 @@ A convenient tool to download pictures from various pixiv and APIs.

# Usage

- Download the latest Release in [Releases](https://github.com/zxzxy/ACGPicDownload/releases)

> If you already have Java17+ installed, then you can download `ACGPicDownload.version.jar` and run it through command
> line. Or
> download `ACGPicDownload.version.win.exe` on Windows and run.

> If you don't, then you can download JDK17+ [here](https://adoptium.net/en-US/temurin/archive), or
> download `ACGPicDownload.version.win.7z`, which has JDK17 included


Please go to [wiki](https://github.com/zxzxy/ACGPicDownload/wiki) for usage...
10 changes: 1 addition & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,4 @@ GUI:

# 如何使用

- 在[Releases](https://github.com/zxzxy/ACGPicDownload/releases)下载最新版本

> 如果你的设备已经安装了Java17+,那么可以下载 `ACGPicDownload.版本号.jar` 并直接使用命令行运行,或在 Windows
> 上下载 `ACGPicDownload.版本号.win.exe` 并直接运行

> 如果并没有Java17+安装,那么可以在[这里](https://adoptium.net/zh-CN/temurin/archive)
> 下载安装Java17以上的版本,或者如果你是Windows,则可以下载 `ACGPicDownload.版本号.win.jdk.7z`, 里面自带JDK17

- 请在[wiki](https://github.com/zxzxy/ACGPicDownload/wiki)查看详细使用教程~
- 请在[wiki](https://github.com/ZayrexDev/ACGPicDownload/wiki)查看详细使用教程~
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>xyz.zcraft</groupId>
<artifactId>ACGPicDownload</artifactId>
<version>3.5.0</version>
<version>3.5.1</version>

<properties>
<maven.compiler.source>21</maven.compiler.source>
Expand Down
29 changes: 18 additions & 11 deletions src/main/java/xyz/zcraft/acgpicdownload/commands/pixiv/Pixiv.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;

import xyz.zcraft.acgpicdownload.commands.pixiv.sub.*;
import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;

Expand All @@ -12,7 +13,7 @@

public class Pixiv {
private final List<String> subCommands = List.of(
"discovery", "download", "ranking", "user", "save", "load", "complete", "filter"
"download", "fetch", "save", "load", "complete", "filter", "add"
);
private final List<Integer> fragments = new LinkedList<>(List.of(1));
private String cookie = null;
Expand Down Expand Up @@ -100,15 +101,21 @@ private boolean parseArgs(ArrayList<String> argList, int i) {

private void executeSubCommand(ArrayList<String> argList, int i) throws Exception {
final List<String> subArgs = argList.subList(fragments.get(i), fragments.get(i + 1));
switch (argList.get(fragments.get(i)).toLowerCase()) {
case "discovery" -> previous = new Fetcher().invoke(subArgs, profile, Fetcher.Mode.Discovery);
case "download" -> new Download().invoke(subArgs, profile, previous);
case "save" -> new Saver().invoke(subArgs, previous);
case "ranking" -> previous = new Fetcher().invoke(subArgs, profile, Fetcher.Mode.Ranking);
case "user" -> previous = new Fetcher().invoke(subArgs, profile, Fetcher.Mode.User);
case "load" -> previous = new Loader().invoke(subArgs);
case "complete" -> previous = new Complete().invoke(subArgs, profile, previous);
case "filter" -> previous = new Filter().invoke(subArgs, profile, previous);
}

SubCommand subCommand = switch (argList.get(fragments.get(i)).toLowerCase()) {
case "fetch" -> new Fetch();
case "download" -> new Download();
case "save" -> new Save();
case "load" -> new Load();
case "complete" -> new Complete();
case "filter" -> new Filter();
case "add" -> new Add();
default -> {
logger.err("Unknown sub-command: " + argList.get(fragments.get(i)));
throw new IllegalArgumentException("Unknown sub-command: " + argList.get(fragments.get(i)));
}
};

previous = subCommand.invoke(subArgs, profile, previous);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;

import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;

import java.util.List;

public abstract class SubCommand {
protected final org.apache.log4j.Logger log;
protected final Logger out;

public SubCommand() {
log = org.apache.log4j.Logger.getLogger(this.getClass());
out = new Logger(this.getClass().getSimpleName());
}

public abstract List<PixivArtwork> invoke(List<String> argList, Profile profile, List<PixivArtwork> previous) throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package xyz.zcraft.acgpicdownload.commands.pixiv.sub;

import xyz.zcraft.acgpicdownload.commands.pixiv.Profile;
import xyz.zcraft.acgpicdownload.commands.pixiv.SubCommand;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;

import java.util.LinkedList;
import java.util.List;

public class Add extends SubCommand {
Copy link

Copilot AI Jan 4, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This method overrides SubCommand.invoke; it is advisable to add an Override annotation.

Suggested change
public class Add extends SubCommand {
public class Add extends SubCommand {
@Override

Copilot uses AI. Check for mistakes.
public List<PixivArtwork> invoke(List<String> argList, Profile profile, List<PixivArtwork> previous) throws Exception {
List<String> idStrings = new LinkedList<>();

for (int i = 1; i < argList.size(); i++) {
String e = argList.get(i);
idStrings.addAll(List.of(e.split(",")));
}

List<PixivArtwork> result = new LinkedList<>();

for (String idString : idStrings) {
if (idString.trim().isEmpty()) continue;
try {
int id = Integer.parseInt(idString.trim());
PixivArtwork newArtwork = new PixivArtwork();
newArtwork.setId(String.valueOf(id));
result.add(newArtwork);
} catch (NumberFormatException e) {
out.err("Invalid artwork ID: " + idString + ", skipping.");
}
}

out.info("Added " + result.size() + " artworks.");
if (previous != null && !previous.isEmpty()) {
out.info("Appending to previous " + previous.size() + " artwork data, now total: " + (previous.size() + result.size()));
previous.addAll(result);
return previous;
} else {
return result;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;
package xyz.zcraft.acgpicdownload.commands.pixiv.sub;

import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.commands.pixiv.Profile;
import xyz.zcraft.acgpicdownload.commands.pixiv.SubCommand;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivFetchUtil;

Expand All @@ -13,10 +14,7 @@
import java.util.function.Function;
import java.util.stream.Stream;

public class Complete {
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Complete.class);
private static final Logger out = new Logger("Complete");

public class Complete extends SubCommand {
private int threads = 2;
private int retries = 5;

Expand Down Expand Up @@ -83,6 +81,7 @@ public List<PixivArtwork> invoke(List<String> argList, Profile profile, List<Pix
for (int j = 0; j < v; j++) System.out.print("=");
for (int k = 0; k < (16 - v); k++) System.out.print(" ");
System.out.print("]\n");
//noinspection BusyWait
Thread.sleep(1000);
System.out.print("\033[2F");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;
package xyz.zcraft.acgpicdownload.commands.pixiv.sub;

import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.commands.pixiv.Profile;
import xyz.zcraft.acgpicdownload.commands.pixiv.SubCommand;
import xyz.zcraft.acgpicdownload.util.dl.DownloadUtil;
import xyz.zcraft.acgpicdownload.util.pixiv.ArtworkCondition;
import xyz.zcraft.acgpicdownload.util.pixiv.NamingRule;
Expand All @@ -16,12 +17,8 @@
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;

public class Download {
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Download.class);
private static final Logger out = new Logger("Download");

public class Download extends SubCommand {
public int threads = 5;

private String target = "downloads";

public static void startDownload(Profile profile, List<PixivArtwork> art, int threads, String target) {
Expand Down Expand Up @@ -79,7 +76,7 @@ public static void startDownload(Profile profile, List<PixivArtwork> art, int th
}
}

public void invoke(List<String> argList, Profile profile, List<PixivArtwork> previous) {
public List<PixivArtwork> invoke(List<String> argList, Profile profile, List<PixivArtwork> previous) {
for (int i = 1; i < argList.size(); i++) {
if (!argList.get(i).startsWith("-")) break;
switch (argList.get(i).toLowerCase()) {
Expand Down Expand Up @@ -120,14 +117,16 @@ public void invoke(List<String> argList, Profile profile, List<PixivArtwork> pre

if (previous.isEmpty()) {
out.warn("No artwork to download!");
return;
return previous;
}

out.info(previous.size() + " artworks to download!");

startDownload(profile, previous, threads, target);

out.info("DONE Downloading");

return previous;
}

private record DownloadTask(int threads, PixivArtwork e, ArrayList<PixivDownload> cur,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,31 +1,44 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;
package xyz.zcraft.acgpicdownload.commands.pixiv.sub;


import lombok.Getter;
import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.commands.pixiv.Profile;
import xyz.zcraft.acgpicdownload.commands.pixiv.SubCommand;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivFetchUtil;

import java.io.IOException;
import java.util.LinkedList;
import java.util.List;

public class Fetcher {
@SuppressWarnings("unused")
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Fetcher.class);
private static final Logger out = new Logger("Fetcher");

public class Fetch extends SubCommand {
private ArtProvider ap;
private boolean append = false;

public List<PixivArtwork> invoke(List<String> argList, Profile profile, Mode mode) {
public List<PixivArtwork> invoke(List<String> argList, Profile profile, List<PixivArtwork> previous) {
if (argList.isEmpty()) {
out.err("Please specify a fetch mode: -discovery, -user, -ranking, -search");
throw new IllegalArgumentException("Please specify a fetch mode: -discovery, -user, -ranking, -search");
}
Mode mode = switch (argList.get(1).toLowerCase()) {
case "-discovery" -> Mode.Discovery;
case "-user" -> Mode.User;
case "-ranking" -> Mode.Ranking;
case "-search" -> Mode.Search;
default -> {
out.err("Unknown fetch mode: " + argList.getFirst());
throw new IllegalArgumentException("Unknown fetch mode: " + argList.getFirst());
}
};
switch (mode) {
case Discovery -> {
int discMode = 0;
int count = 1;

for (int i = 1; i < argList.size(); i++) {
for (int i = 2; i < argList.size(); i++) {
if (!argList.get(i).startsWith("-")) break;
switch (argList.get(i).toLowerCase()) {
case "-m", "-mode": {
case "-m", "-mode" -> {
if (argList.size() > i + 1) {
i++;
if (!List.of(PixivFetchUtil.DISCOVERY_MODES).contains(argList.get(i))) {
Expand All @@ -38,10 +51,8 @@ public List<PixivArtwork> invoke(List<String> argList, Profile profile, Mode mod
out.err("Please specify a mode");
throw new IllegalArgumentException("Please specify a mode");
}
break;
}

case "-c", "-count": {
case "-c", "-count" -> {
if (argList.size() > i + 1) {
i++;
final int c = Integer.parseInt(argList.get(i));
Expand All @@ -55,8 +66,8 @@ public List<PixivArtwork> invoke(List<String> argList, Profile profile, Mode mod
out.err("Please specify a number.");
throw new IllegalArgumentException("Please specify a number.");
}
break;
}
case "-a", "-append" -> append = true;
}
}

Expand All @@ -78,7 +89,7 @@ public List<PixivArtwork> invoke(List<String> argList, Profile profile, Mode mod
}
}

var f = new Fetch(ap);
var f = new Fetcher(ap);

f.run();

Expand Down Expand Up @@ -120,7 +131,14 @@ public List<PixivArtwork> invoke(List<String> argList, Profile profile, Mode mod
System.out.print("\nDONE fetching " + mode + ". " + art.size() + " artworks found.\n");
System.out.print("\033[?25h");

return art;
if (append && previous != null) {
out.info("Appending to previous " + previous.size() + " artworks, total " + (previous.size() + art.size()) + " artworks.");
LinkedList<PixivArtwork> combined = new LinkedList<>(previous);
combined.addAll(art);
return combined;
} else {
return art;
}
}

public enum Mode {
Expand All @@ -141,7 +159,7 @@ public interface ArtProvider {
List<PixivArtwork> fetch() throws IOException;
}

private static class Fetch {
private static class Fetcher {
private final ArtProvider ap;
@Getter
private Exception exception;
Expand All @@ -152,7 +170,7 @@ private static class Fetch {
@Getter
private List<PixivArtwork> result = null;

public Fetch(ArtProvider ap) {
public Fetcher(ArtProvider ap) {
this.ap = ap;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package xyz.zcraft.acgpicdownload.commands.pixiv;
package xyz.zcraft.acgpicdownload.commands.pixiv.sub;

import xyz.zcraft.acgpicdownload.util.Logger;
import xyz.zcraft.acgpicdownload.commands.pixiv.Profile;
import xyz.zcraft.acgpicdownload.commands.pixiv.SubCommand;
import xyz.zcraft.acgpicdownload.util.pixiv.PixivArtwork;

import java.util.LinkedList;
import java.util.List;

public class Filter {
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(Filter.class);
private static final Logger out = new Logger("Filter");

public class Filter extends SubCommand {
private int bookmark = -1;
private int view = -1;
private int like = -1;
Expand Down
Loading