From 5ee07ec6991a8f616b1e211d49e429d9c1f68c54 Mon Sep 17 00:00:00 2001 From: lijia Date: Thu, 11 Mar 2021 09:57:33 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E5=AE=8C=E6=88=90=E5=90=8E=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E9=9F=B3(=E9=BB=98=E8=AE=A4=E5=85=B3?= =?UTF-8?q?=E9=97=AD)=20`bilibili.download.playSound=20=3D=20false`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app.config | 4 +- release/config/app.config | 4 +- src/nicelee/bilibili/util/ConfigUtil.java | 1 + src/nicelee/ui/Audio.java | 53 +++++++++++++++++++++ src/nicelee/ui/Global.java | 1 + src/nicelee/ui/thread/MonitoringThread.java | 9 ++++ src/resources/app.config | 2 + 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/nicelee/ui/Audio.java diff --git a/config/app.config b/config/app.config index 50f564d9..35630b9f 100644 --- a/config/app.config +++ b/config/app.config @@ -22,7 +22,9 @@ bilibili.name.format = 0_test\UpName\(:listName listName-)avTitle-pDisplay-pAv-c # 若为false, 那么会追加到重命名文件, 可以人工运行rename.bat 重命名 bilibili.name.doAfterComplete = true # 下载完成后是否尝试给相关作品点赞👍(已经点赞的不会取消) -bilibili.download.thumbUp = true +bilibili.download.thumbUp = false +# 全部任务完成后是否播放提示音 +bilibili.download.playSound = false ####################################################################################################### # 下载异常后尝试次数, 0 则异常后不再尝试 bilibili.download.maxFailRetry = 3 diff --git a/release/config/app.config b/release/config/app.config index b93ec82d..2d908441 100644 --- a/release/config/app.config +++ b/release/config/app.config @@ -22,6 +22,8 @@ bilibili.name.format = (:listName 0_listName\)UpName\avTitle-pDisplay-pAv-clipTi bilibili.name.doAfterComplete = true # 下载完成后是否尝试给相关作品点赞👍(已经点赞的不会取消) bilibili.download.thumbUp = false +# 全部任务完成后是否播放提示音 +bilibili.download.playSound = false ####################################################################################################### # 下载异常后尝试次数, 0 则异常后不再尝试 bilibili.download.maxFailRetry = 3 @@ -144,7 +146,7 @@ bilibili.lockCheck = false # 登录方式 # qr 扫描QR二维码 # pwd 使用用户名密码登录 -bilibili.user.login = qr +bilibili.user.login = pwd # 用户名密码登录的实现方式 auto/manual ## auto 用户无感自动登录(不会有用户名密码登录框弹出) diff --git a/src/nicelee/bilibili/util/ConfigUtil.java b/src/nicelee/bilibili/util/ConfigUtil.java index 895157b9..98442d2e 100644 --- a/src/nicelee/bilibili/util/ConfigUtil.java +++ b/src/nicelee/bilibili/util/ConfigUtil.java @@ -85,6 +85,7 @@ public static void initConfigs() { Global.menu_qn = System.getProperty("bilibili.menu.download.qn"); Global.tab_qn = System.getProperty("bilibili.tab.download.qn"); //下载设置相关 + Global.playSoundAfterMissionComplete = "true".equals(System.getProperty("bilibili.download.playSound")); Global.thumbUpAfterDownloaded = "true".equals(System.getProperty("bilibili.download.thumbUp")); int fixPool = Integer.parseInt(System.getProperty("bilibili.download.poolSize")); Global.downLoadThreadPool = Executors.newFixedThreadPool(fixPool); diff --git a/src/nicelee/ui/Audio.java b/src/nicelee/ui/Audio.java new file mode 100644 index 00000000..c3ffc325 --- /dev/null +++ b/src/nicelee/ui/Audio.java @@ -0,0 +1,53 @@ +package nicelee.ui; + +import java.io.ByteArrayOutputStream; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioInputStream; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.Clip; + +public class Audio { + + static byte[] data; + static AudioFormat format; + static int length; + + static long lastPlayTime; + + public static void init() { + try { + // 98KB 比较小可以放进内存常驻 + AudioInputStream in = AudioSystem.getAudioInputStream(Audio.class.getResource("/resources/nice.wav")); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024*4]; + int len = in.read(buffer); + while(len > -1) { + out.write(buffer, 0, len); + len = in.read(buffer); + } + format = in.getFormat(); + data = out.toByteArray(); + length = data.length; + out.close(); + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static void play() { + long currentTime = System.currentTimeMillis(); + if (currentTime - lastPlayTime > 3000) { + lastPlayTime = currentTime; + try { + Clip clip = AudioSystem.getClip(); + clip.open(format, data, 0, length); + clip.start(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/nicelee/ui/Global.java b/src/nicelee/ui/Global.java index d13277ef..879524b6 100644 --- a/src/nicelee/ui/Global.java +++ b/src/nicelee/ui/Global.java @@ -27,6 +27,7 @@ public class Global { public final static int FLV = 1; public volatile static boolean thumbUpAfterDownloaded = false; // 下载完成后是否给作品点赞 + public static boolean playSoundAfterMissionComplete = false; // 全部下载任务完成后是否播放提示音 public static int maxFailRetry = 3; // 下载异常后重试次数 public static int downloadFormat = MP4; //优先下载格式,如不存在该类型的源,那么将默认转为下载另一种格式 diff --git a/src/nicelee/ui/thread/MonitoringThread.java b/src/nicelee/ui/thread/MonitoringThread.java index 0312cb20..382b556b 100644 --- a/src/nicelee/ui/thread/MonitoringThread.java +++ b/src/nicelee/ui/thread/MonitoringThread.java @@ -7,6 +7,7 @@ import nicelee.bilibili.downloaders.IDownloader; import nicelee.bilibili.enums.StatusEnum; import nicelee.bilibili.util.Logger; +import nicelee.ui.Audio; import nicelee.ui.Global; import nicelee.ui.item.DownloadInfoPanel; @@ -21,6 +22,9 @@ public void run() { Color lightRed = new Color(255, 71, 10); Color lightPink = new Color(255, 122, 122); Color lightOrange = new Color(255, 207, 61); + if(Global.playSoundAfterMissionComplete) + Audio.init(); + int lastActiveTaskCount = 0; while (true) { int MAX_FAIL_CNT = Global.maxFailRetry; //每一次while循环, 统计一次任务状态, 并在UI上更新 @@ -156,6 +160,11 @@ public void run() { //System.out.println("当前计算总任务数: " + totalTask); Global.downloadTab.refreshStatus(totalTask, activeTask, pauseTask, doneTask, queuingTask); //Global.activeTask = activeTask; + //Logger.printf("lastActiveTaskCount: %d, activeTask: %d\n", lastActiveTaskCount, activeTask); + if(Global.playSoundAfterMissionComplete && lastActiveTaskCount > 0 && activeTask == 0) { + Audio.play(); + } + lastActiveTaskCount = activeTask; try { Thread.sleep(1500); } catch (InterruptedException e) { diff --git a/src/resources/app.config b/src/resources/app.config index 40a92a0e..bdf5a0f0 100644 --- a/src/resources/app.config +++ b/src/resources/app.config @@ -21,6 +21,8 @@ bilibili.name.format = (:listName listName-)avTitle-pDisplay-clipTitle-qn bilibili.name.doAfterComplete = true # 下载完成后是否尝试给相关作品点赞👍(已经点赞的不会取消) bilibili.download.thumbUp = false +# 全部任务完成后是否播放提示音 +bilibili.download.playSound = false ####################################################################################################### # 下载异常后尝试次数, 0 则异常后不再尝试 bilibili.download.maxFailRetry = 3 From 0ae1908d69736c260afba35d5a8f389d0590d363 Mon Sep 17 00:00:00 2001 From: lijia Date: Fri, 12 Mar 2021 13:30:59 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=B7=A5=E5=85=B7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nicelee/bilibili/util/ConfigUtil.java | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/nicelee/bilibili/util/ConfigUtil.java b/src/nicelee/bilibili/util/ConfigUtil.java index 98442d2e..d7bfeddf 100644 --- a/src/nicelee/bilibili/util/ConfigUtil.java +++ b/src/nicelee/bilibili/util/ConfigUtil.java @@ -143,19 +143,27 @@ public static void initConfigs() { Global.pwdAutoLogin = "auto".equals(System.getProperty("bilibili.user.login.pwd")); Global.pwdAutoCaptcha = "true".equals(System.getProperty("bilibili.user.login.pwd.autoCaptcha")); - File backImgPNG = new File("config/background.png"); - if(backImgPNG.exists()) { + File backImgPNG = search("config/background.png"); + if(backImgPNG != null) { Global.backgroundImg = new ImageIcon(backImgPNG.getPath()); }else { - File backImgJPG = new File("config/background.jpg"); - if(backImgJPG.exists()) { + File backImgJPG = search("config/background.jpg"); + if(backImgJPG != null) { Global.backgroundImg = new ImageIcon(backImgJPG.getPath()); }else { Global.backgroundImg = new ImageIcon(Global.class.getResource("/resources/background.png")); } } } - + public static File search(String path) { + File file = new File(path); + if(file.exists()) + return file; + file = new File(baseDirectory(), path); + if(file.exists()) + return file; + return null; + } private static void deleteUserConfig() { File user = new File("config/user.config"); if(user.exists()) { From c563f224fbe8a8becb919c65d9d6e6b3776f7285 Mon Sep 17 00:00:00 2001 From: lijia Date: Fri, 12 Mar 2021 13:32:04 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E9=9F=B3=EF=BC=9B=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E9=9F=B3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nicelee/ui/Audio.java | 15 +++++++++++---- src/resources/notice.wav | Bin 0 -> 70044 bytes 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 src/resources/notice.wav diff --git a/src/nicelee/ui/Audio.java b/src/nicelee/ui/Audio.java index c3ffc325..91b859de 100644 --- a/src/nicelee/ui/Audio.java +++ b/src/nicelee/ui/Audio.java @@ -1,12 +1,15 @@ package nicelee.ui; import java.io.ByteArrayOutputStream; +import java.io.File; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; +import nicelee.bilibili.util.ConfigUtil; + public class Audio { static byte[] data; @@ -17,12 +20,16 @@ public class Audio { public static void init() { try { - // 98KB 比较小可以放进内存常驻 - AudioInputStream in = AudioSystem.getAudioInputStream(Audio.class.getResource("/resources/nice.wav")); + AudioInputStream in = null; + File wav = ConfigUtil.search("config/notice.wav"); + if (wav != null) + in = AudioSystem.getAudioInputStream(wav.toURI().toURL()); + else + in = AudioSystem.getAudioInputStream(Audio.class.getResource("/resources/notice.wav")); ByteArrayOutputStream out = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024*4]; + byte[] buffer = new byte[1024 * 4]; int len = in.read(buffer); - while(len > -1) { + while (len > -1) { out.write(buffer, 0, len); len = in.read(buffer); } diff --git a/src/resources/notice.wav b/src/resources/notice.wav new file mode 100644 index 0000000000000000000000000000000000000000..9aaff89213ea64ab540050c09cc38d3f447adccd GIT binary patch literal 70044 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 b!s`WA_=jI|Wa3}o&eIbw9Ovcg;e-DNy*-SG literal 0 HcmV?d00001 From 5b36423c1996b5b127892c0b130ab4d176ff37ff Mon Sep 17 00:00:00 2001 From: lijia Date: Fri, 12 Mar 2021 13:42:22 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=B0=86=E6=9D=83=E9=87=8D=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E7=A7=BB=E8=87=B3=E5=8A=A0=E8=BD=BD=E5=AE=8C=E6=AF=95?= =?UTF-8?q?=E5=90=8E=E8=BF=9B=E8=A1=8C=EF=BC=8C=E8=80=8C=E4=B8=8D=E5=BF=85?= =?UTF-8?q?=E6=AF=8F=E6=AC=A1=E9=83=BD=E8=A6=81=E6=8E=92=E5=BA=8F=E4=B8=80?= =?UTF-8?q?=E9=81=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nicelee/bilibili/PackageScanLoader.java | 19 +++++++++++++++++++ .../bilibili/downloaders/Downloader.java | 9 --------- src/nicelee/bilibili/parsers/InputParser.java | 9 --------- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/nicelee/bilibili/PackageScanLoader.java b/src/nicelee/bilibili/PackageScanLoader.java index ca7855fb..b054ded9 100644 --- a/src/nicelee/bilibili/PackageScanLoader.java +++ b/src/nicelee/bilibili/PackageScanLoader.java @@ -8,6 +8,8 @@ import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; @@ -74,6 +76,23 @@ public boolean isValid(Class klass) { } }; pLoader.scanRoot("nicelee.bilibili"); + // 按权重排序,越大越优先 + Collections.sort(validParserClasses, new Comparator>() { + @Override + public int compare(Class o1, Class o2) { + int bili1 = o1 == null? 0 : o1.getAnnotation(Bilibili.class).weight(); + int bili2 = o2 == null? 0 : o2.getAnnotation(Bilibili.class).weight(); + return bili2 - bili1; + } + }); + Collections.sort(validDownloaderClasses, new Comparator>() { + @Override + public int compare(Class o1, Class o2) { + int bili1 = o1 == null? 0 : o1.getAnnotation(Bilibili.class).weight(); + int bili2 = o2 == null? 0 : o2.getAnnotation(Bilibili.class).weight(); + return bili2 - bili1; + } + }); } /** diff --git a/src/nicelee/bilibili/downloaders/Downloader.java b/src/nicelee/bilibili/downloaders/Downloader.java index 5d38d190..e4bad139 100644 --- a/src/nicelee/bilibili/downloaders/Downloader.java +++ b/src/nicelee/bilibili/downloaders/Downloader.java @@ -36,15 +36,6 @@ public void init(HttpRequestUtil util) { downloader.init(util); downloaders.add(downloader); } - // 按权重排序,越大越优先 - Collections.sort(downloaders, new Comparator() { - @Override - public int compare(Object o1, Object o2) { - int bili1 = o1 == null? 0 : o1.getClass().getAnnotation(Bilibili.class).weight(); - int bili2 = o2 == null? 0 : o2.getClass().getAnnotation(Bilibili.class).weight(); - return bili2 - bili1; - } - }); } catch (Exception e) { e.printStackTrace(); } diff --git a/src/nicelee/bilibili/parsers/InputParser.java b/src/nicelee/bilibili/parsers/InputParser.java index 41455d27..b8d034d4 100644 --- a/src/nicelee/bilibili/parsers/InputParser.java +++ b/src/nicelee/bilibili/parsers/InputParser.java @@ -40,15 +40,6 @@ public InputParser(HttpRequestUtil util, int pageSize, String loadContition) { } } - // 按权重排序,越大越优先 - Collections.sort(parsers, new Comparator() { - @Override - public int compare(Object o1, Object o2) { - int bili1 = o1 == null? 0 : o1.getClass().getAnnotation(Bilibili.class).weight(); - int bili2 = o2 == null? 0 : o2.getClass().getAnnotation(Bilibili.class).weight(); - return bili2 - bili1; - } - }); } catch (Exception e) { e.printStackTrace(); } From 7717f4e77fe852c0274ae89ef391e13aeeb84d40 Mon Sep 17 00:00:00 2001 From: lijia Date: Wed, 24 Mar 2021 09:12:16 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix=20#58=20=E7=BD=91=E7=BB=9C=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E6=97=B6=E5=8E=BB=E6=8E=89br=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3=E6=9C=89=E6=A6=82=E7=8E=87=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=B9=B1=E7=A0=81=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bilibili/parsers/impl/CheeseEPParser.java | 2 +- .../bilibili/parsers/impl/CheeseSSParser.java | 6 ++-- src/nicelee/bilibili/util/HttpHeaders.java | 28 +++++++++---------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/nicelee/bilibili/parsers/impl/CheeseEPParser.java b/src/nicelee/bilibili/parsers/impl/CheeseEPParser.java index eacf0bed..5cdc9be7 100644 --- a/src/nicelee/bilibili/parsers/impl/CheeseEPParser.java +++ b/src/nicelee/bilibili/parsers/impl/CheeseEPParser.java @@ -48,7 +48,7 @@ private String EpIdToSSId(String epId) { headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"); headers.put("Accept", "application/json, text/plain, */*"); headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headers.put("Accept-Encoding", "gzip, deflate, br"); + headers.put("Accept-Encoding", "gzip, deflate"); headers.put("Origin", "https://www.bilibili.com"); headers.put("Referer", "https://www.bilibili.com/cheese/play/ep" + epId); String json = util.getContent(url, headers, HttpCookies.getGlobalCookies()); diff --git a/src/nicelee/bilibili/parsers/impl/CheeseSSParser.java b/src/nicelee/bilibili/parsers/impl/CheeseSSParser.java index b12452be..d267f714 100644 --- a/src/nicelee/bilibili/parsers/impl/CheeseSSParser.java +++ b/src/nicelee/bilibili/parsers/impl/CheeseSSParser.java @@ -73,7 +73,7 @@ protected boolean query(int page, int min, int max, Object... obj) { headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"); headers.put("Accept", "application/json, text/plain, */*"); headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headers.put("Accept-Encoding", "gzip, deflate, br"); + headers.put("Accept-Encoding", "gzip, deflate"); headers.put("Origin", "https://www.bilibili.com"); headers.put("Referer", "https://www.bilibili.com/cheese/play/ss" + ssID); @@ -151,7 +151,7 @@ public int[] getVideoQNList(String avId, String cid, String epId) { headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"); headers.put("Accept", "application/json, text/plain, */*"); headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headers.put("Accept-Encoding", "gzip, deflate, br"); + headers.put("Accept-Encoding", "gzip, deflate"); headers.put("Origin", "https://www.bilibili.com"); headers.put("Referer", "https://www.bilibili.com/cheese/play/ss" + ssID); String json = util.getContent(url, headers, HttpCookies.getGlobalCookies()); @@ -177,7 +177,7 @@ public String getVideoLink(String ssId, String cid, int qn, int downFormat) { headers.put("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"); headers.put("Accept", "application/json, text/plain, */*"); headers.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headers.put("Accept-Encoding", "gzip, deflate, br"); + headers.put("Accept-Encoding", "gzip, deflate"); headers.put("Origin", "https://www.bilibili.com"); headers.put("Referer", "https://www.bilibili.com/cheese/play/ss" + ssID); String json = util.getContent(url, headers, HttpCookies.getGlobalCookies()); diff --git a/src/nicelee/bilibili/util/HttpHeaders.java b/src/nicelee/bilibili/util/HttpHeaders.java index 38d9de55..9ce9d37c 100644 --- a/src/nicelee/bilibili/util/HttpHeaders.java +++ b/src/nicelee/bilibili/util/HttpHeaders.java @@ -33,7 +33,7 @@ public HashMap getBiliUserInfoHeaders() { if (userInfoHeaderMap == null) { userInfoHeaderMap = new HashMap(); userInfoHeaderMap.put("Accept", "application/json, text/plain, */*"); - userInfoHeaderMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + userInfoHeaderMap.put("Accept-Encoding", "gzip, deflate"); userInfoHeaderMap.put("Accept-Language", "zh-CN,zh;q=0.8"); userInfoHeaderMap.put("Connection", "keep-alive"); userInfoHeaderMap.put("Origin", "https://message.bilibili.com"); @@ -52,7 +52,7 @@ public HashMap getBiliLoginAuthHeaders() { if (loginAuthHeaderMap == null) { loginAuthHeaderMap = new HashMap(); loginAuthHeaderMap.put("Accept", "application/json, text/javascript, */*; q=0.01"); - loginAuthHeaderMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + loginAuthHeaderMap.put("Accept-Encoding", "gzip, deflate"); loginAuthHeaderMap.put("Accept-Language", "zh-CN,zh;q=0.8"); loginAuthHeaderMap.put("Connection", "keep-alive"); loginAuthHeaderMap.put("Host", "passport.bilibili.com"); @@ -70,7 +70,7 @@ public HashMap getBiliLoginAuthVaHeaders() { if (loginAuthVaHeaderMap == null) { loginAuthVaHeaderMap = new HashMap(); loginAuthVaHeaderMap.put("Accept", "application/json, text/javascript, */*; q=0.01"); - loginAuthVaHeaderMap.put("Accept-Encoding", "gzip, deflate, br"); + loginAuthVaHeaderMap.put("Accept-Encoding", "gzip, deflate"); loginAuthVaHeaderMap.put("Accept-Language", "zh-CN,zh;q=0.8"); loginAuthVaHeaderMap.put("Connection", "keep-alive"); loginAuthVaHeaderMap.put("Host", "passport.bilibili.com"); @@ -122,7 +122,7 @@ public HashMap getBiliWwwM4sHeaders(String avId) { */ public HashMap getBiliJsonAPIHeaders(String avId) { headerMap.put("Accept", "*/*"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Connection", "keep-alive"); headerMap.put("Host", "api.bilibili.com"); @@ -137,7 +137,7 @@ public HashMap getBiliJsonAPIHeaders(String avId) { */ public HashMap getBiliAppJsonAPIHeaders() { headerMap.put("Accept", "*/*"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Connection", "keep-alive"); headerMap.put("Host", "app.bilibili.com"); @@ -155,7 +155,7 @@ public HashMap getBiliMHeaders() { if (mobileHeaderMap == null) { mobileHeaderMap = new HashMap(); mobileHeaderMap.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); - mobileHeaderMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + mobileHeaderMap.put("Accept-Encoding", "gzip, deflate"); mobileHeaderMap.put("Accept-Language", "zh-CN,zh;q=0.8"); mobileHeaderMap.put("Connection", "keep-alive"); mobileHeaderMap.put("Cache-Control", "max-age=0"); @@ -171,7 +171,7 @@ public HashMap getBiliMHeaders() { public HashMap getAllFavListHeaders(long personId) { headerMap = new HashMap(); headerMap.put("Accept", "application/json, text/plain, */*"); - headerMap.put("Accept-Encoding", "gzip, deflate, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Connection", "keep-alive"); headerMap.put("Host", "api.bilibili.com"); @@ -187,7 +187,7 @@ public HashMap getAllFavListHeaders(long personId) { public HashMap getFavListHeaders(String personId, String favID) { headerMap = new HashMap(); headerMap.put("Accept", "application/json, text/plain, */*"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Cache-Control", "no-cache"); headerMap.put("Pragma", "no-cache"); @@ -206,7 +206,7 @@ public HashMap getFavListHeaders(String personId, String favID) public HashMap getFavListHeaders(String favID) { headerMap = new HashMap(); headerMap.put("Accept", "application/json, text/plain, */*"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Cache-Control", "no-cache"); headerMap.put("Pragma", "no-cache"); @@ -225,7 +225,7 @@ public HashMap getActionHeaders(String avId) { headerMap.put("User-Agent", UA_PC_Sogo); headerMap.put("Accept", "application/json, text/plain, */*"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headerMap.put("Accept-Encoding", "gzip, deflate, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Content-Type", "application/x-www-form-urlencoded"); headerMap.put("Origin", "https://www.bilibili.com"); headerMap.put("Referer", "https://www.bilibili.com/video/" + avId); @@ -239,7 +239,7 @@ public HashMap getLogoutHeaders() { headerMap.put("User-Agent", UA_PC_Sogo); headerMap.put("Accept", "application/json, text/plain, */*"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"); - headerMap.put("Accept-Encoding", "gzip, deflate, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Content-Type", "application/x-www-form-urlencoded"); headerMap.put("Origin", "https://www.bilibili.com"); headerMap.put("Referer", "https://www.bilibili.com/"); @@ -252,7 +252,7 @@ public HashMap getLogoutHeaders() { public HashMap getDanmuHeaders() { headerMap = new HashMap(); headerMap.put("Accept", "text/html,application/xhtml+xm…ml;q=0.9,image/webp,*/*;q=0.8"); - headerMap.put("Accept-Encoding", "gzip, sdch, br"); + headerMap.put("Accept-Encoding", "gzip"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Cache-Control", "no-cache"); headerMap.put("Connection", "keep-alive"); @@ -267,7 +267,7 @@ public HashMap getDanmuHeaders() { public HashMap getCommonHeaders(String host) { headerMap = new HashMap(); headerMap.put("Accept", "text/html,application/xhtml+xm…ml;q=0.9,image/webp,*/*;q=0.8"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Cache-Control", "max-age=0"); headerMap.put("Connection", "keep-alive"); @@ -282,7 +282,7 @@ public HashMap getCommonHeaders(String host) { public HashMap getCommonHeaders() { headerMap = new HashMap(); headerMap.put("Accept", "text/html,application/xhtml+xm…ml;q=0.9,image/webp,*/*;q=0.8"); - headerMap.put("Accept-Encoding", "gzip, deflate, sdch, br"); + headerMap.put("Accept-Encoding", "gzip, deflate"); headerMap.put("Accept-Language", "zh-CN,zh;q=0.8"); headerMap.put("Cache-Control", "max-age=0"); headerMap.put("Connection", "keep-alive"); From 62c46c5046ecbeca5f2ca61ed17f07734336d8f1 Mon Sep 17 00:00:00 2001 From: lijia Date: Wed, 24 Mar 2021 09:15:15 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=9B=BE=E7=89=87=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=A0=81=E6=8E=A5=E5=8F=A3=E5=A2=9E=E5=8A=A0`BiliDroid`?= =?UTF-8?q?=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/nicelee/bilibili/INeedLogin.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/nicelee/bilibili/INeedLogin.java b/src/nicelee/bilibili/INeedLogin.java index 09399d19..161690d7 100644 --- a/src/nicelee/bilibili/INeedLogin.java +++ b/src/nicelee/bilibili/INeedLogin.java @@ -276,7 +276,9 @@ public String getCaptchaStr(byte[] bytes) throws IOException { StringBuilder payload = new StringBuilder("{\"image\":\"").append(Base64.getEncoder().encodeToString(bytes)) .append("\"}"); Logger.println(payload); - String response = util.postContent(url, new HashMap<>(), payload.toString()); + HashMap headers = new HashMap<>(); + headers.put("User-Agent", "BiliDroid"); + String response = util.postContent(url, headers, payload.toString()); Logger.println(response); JSONObject obj = new JSONObject(response); if (obj.getBoolean("success")) { From e89c1c6acc45d98e80f93f9072d7ef2107f4b87a Mon Sep 17 00:00:00 2001 From: lijia Date: Wed, 24 Mar 2021 09:35:48 +0800 Subject: [PATCH 7/8] =?UTF-8?q?#57=20`UP=E4=B8=BB=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=A7=86=E9=A2=91`=E9=93=BE=E6=8E=A5=E6=94=AF=E6=8C=81`?= =?UTF-8?q?=E5=88=86=E5=8C=BA`=E3=80=81`=E5=85=B3=E9=94=AE=E5=AD=97?= =?UTF-8?q?=E6=90=9C=E7=B4=A2`=E3=80=81`=E6=8C=89=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E3=80=81=E6=92=AD=E6=94=BE=E6=AC=A1=E6=95=B0?= =?UTF-8?q?=E3=80=81=E6=94=B6=E8=97=8F=E9=87=8F=E6=8E=92=E5=BA=8F`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parsers/impl/URL4UPAllParser.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/nicelee/bilibili/parsers/impl/URL4UPAllParser.java b/src/nicelee/bilibili/parsers/impl/URL4UPAllParser.java index 1880f4d7..5d6f7fa4 100644 --- a/src/nicelee/bilibili/parsers/impl/URL4UPAllParser.java +++ b/src/nicelee/bilibili/parsers/impl/URL4UPAllParser.java @@ -1,5 +1,6 @@ package nicelee.bilibili.parsers.impl; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -17,9 +18,12 @@ public class URL4UPAllParser extends AbstractPageQueryParser { private final static Pattern pattern = Pattern.compile("space\\.bilibili\\.com/([0-9]+)(/video|/? *$|\\?)"); - private final static Pattern patternTid = Pattern.compile("tid=([0-9]+)"); + private final static Pattern patternTid = Pattern.compile("(tid|order|keyword)=([^=&]+)"); private String spaceID; - private String tid = "0"; // 全部 0, 音乐 3... + private HashMap params; +// private String tid = "0"; // 全部 0, 音乐 3... +// private String order = "pubdate"; // 最新发布 pubdate 最多点击click 最多收藏stow +// private String keyword = ""; // public URL4UPAllParser(Object... obj) { super(obj); @@ -31,9 +35,13 @@ public boolean matches(String input) { if (matcher.find()) { System.out.println("匹配UP主主页全部视频,返回 av1 av2 av3 ..."); spaceID = matcher.group(1); + params = new HashMap<>(); + params.put("tid", "0"); + params.put("order", "pubdate"); + params.put("keyword", ""); Matcher m = patternTid.matcher(input); - if(m.find()) - tid =m.group(1); + while(m.find()) + params.put(m.group(1), m.group(2).trim()); return true; } else { return false; @@ -66,8 +74,8 @@ protected boolean query(int page, int min, int max, Object... obj) { boolean getVideoLink = (boolean) obj[1]; try { //String urlFormat = "https://space.bilibili.com/ajax/member/getSubmitVideos?mid=%s&pagesize=%d&tid=0&page=%d&keyword=&order=pubdate"; - String urlFormat = "https://api.bilibili.com/x/space/arc/search?mid=%s&ps=%d&tid=%s&pn=%d&keyword=&order=pubdate&jsonp=jsonp"; - String url = String.format(urlFormat, spaceID, API_PMAX, tid, page); + String urlFormat = "https://api.bilibili.com/x/space/arc/search?mid=%s&ps=%d&tid=%s&pn=%d&keyword=%s&order=%s&jsonp=jsonp"; + String url = String.format(urlFormat, spaceID, API_PMAX, params.get("tid"), page, params.get("keyword"), params.get("order")); String json = util.getContent(url, new HttpHeaders().getCommonHeaders("api.bilibili.com")); System.out.println(url); System.out.println(json); From 641990ec0e75017ff8f71a7b355aca3623f3c159 Mon Sep 17 00:00:00 2001 From: lijia Date: Wed, 24 Mar 2021 09:40:55 +0800 Subject: [PATCH 8/8] V6.1 Update --- .github/release.info | 17 +++--- .github/release.json | 2 +- README.md | 41 ++++++------- UPDATE.md | 114 +++++++++++++++++++++++-------------- src/nicelee/ui/Global.java | 2 +- 5 files changed, 105 insertions(+), 71 deletions(-) diff --git a/.github/release.info b/.github/release.info index 972e1ad1..dbeacee3 100644 --- a/.github/release.info +++ b/.github/release.info @@ -1,8 +1,9 @@ -* 添加登出(即注销登录状态)功能 -* 添加下载完成后点赞功能(**【测试】**默认关闭,`bilibili.download.thumbUp = true`可打开) -* 修复 [issue#53](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/53) 修复用户名密码登录失败的问题 -* 增加`@Bilibili`注解的weight权重属性,使得解析器按权重顺序生效 -* 修复一个bug,该bug使得某些配置下视频id号不能转为数字时会出现错误 -* 标签页增加了右键菜单,可实现批量关闭功能 -* 标签页增加了右键菜单,可实现批量下载功能(优先清晰度跟随Tab默认值`bilibili.tab.download.qn`) -* ps:每次都去右上角点菜单挺麻烦的:flushed: \ No newline at end of file +* 修复: 网络请求时去掉br支持,解决有概率返回乱码的问题[issue#58](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/58) +* 优化:`UP主所有视频`链接支持`分区`、`关键字搜索`、`按更新时间、播放次数、收藏量排序`。详见[issue#57](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/57) +* 全部任务完成后可添加提示音,且支持自定义提示音 + + 打开该功能`bilibili.download.playSound = true` + + 将音频文件更名`notice.wav`并放入`config`文件夹即可 + + 注意:只支持wav格式 + + 注意:提示音播放在监视进程中进行,时间过长将阻塞进程,影响体验 +* 优化: 将权重排序移至加载完毕后进行,而不必每次都要排序一遍 +* 修复: 图片验证码接口增加`BiliDroid`字段 \ No newline at end of file diff --git a/.github/release.json b/.github/release.json index 19249d6d..aecfea39 100644 --- a/.github/release.json +++ b/.github/release.json @@ -1,3 +1,3 @@ { - "tag_latest": "6.0" + "tag_latest": "6.1" } \ No newline at end of file diff --git a/README.md b/README.md index 3b747781..52d03671 100644 --- a/README.md +++ b/README.md @@ -13,20 +13,18 @@ Bilibili 视频下载器,用于下载B站视频。 **以下多图警告** ## :smile:特性 -+ 支持UI界面(自认为是傻瓜式操作) -+ 支持扫码/密码登录(能看=能下,反过来也一样) -+ 支持各种链接解析(直接输入BVXXX/avXXX,或者各种网页链接, V4.3 新增画廊/相簿解析)**不再支持番剧解析!!** -+ **支持自定义各种链接解析**(V5.8新增) -+ 支持多p下载!(看了看部分别人的作品, 听说有的只支持单p?) -+ 支持收藏夹下载!! -+ 支持稍后再看下载!! -+ 支持UP主视频下载!!! -+ 支持长视频,杜绝片头式下载!!!! -+ 支持断点续传下载!!!!!(因异常原因退出后, 只要下载目录不变, 直接在上次基础上继续下载) -+ 支持CC字幕下载 -+ 支持互动视频下载 -+ 支持课程视频下载 -+ 支持相簿图片下载 +- [x] 支持UI界面(自认为是傻瓜式操作) +- [x] 支持扫码/密码登录(能看=能下,反过来也一样) +- [x] 支持各种链接解析(直接输入BVXXX/avXXX,或者各种网页链接, V4.3 新增画廊/相簿解析)**不再支持番剧解析!!** +- [x] **支持自定义各种链接解析**(V5.8新增) +- [x] 支持收藏夹下载 +- [x] 支持稍后再看下载 +- [x] 支持UP主视频/频道下载 +- [x] 支持断点续传下载(因异常原因退出后, 只要下载目录不变, 直接在上次基础上继续下载) +- [x] 支持CC字幕下载 +- [x] 支持互动视频下载 +- [x] 支持课程视频下载 +- [x] 支持相簿图片下载 ## :smile:关于下载速度 + 默认最大同时下载数为3,有需要可以在`config/app.config`更改(不推荐) @@ -75,17 +73,22 @@ Bilibili 视频下载器,用于下载B站视频。
-根据策略下载所有打开标签页的(全部/第一个)视频 +下载单个标签页全部视频 -`V3.4后移至菜单栏` -![](https://cdn.jsdelivr.net/gh/nICEnnnnnnnLee/BilibiliDown@master/release/preview/downloadAllTab.png) ++ `单击标签` -> `选择优先清晰度` -> `点击批量下载` ++ `右键单击标签` -> `批量下载此标签` + + 默认优先清晰度为`1080P`, 有需要请修改`bilibili.tab.download.qn`
-根据策略批量下载多p视频 +下载全部标签页的全部视频 -![](https://cdn.jsdelivr.net/gh/nICEnnnnnnnLee/BilibiliDown@master/release/preview/downloadSingleTab.png) ++ 右上角菜单栏`操作` -> `批量下载Tab页` + + 优先清晰度(仅适用于菜单栏操作): 右上角菜单栏`配置` -> `优先清晰度` + + 默认优先清晰度为`1080P`, 有需要请修改`bilibili.menu.download.qn` ++ `右键单击标签` -> `批量下载全部标签` + + 默认优先清晰度为`1080P`, 有需要请修改`bilibili.tab.download.qn`
diff --git a/UPDATE.md b/UPDATE.md index e6f14477..7cd66a61 100644 --- a/UPDATE.md +++ b/UPDATE.md @@ -1,5 +1,32 @@ ## UPDATE -* V6.0 +* V6.1 + * 修复: 网络请求时去掉br支持,解决有概率返回乱码的问题[issue#58](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/58) + * 优化:`UP主所有视频`链接支持`分区`、`关键字搜索`、`按更新时间、播放次数、收藏量排序`。详见[issue#57](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/57) + * 全部任务完成后可添加提示音,且支持自定义提示音 + + 打开该功能`bilibili.download.playSound = true` + + 将音频文件更名`notice.wav`并放入`config`文件夹即可 + + 注意:只支持wav格式 + + 注意:提示音播放在监视进程中进行,时间过长将阻塞进程,影响体验 + * 优化: 将权重排序移至加载完毕后进行,而不必每次都要排序一遍 + * 修复: 图片验证码接口增加`BiliDroid`字段 +* 增加各版本release时间 +``` +query { + user(login:"nICEnnnnnnnLee"){ + repository(name:"BilibiliDown"){ + createdAt, + releases(first:100, orderBy:{field:CREATED_AT, direction:DESC}){ + nodes { + name, + createdAt, + publishedAt, + } + } + } + } +} +``` +* V6.0 `2021-03-04` * 添加登出(即注销登录状态)功能 * 添加下载完成后点赞功能(**【测试】**默认关闭,`bilibili.download.thumbUp = true`可打开) * 修复 [issue#53](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/53) 修复用户名密码登录失败的问题 @@ -7,11 +34,11 @@ * 修复一个bug,该bug使得某些配置下视频id号不能转为数字时会出现错误 * 标签页增加了右键菜单,可实现批量关闭功能 * 标签页增加了右键菜单,可实现批量下载功能(优先清晰度跟随Tab默认值`bilibili.tab.download.qn`) -* V5.9 +* V5.9 `2020-10-29` * 去除番剧支持 * 优化 [issue#46](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/46) 自定义文件名提供数字av号选择 * 修复 [issue#47](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/47) 修复标题中含有换行符、退格符时无法重命名的情况 -* V5.8 +* V5.8 `2020-10-02` * 升级密码登录API为V3版本 * 升级弹幕下载保存格式为ass(测试,原来仅下载xml) * 去除原背景图片[b站壁纸娘 - 22&33](https://h.bilibili.com/597708) @@ -26,20 +53,20 @@ BVParser B23Parser ``` -* V5.7 +* V5.7 `2020-08-01` * 新增b23.tv短链接解析() * 多线程下载时去除Accept-Ranges头部判断 * 新增内置hosts功能,防止github域名被污染导致版本查询失败 -* V5.6 +* V5.6 `2020-06-19` * 修复一个bug,该bug导致某些类型的互动视频查询不全 * [issue#37](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/37)添加多线程下载实现。该功能默认关闭,不建议开启。具体使用详见`app.config`注释 -* V5.5 +* V5.5 `2020-06-07` * 修复一个bug,该bug导致某些类型的互动视频查询会陷入死循环 * 优化 [issue#34](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/34) 实现用户名密码自动登录 * 尝试一种新的button按钮样式,如不适应,可在配置文件中回退,设置如下: `bilibili.button.style = default` -* V5.4 +* V5.4 `2020-06-03` * 版本更新时,从后台下载改为列入下载面板下载,可以直观看到下载进度 * 新增课程解析 * @@ -47,29 +74,29 @@ * 修复 [issue#33](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/33) * * -* V5.3 +* V5.3 `2020-05-30` * 完善 继番剧4K[av56995872](https://www.bilibili.com/video/av56995872)后,支持UP主4K视频下载 * 测试[BV1xV411C7UF 4K50帧](https://www.bilibili.com/video/BV1xV411C7UF) * 测试[BV1fK4y1t7hj 4K120帧](https://www.bilibili.com/video/BV1fK4y1t7hj) -* V5.2 +* V5.2 `2020-05-17` * 完善 当某ss下p数超过20时,不再为每个视频详细查询支持清晰度,减少网络请求(以[ss33378](https://www.bilibili.com/bangumi/play/ss33378)为例,集数过千。。。) * 修复 [issue#31](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/31) 为了适应flv合并的ffmpeg命令调用,保存文件夹配置路径末尾转化为`/` * 修复 [issue#31](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/31) 为了解决某些ffmpeg应对不了的flv合并情况,增加了该功能的java实现 -* V5.1 +* V5.1 `2020-05-01` * 新增 为Windows用户增加了FFmpeg.exe下载功能(指向自编译的上传在Release assets的附件),进一步小白化 * 完善 当某av下p数超过20时,不再为每个视频详细查询支持清晰度,减少网络请求(特别是某些教程,以BV1pt41127FZ为例,分p数约400~) * 完善 打包脚本新增cd到文件所在目录操作,进一步防止误操作 -* V5.0 +* V5.0 `2020-04-11` * workflow发布测试,功能上无更新 * 提供了`package.sh`和`package.bat`两个脚本,支持不依赖IDE的jar包打包生成(**内含删除操作,请注意工作目录务必正确!!!**) -* V4.9 +* V4.9 `2020-03-31` * 新增 [#27](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/27) 稍后再看的批量下载 * 修复 [#28](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/28) up所有视频下载解析失效问题 -* V4.8 +* V4.8 `2020-03-25` * 本地进行av和bv相互转换,减少网络请求 -* V4.7 +* V4.7 `2020-03-24` * 修复v4.6引入的多p视频只显示第一个的bug -* V4.6 +* V4.6 `2020-03-24` * 新增BV Parser * 修复Av/EP/SS/ML/UP主频道/UP主所有视频解析 * 因B站API修改,下载历史改用BV作为关键词,提供了低版本到高版本的历史记录转换功能 @@ -77,18 +104,18 @@ * 精力有限,**不再支持调整优先下载格式(默认mp4-DASH优先)** * 精力有限,**不再支持调整查找集合的分页弹出(默认在一页显示)** -* V4.5 +* V4.5 `2020-02-06` * 修复:4K返回1080P+的问题,现已正常[av56995872](https://www.bilibili.com/video/av56995872) * 优化:账号登录后可获取收藏夹,不必再专门打开网页复制url了 * 优化:批量下载的默认设置可以在`app.config`中配置 * 优化:防止程序在运行时被重复打开。该功能配置默认关闭,`bilibili.lockCheck=true`可打开 * 优化:增加过渡动画,加载完毕后再显示界面,防止卡顿体验。双击动画可迅速跳过。 * 其它:下载控制、Httpheader整理、预览图片链接复制的一个bug -* V4.4 +* V4.4 `2020-01-29` * 优化:收藏夹对应的listName去掉分页数,自定义下载名称更加合理 * 修复:[issue#21](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/21) 当API返回的首选下载链接失效时,使用备用链接 * 修复:[issue#21](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/21) 当av不存在音频时,增加处理逻辑 -* V4.3 +* V4.3 `2019-12-18` * 修复: 如果channel中存在已失效视频,那么该分页中已失效视频之后的视频信息将全部丢失 * 新增: 相簿/画廊解析 * `https://space.bilibili.com/[0-9]+/favlist?fid=albumfav` 相簿收藏夹√ @@ -97,31 +124,31 @@ * 优化:自定义文件名 * 现在支持路径分隔符`/\`,e.g. 可将同质的某些视频放入同一个文件夹中 * 增加可自定义字段 阿婆主名称/id。详见[app.config](https://github.com/nICEnnnnnnnLee/BilibiliDown/blob/master/src/resources/app.config) -* V4.2 +* V4.2 `2019-10-19` * 修复bug: 关闭扫码图/关于框时,如果有活动的任务,会错误地弹出提示 * 去除WebSocket依赖,实时弹幕相关可以参考[弹幕点歌姬](https://github.com/nICEnnnnnnnLee/DanmuMusicPlayer) * 部分util优化 -* V4.1 +* V4.1 `2019-09-28` * 增加HTTP Deflate解析 * 增加弹幕下载(提供下载链接 => 直接下载文件) * 修复收藏夹第一个为已失效视频,则无法解析的bug * 针对非Windows系统进行了部分适配工作 -* V4.0 +* V4.0 `2019-09-15` * 新增互动视频下载(如av64006660) -* V3.9 +* V3.9 `2019-09-01` * 新增CC字幕下载,保存为`srt`格式(如果存在的话,比如av34218168) -* V3.8 +* V3.8 `2019-07-15` * 新增app独享视频下载(PC端不能看,以av2478750为例) * 增加4K清晰度(以av56995872为例) * 包扫描机制优化 * INeedAV的Main入口做了部分优化 -* V3.7 +* V3.7 `2019-05-25` * [issue#10](https://github.com/nICEnnnnnnnLee/BilibiliDown/issues/10)新增`正在转码状态`,细化下载任务状态提示 * 增加ffmpeg环境判断与提示 * 修复菜单里的Repo重载刷新问题 * Tab结果页里面av各p标题名称分情况显示 * 退出时如有活动任务,将给出提示 -* v3.6 +* v3.6 `2019-05-12` * 优化下载异常处理,失败后自动重新添加到下载队列(默认3次后停止,`bilibili.download.maxFailRetry = 3`) * 优化自定义名称 * 目标是使通过`收藏夹` 和 `单独av`等不同方式得到的 `av标题` 和 `视频小标题` 均保持一致 @@ -131,31 +158,31 @@ * 增加菜单功能 - 配置/仓库文件改动后,可直接重新加载,而不必重启程序(某些设置必须重启的除外) * 增加功能 - 复制弹幕下载链接(实验) * ~~WebSocket接收实时弹幕~~然而并没有,鸡肋 -* v3.5 +* v3.5 `2019-05-01` * 修复`bug` - 当实际清晰度低于预期下载清晰度时,如果下载过程中有停止再继续的行为,将导致重命名失败,且清晰度失真 * 修复`bug` - `V3.4`因UI更新引入的批量下载优先清晰度始终为`1080P60`的问题 * 主程序将菜单栏移到标题栏中 * `扫码`和`关于`界面自定义标题栏,防止系统主题下不出现关闭按钮 * `README`预览图压缩,节省流量 -* v3.4 +* v3.4 `2019-04-30` * 增加功能 - 下载任务面板根据任务状态的不同,显示不同的背景色 * 增加一键更新功能 * 增加`关于`页面 * UI优化 - 增加菜单栏 * 其它微不足道的改动 -* v3.3 +* v3.3 `2019-04-27` * 批量下载时,针对已下载弹出框提示太多的情况,做了优化 * 增加弹出框提示开关,在配置文件里面设置后,可以不再提示 * 弹出框增加关闭所有提示框按钮,点击可以关闭所有提示 * 增加最大弹出框数量限制,超出后不再弹出提示(默认为5) -* v3.2 +* v3.2 `2019-04-25` * 修复下载路径不存在时,程序关闭不了的问题 * 双击视频某p Title可获取作品信息(适用于批量打开的情况) * 长按视频某p Title可更新预览图 * 点击预览图可获取图片链接 * `parser`遍历选择时增加break,减少不必要的循环 * 解决文件路径中含多个空格问题 -* v3.1 beta +* v3.1 beta `2019-04-18` * 程序标题显示版本号 * 代码重构,整个框架有较大改动 `beta` * 增加批量查询的呈现方式,可以全部放在一页里面,也可以打开Tab页(将所有视频设为默认呈现,没有为所有视频再详细查询支持清晰度 `beta` @@ -174,7 +201,7 @@ * 优化其它逻辑 * 去掉等待动图 -* v3.0 +* v3.0 `2019-04-13` * 修复下载面板任务过多时,下拉到底不能列出所有任务的问题 * 批量下载优先策略增加```1080P60```、```720P60```选项 * 下载面板增加批量下载控制选项 @@ -182,11 +209,11 @@ * 程序关闭,以及每次ffmpeg转换完毕,增加删除所有临时文件判断 * 新增跟随系统主题,与swing默认有所区别(测试中) * 其它UI优化 -* v2.9 +* v2.9 `2019-04-11` * 新增功能 - 批量下载av的所有视频 * 新增功能 - 批量下载所有打开的标签页的视频 * 其它UI改动 -* v2.8 +* v2.8 `2019-04-10` * 主页输入框添加右键菜单 * 更换收藏夹信息获取api,并增加```mlXXX```形式的解析 ```https://api.bilibili.com/medialist/gateway/base/spaceDetail?media_id=XXX&pn=%d&ps=%d&keyword=&order=mtime&type=0&tid=0&jsonp=jsonp``` @@ -194,14 +221,14 @@ ```https://api.bilibili.com/medialist/gateway/base/detail?media_id=XXX&pn=%d&ps=%d``` (前者需要personID参数构造header,否则没有权限) * 分页信息查询的最大个数可以在```app.config```中灵活设置 -* v2.7 +* v2.7 `2019-04-09` * Tab页标题过长时, 省略部分内容, 以...代替 * 增加SOCKS/HTTP/HTTPS代理支持 * release 压缩包去除好压 -* v2.6 +* v2.6 `2019-03-23` * 解决部分视频下载不完整问题 - 发现电影是分段播的,原来的方式只能下载大概前5~6分钟,例如 * 因为不怎么使用登录功能(一次登录cookies可以用很久),以前未发现并处理因为网络原因造成的异常,现已解决 -* v2.5 +* v2.5 `2019-03-10` * 增加收藏夹的连接解析,例如(url请务必包含fid参数) * 增加UP主个人页面的链接解析,例如 * 增加UP主个人页面特定频道的链接解析,例如 @@ -210,12 +237,12 @@ * 当前个人页面获取信息顺序为最新发布,且固定为每页5个(官网每页30个),以防止跳出的Tab页面过多。想要获取请在后面加上p=[pageNumber]。 e.g. 想要下载UP主```Hivane```最新发布的第31~35个视频(需确保后面没有空格) ```https://space.bilibili.com/17154307/video?tid=0&page=2&keyword=&order=pubdate p=7``` -* v2.4 +* v2.4 `2019-03-07` * 增加官方番剧URL集合的链接解析,例如 * 增加官方番剧URL集合的链接解析,例如 * (UI)优化最大同时下载数的显示 * (UI)修复并优化部分UI显示 -* v2.3 +* v2.3 `2019-03-06` * (UI)增加下载速度显示 * (UI)新增vbs脚本,可以创建桌面快捷方式 * (UI)配置文件统一移入config文件夹中 @@ -224,23 +251,26 @@ * 增加官方番剧URL(单集)的链接解析,例如 * 增加下载番剧的功能(以前一直测试的UP主上传的视频,突然发现追番的话似乎有点不同,于是增加了这个功能) * PS: ep号转av号是直接从HTML里面爬出来的,不够优雅,暂时还没提取出提供api接口... -* v2.2 +* v2.2 `2019-03-02` * 增加了HTML5播放源的下载方式,支持FLV/MP4两种格式 * (UI)下载面板优化为不允许存在相同的视频下载任务(不分辨清晰度) * (UI)在下载目录下增加了重命名```rename.bat```,默认格式为```avId-qn-p.(flv|mp4)```,可以使用该批处理批量改标题为```视频标题-qn-p.(flv|mp4)```(重命名功能暂只支持Windows) * (UI)增加了下载格式配置(flv 取Flash播放源, mp4 取HTML5播放源) * (UI)增加了下载路径配置 -* v2.1 +* v2.1 `2019-03-01` * 增加了断点续传的下载功能, 如果发现上次未下载完成的```.part```文件,会在上次的基础上继续进行下载; * (UI)新增暂停/下载异常后继续下载功能, 与断点续传功能相匹配; * (UI)在作品详情页面点击文字可以复制信息; * 考虑过把一个视频分成很多Fragment多线程下载的, 但这样似乎对服务器不是很好, 并且可以预见会有很多bug(这点最重要??), 再加上本身已经能够同时下载多个不同的av, 故而并没有继续; * 考虑过使用HTML5的播放源, ```.m3u8```的直接合并就行, 但像这种```.m4s```,木有经验额??. 如何解析报头的**SegmentBase**, 如何合并音视频, 目前正在潜水学习中... 关键是没有多媒体处理经验,不会ffmpeg -* v2.0 +* v2.0 `2019-02-24` * 修复一个bug,该bug导致部分无效cookies验证抛出异常,而不是返回false; * (UI)修复一个bug,该bug使得扫码登录后未能及时更新用户头像等信息; * (UI)增加二维码扫码时限性,一分钟后自动销毁; * (UI)增加登录框点击动态效果,让人明白你点了它; * 下载flv名称由 ```avId-p.flv``` 改为```avId-qn-p.flv```,增加清晰度标识 - * (UI)优化了.bat脚本,```run-UI.bat```运行后命令窗口退出,```run-UI-debug.bat```运行后命令窗口留存,并且可查看输出信息 \ No newline at end of file + * (UI)优化了.bat脚本,```run-UI.bat```运行后命令窗口退出,```run-UI-debug.bat```运行后命令窗口留存,并且可查看输出信息 + +... +* 更古老的不再记录 \ No newline at end of file diff --git a/src/nicelee/ui/Global.java b/src/nicelee/ui/Global.java index 879524b6..8ea356c0 100644 --- a/src/nicelee/ui/Global.java +++ b/src/nicelee/ui/Global.java @@ -12,7 +12,7 @@ public class Global { // 界面显示相关 - public static String version = "v6.0"; + public static String version = "v6.1"; public static boolean themeDefault = true; public static boolean btnStyle = true; public static FrameWaiting frWaiting;