From d9a6d5c6c0abcf71ceafab9f74e79d50f456145e Mon Sep 17 00:00:00 2001 From: apo2073 Date: Sun, 8 Dec 2024 14:35:38 +0900 Subject: [PATCH] youtube info updated --- README.md | 25 +++--- build.gradle.kts | 4 +- .../java/kr/apo2073/ytliv/YouTubeBuilder.java | 2 +- .../java/kr/apo2073/ytliv/YouTubeInfo.java | 86 +++++++++++++++++++ src/main/java/kr/apo2073/ytliv/Youtube.java | 65 ++------------ .../java/kr/apo2073/ytliv/data/Author.java | 5 ++ .../java/kr/apo2073/ytliv/data/Chatting.java | 16 +++- .../java/kr/apo2073/ytliv/data/SuperChat.java | 15 +++- .../kr/apo2073/ytliv/data/SuperSticker.java | 15 +++- src/test/java/Main.java | 12 +-- 10 files changed, 157 insertions(+), 88 deletions(-) create mode 100644 src/main/java/kr/apo2073/ytliv/YouTubeInfo.java create mode 100644 src/main/java/kr/apo2073/ytliv/data/Author.java diff --git a/README.md b/README.md index 4c102e1..54188b3 100644 --- a/README.md +++ b/README.md @@ -5,15 +5,17 @@ --- ## Dependency +**gradle.kts** ```gradle - repositories { - mavenCentral() - maven { url 'https://jitpack.io' } - } - - dependencies { - implementation 'com.github.apo2073:YouTubeLiv:Tag' - } +repositories { + mavenCentral() + maven("https://jitpack.io") { + name = "jitpack" + } +} +dependencies { + implementation("com.github.apo2073:YouTubeLiv:Tag") +} ``` --- @@ -24,7 +26,7 @@ public class Main { public static void main(String[] args) { Youtube youtube = new YouTubeBuilder() .setApiKey("API-KEY") - .setVIDEO_ID("Live-Video-Id") //https://www.youtube.com/watch?v=(here) + .setVideoId("Live-Video-Id") //https://www.youtube.com/watch?v=(here) .addListener(new YouTubeEventListener() { @Override public void onChat(Chatting chat) { @@ -32,7 +34,7 @@ public class Main { } }).build(); - Youtube.YouTubeInfo info = youtube.channelInfo(); + YouTubeInfo info = youtube.channelInfo(); System.out.println(info.getChannelName()); // Get Channel Name System.out.println(info.getSubscriptionCount()); // Get Channel Subscription Count try { @@ -41,8 +43,7 @@ public class Main { throw new RuntimeException(e); } - youtube.stop(); - System.out.println("Stopped"); + youtube.stop(); // Stop } } ``` diff --git a/build.gradle.kts b/build.gradle.kts index 8a3ccf5..89765b2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "com.github.apo2073" -version = "1.0.2" +version = "1.1" repositories { mavenCentral() @@ -41,7 +41,7 @@ publishing { create("maven") { groupId = "com.github.apo2073" artifactId = "YoutubeLiv" - version = "1.0.2" + version = "1.1" from(components["java"]) diff --git a/src/main/java/kr/apo2073/ytliv/YouTubeBuilder.java b/src/main/java/kr/apo2073/ytliv/YouTubeBuilder.java index 030ac2d..6b9fe46 100644 --- a/src/main/java/kr/apo2073/ytliv/YouTubeBuilder.java +++ b/src/main/java/kr/apo2073/ytliv/YouTubeBuilder.java @@ -16,7 +16,7 @@ public class YouTubeBuilder { boolean isDebug=false; public YouTubeBuilder setApiKey(String key) {this.API_KEY=key;return this;} - public YouTubeBuilder setVIDEO_ID(String id) {this.VIDEO_ID =id; return this;} + public YouTubeBuilder setVideoId(String id) {this.VIDEO_ID =id; return this;} public YouTubeBuilder setDebug(boolean debug) {this.isDebug=debug; return this;} public YouTubeBuilder setPollingInterval(long interval) {this.pollingInterval=interval;return this;} public YouTubeBuilder addListener(YouTubeEventListener listener) { diff --git a/src/main/java/kr/apo2073/ytliv/YouTubeInfo.java b/src/main/java/kr/apo2073/ytliv/YouTubeInfo.java new file mode 100644 index 0000000..3611f61 --- /dev/null +++ b/src/main/java/kr/apo2073/ytliv/YouTubeInfo.java @@ -0,0 +1,86 @@ +package kr.apo2073.ytliv; + +import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport; +import com.google.api.client.json.jackson2.JacksonFactory; +import com.google.api.services.youtube.YouTube; +import com.google.api.services.youtube.model.Channel; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + +public class YouTubeInfo { + private final String channelName; + private final String channelSubscriptionCount; + private final Channel channel; + private static String API_KEY; + + public static YouTubeInfo from(String videoId, String api) { + try { + YouTube youtube = new YouTube.Builder( + GoogleNetHttpTransport.newTrustedTransport(), + JacksonFactory.getDefaultInstance(), + null + ).setApplicationName("YouTubeLiv").build(); + API_KEY=api; + + return new YouTubeInfo(youtube, videoId); + } catch (GeneralSecurityException | IOException e) { + e.printStackTrace(); + return null; + } + } + + private YouTubeInfo(YouTube youtube, String videoId) { + Channel tempChannel = null; + String tempName = null; + String tempCount = null; + + try { + tempChannel = getChannel(youtube, videoId); + if (tempChannel != null) { + tempName = tempChannel.getSnippet().getTitle(); + tempCount = tempChannel.getStatistics().getSubscriberCount().toString(); + } + } catch (IOException e) { + e.printStackTrace(); + } + + this.channel = tempChannel; + this.channelName = tempName; + this.channelSubscriptionCount = tempCount; + } + + private Channel getChannel(YouTube youtube, String videoId) throws IOException { + YouTube.Videos.List videoRequest = youtube.videos() + .list(List.of("snippet")) + .setKey(API_KEY) + .setId(List.of(videoId)); + + var videoResponse = videoRequest.execute(); + if (videoResponse.getItems() == null || videoResponse.getItems().isEmpty()) return null; + String channelId = videoResponse.getItems().get(0).getSnippet().getChannelId(); + + YouTube.Channels.List channelRequest = youtube.channels() + .list(List.of("snippet", "statistics")) + .setKey(API_KEY) + .setId(List.of(channelId)); + + var channelResponse = channelRequest.execute(); + if (channelResponse.getItems() == null || channelResponse.getItems().isEmpty()) return null; + + return channelResponse.getItems().get(0); + } + + public String getChannelName() { + return channelName; + } + + public String getSubscriptionCount() { + return channelSubscriptionCount; + } + + public Channel getChannel() { + return channel; + } +} diff --git a/src/main/java/kr/apo2073/ytliv/Youtube.java b/src/main/java/kr/apo2073/ytliv/Youtube.java index 364e99a..ada9a15 100644 --- a/src/main/java/kr/apo2073/ytliv/Youtube.java +++ b/src/main/java/kr/apo2073/ytliv/Youtube.java @@ -39,7 +39,7 @@ public Youtube(YouTubeBuilder builder) throws GeneralSecurityException, IOExcept GoogleNetHttpTransport.newTrustedTransport(), JacksonFactory.getDefaultInstance(), null - ).build(); + ).setApplicationName("YouTubeLiv") .build(); validateApiKey(); @@ -119,10 +119,14 @@ private String getListChatID() throws IOException { } private void processMessage(LiveChatMessage message) { + if (!isRunning) return; + if (message.getSnippet().getType().equals(MessageType.SUPER_CHAT_MESSAGE.getType())) { SuperChat superChat = new SuperChat( + message.getAuthorDetails().getDisplayName(), message.getSnippet().getSuperChatDetails().getAmountDisplayString(), message.getSnippet().getSuperChatDetails().getUserComment(), + videoID, message.getSnippet().getPublishedAt().toString(), message ); @@ -131,8 +135,10 @@ private void processMessage(LiveChatMessage message) { } } else if (message.getSnippet().getType().equals(MessageType.SUPER_STICKER_MESSAGE.getType())) { SuperSticker superSticker = new SuperSticker( + message.getAuthorDetails().getDisplayName(), message.getSnippet().getSuperStickerDetails().getAmountDisplayString(), message.getSnippet().getSuperStickerDetails().getSuperStickerMetadata().getStickerId(), + videoID, message.getSnippet().getPublishedAt().toString(), message ); @@ -142,7 +148,7 @@ private void processMessage(LiveChatMessage message) { } else if (message.getSnippet().getType().equals(MessageType.TEXT_MESSAGE.getType())) { String contents = message.getSnippet().getDisplayMessage(); for (YouTubeEventListener listener : listeners) { - listener.onChat(new Chatting(contents, message)); + listener.onChat(new Chatting(message.getAuthorDetails().getDisplayName(), contents, videoID, message)); } } } @@ -154,59 +160,6 @@ private void processError(Exception e) { } public YouTubeInfo channelInfo() { - return new YouTubeInfo(youtube); - } - - public class YouTubeInfo { - private String channelName; - private String channelSubscriptionCount; - private final YouTube youTube; - private final Channel channel; - - public YouTubeInfo(YouTube youTube) { - this.youTube = youTube; - Channel tempChannel = null; - String tempName = null; - String tempCount = null; - - try { - tempChannel = getChannel(); - if (tempChannel != null) { - tempName = tempChannel.getSnippet().getTitle(); - tempCount = tempChannel.getStatistics().getSubscriberCount().toString(); - } - } catch (IOException e) { - processError(e); - } - - this.channel = tempChannel; - this.channelName = tempName; - this.channelSubscriptionCount = tempCount; - } - - public Channel getChannel() throws IOException { - YouTube.Videos.List videoRequest = youTube.videos() - .list(List.of("snippet")).setKey(api).setId(List.of(videoID)); - - var videoResponse = videoRequest.execute(); - if (videoResponse.getItems() == null || videoResponse.getItems().isEmpty()) return null; - String channelId = videoResponse.getItems().get(0).getSnippet().getChannelId(); - - YouTube.Channels.List channelRequest = youTube.channels() - .list(List.of("snippet", "statistics")).setKey(api).setId(List.of(channelId)); - - var channelResponse = channelRequest.execute(); - if (channelResponse.getItems() == null || channelResponse.getItems().isEmpty()) return null; - - return channelResponse.getItems().get(0); - } - - public String getChannelName() { - return channelName; - } - - public String getSubscriptionCount() { - return channelSubscriptionCount; - } + return YouTubeInfo.from(videoID, api); } } \ No newline at end of file diff --git a/src/main/java/kr/apo2073/ytliv/data/Author.java b/src/main/java/kr/apo2073/ytliv/data/Author.java new file mode 100644 index 0000000..d810f27 --- /dev/null +++ b/src/main/java/kr/apo2073/ytliv/data/Author.java @@ -0,0 +1,5 @@ +package kr.apo2073.ytliv.data; + +import com.google.api.services.youtube.model.LiveChatMessage; + +public record Author(String name, LiveChatMessage message) {} diff --git a/src/main/java/kr/apo2073/ytliv/data/Chatting.java b/src/main/java/kr/apo2073/ytliv/data/Chatting.java index 66e09fb..eee2ea0 100644 --- a/src/main/java/kr/apo2073/ytliv/data/Chatting.java +++ b/src/main/java/kr/apo2073/ytliv/data/Chatting.java @@ -1,21 +1,29 @@ package kr.apo2073.ytliv.data; import com.google.api.services.youtube.model.LiveChatMessage; -import com.google.api.services.youtube.model.LiveChatMessageAuthorDetails; public class Chatting { + private final String author; private final String message; private final LiveChatMessage liveChatMessage; + private final String videoId; - public Chatting(String message, LiveChatMessage liveChatMessage) { + public Chatting(String author, String message, String videoId, LiveChatMessage liveChatMessage) { + this.author = author; this.message = message; this.liveChatMessage = liveChatMessage; + this.videoId=videoId; } public String getMessage() { return message; } - public LiveChatMessageAuthorDetails author() { - return liveChatMessage.getAuthorDetails(); + + public String getVideoId() { + return videoId; + } + + public Author author() { + return new Author(author, liveChatMessage); } } diff --git a/src/main/java/kr/apo2073/ytliv/data/SuperChat.java b/src/main/java/kr/apo2073/ytliv/data/SuperChat.java index 90cc801..58c15e3 100644 --- a/src/main/java/kr/apo2073/ytliv/data/SuperChat.java +++ b/src/main/java/kr/apo2073/ytliv/data/SuperChat.java @@ -1,19 +1,22 @@ package kr.apo2073.ytliv.data; import com.google.api.services.youtube.model.LiveChatMessage; -import com.google.api.services.youtube.model.LiveChatMessageAuthorDetails; public class SuperChat { + private final String author; private final String amount; private final String message; private final String timestamp; private final LiveChatMessage liveChatMessage; + private final String videoId; - public SuperChat(String amount, String message, String timestamp, LiveChatMessage liveChatMessage) { + public SuperChat(String author, String amount, String message, String videoId, String timestamp, LiveChatMessage liveChatMessage) { this.amount = amount; this.message = message; this.timestamp = timestamp; this.liveChatMessage = liveChatMessage; + this.videoId=videoId; + this.author=author; } public String getAmount() { return amount; @@ -27,7 +30,11 @@ public String getTimestamp() { return timestamp; } - public LiveChatMessageAuthorDetails author() { - return liveChatMessage.getAuthorDetails(); + public String getVideoId() { + return videoId; + } + + public Author author() { + return new Author(author, liveChatMessage); } } diff --git a/src/main/java/kr/apo2073/ytliv/data/SuperSticker.java b/src/main/java/kr/apo2073/ytliv/data/SuperSticker.java index c02aa6e..e7f64f0 100644 --- a/src/main/java/kr/apo2073/ytliv/data/SuperSticker.java +++ b/src/main/java/kr/apo2073/ytliv/data/SuperSticker.java @@ -1,19 +1,22 @@ package kr.apo2073.ytliv.data; import com.google.api.services.youtube.model.LiveChatMessage; -import com.google.api.services.youtube.model.LiveChatMessageAuthorDetails; public class SuperSticker { + private final String author; private final String amount; private final String stickerID; private final String timestamp; private final LiveChatMessage liveChatMessage; + private final String videoId; - public SuperSticker(String amount, String content, String timestamp, LiveChatMessage liveChatMessage) { + public SuperSticker(String author, String amount, String content, String videoId, String timestamp, LiveChatMessage liveChatMessage) { this.amount = amount; this.stickerID = content; this.timestamp = timestamp; this.liveChatMessage = liveChatMessage; + this.videoId=videoId; + this.author=author; } public String getAmount() { @@ -28,5 +31,11 @@ public String getTimestamp() { return timestamp; } - public LiveChatMessageAuthorDetails author() {return liveChatMessage.getAuthorDetails();} + public String getVideoId() { + return videoId; + } + + public Author author() { + return new Author(author, liveChatMessage); + } } diff --git a/src/test/java/Main.java b/src/test/java/Main.java index d1bf4ee..93e4a69 100644 --- a/src/test/java/Main.java +++ b/src/test/java/Main.java @@ -1,4 +1,5 @@ import kr.apo2073.ytliv.YouTubeBuilder; +import kr.apo2073.ytliv.YouTubeInfo; import kr.apo2073.ytliv.Youtube; import kr.apo2073.ytliv.data.Chatting; import kr.apo2073.ytliv.listener.YouTubeEventListener; @@ -7,17 +8,17 @@ public class Main { public static void main(String[] args) { Youtube youtube = new YouTubeBuilder() .setApiKey("API-KEY") - .setVIDEO_ID("Live-Video-Id") //https://www.youtube.com/watch?v=(here) + .setVideoId("VIDEO-ID") .addListener(new YouTubeEventListener() { @Override public void onChat(Chatting chat) { - System.out.println(chat.author().getDisplayName()+": "+chat.getMessage()); + System.out.println(chat.author().name()+": "+chat.getMessage()); } }).build(); - Youtube.YouTubeInfo info = youtube.channelInfo(); - System.out.println(info.getChannelName()); // Get Channel Name - System.out.println(info.getSubscriptionCount()); // Get Channel Subscription Count + YouTubeInfo info = youtube.channelInfo(); + System.out.println(info.getChannelName()); + System.out.println(info.getSubscriptionCount()); try { Thread.sleep(5000); } catch (InterruptedException e) { @@ -25,6 +26,5 @@ public void onChat(Chatting chat) { } youtube.stop(); - System.out.println("Stopped"); } } \ No newline at end of file