tobby48 4 년 전
부모
커밋
ddf8bc7f0d

+ 5
- 1
pom.xml 파일 보기

@@ -250,7 +250,11 @@
250 250
 		    <artifactId>JDA</artifactId>
251 251
 		    <version>4.2.0_181</version>
252 252
 		</dependency>
253
-
253
+		<dependency>
254
+		    <groupId>com.sedmelluq</groupId>
255
+		    <artifactId>lavaplayer</artifactId>
256
+		    <version>1.3.53</version>
257
+		</dependency>
254 258
 		
255 259
 
256 260
 		

+ 42
- 0
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/AudioPlayerSendHandler.java 파일 보기

@@ -0,0 +1,42 @@
1
+package kr.co.swh.lecture.opensource.project.discode.music; 
2
+
3
+import java.nio.ByteBuffer;
4
+
5
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
6
+import com.sedmelluq.discord.lavaplayer.track.playback.AudioFrame;
7
+
8
+import net.dv8tion.jda.api.audio.AudioSendHandler;
9
+
10
+/**
11
+ * <pre>
12
+ * kr.co.swh.lecture.opensource.project.discode.music 
13
+ * AudioPlayerSendHandler.java
14
+ *
15
+ * 설명 :
16
+ * </pre>
17
+ * 
18
+ * @since : 2021. 6. 13.
19
+ * @author : tobby48
20
+ * @version : v1.0
21
+ */
22
+public class AudioPlayerSendHandler implements AudioSendHandler {
23
+	  private final AudioPlayer audioPlayer;
24
+	  private AudioFrame lastFrame;
25
+
26
+	  public AudioPlayerSendHandler(AudioPlayer audioPlayer) {
27
+	    this.audioPlayer = audioPlayer;
28
+	  }
29
+
30
+	  public boolean canProvide() {
31
+	    lastFrame = audioPlayer.provide();
32
+	    return lastFrame != null;
33
+	  }
34
+
35
+	  public ByteBuffer provide20MsAudio() {
36
+	    return ByteBuffer.wrap(lastFrame.getData());
37
+	  }
38
+
39
+	  public boolean isOpus() {
40
+	    return true;
41
+	  }
42
+	}

+ 44
- 0
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/GuildMusicManager.java 파일 보기

@@ -0,0 +1,44 @@
1
+package kr.co.swh.lecture.opensource.project.discode.music; 
2
+
3
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
4
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
5
+
6
+/**
7
+ * <pre>
8
+ * kr.co.swh.lecture.opensource.project.discode.music 
9
+ * GuildMusicManager.java
10
+ *
11
+ * 설명 :
12
+ * </pre>
13
+ * 
14
+ * @since : 2021. 6. 13.
15
+ * @author : tobby48
16
+ * @version : v1.0
17
+ */
18
+public class GuildMusicManager {
19
+    /**
20
+     * Audio player for the guild.
21
+     */
22
+    public final AudioPlayer player;
23
+    /**
24
+     * Track scheduler for the player.
25
+     */
26
+    public final TrackScheduler scheduler;
27
+
28
+    /**
29
+     * Creates a player and a track scheduler.
30
+     * @param manager Audio player manager to use for creating the player.
31
+     */
32
+    public GuildMusicManager(AudioPlayerManager manager) {
33
+        player = manager.createPlayer();
34
+        scheduler = new TrackScheduler(player);
35
+        player.addListener(scheduler);
36
+    }
37
+
38
+    /**
39
+     * @return Wrapper around AudioPlayer to use it as an AudioSendHandler.
40
+     */
41
+    public AudioPlayerSendHandler getSendHandler() {
42
+        return new AudioPlayerSendHandler(player);
43
+    }
44
+}

+ 182
- 81
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/LayoutListener.java 파일 보기

@@ -1,15 +1,80 @@
1 1
 package kr.co.swh.lecture.opensource.project.discode.music;
2 2
 
3 3
 import java.awt.Color;
4
+import java.nio.ByteBuffer;
5
+import java.util.ArrayList;
4 6
 
7
+import kr.co.swh.lecture.opensource.project.youtube.Youtube;
5 8
 import net.dv8tion.jda.api.EmbedBuilder;
9
+import net.dv8tion.jda.api.Permission;
6 10
 import net.dv8tion.jda.api.entities.Message;
7 11
 import net.dv8tion.jda.api.entities.TextChannel;
8 12
 import net.dv8tion.jda.api.entities.User;
13
+import net.dv8tion.jda.api.entities.VoiceChannel;
9 14
 import net.dv8tion.jda.api.events.message.MessageReceivedEvent;
15
+import net.dv8tion.jda.api.events.message.guild.GuildMessageReceivedEvent;
10 16
 import net.dv8tion.jda.api.hooks.ListenerAdapter;
17
+import net.dv8tion.jda.api.managers.AudioManager;
11 18
 
12 19
 public class LayoutListener extends ListenerAdapter{
20
+
21
+	@Override
22
+	public void onGuildMessageReceived(GuildMessageReceivedEvent event) {
23
+		// TODO Auto-generated method stub
24
+		//	super.onGuildMessageReceived(event);
25
+		// Good practise to ignore bots.
26
+		if(event.getAuthor().isBot()) {
27
+			return;
28
+		}
29
+		// Gets the raw message content and binds it to a local variable.
30
+		String message = event.getMessage().getContentRaw().toLowerCase();
31
+		// So we don't have to access event.getChannel() every time.
32
+		TextChannel channel = event.getChannel();
33
+		// Checks if the command is !join.
34
+		if(message.equals("!join")) {
35
+			// Checks if the bot has permissions.
36
+			if(!event.getGuild().getSelfMember().hasPermission(channel, Permission.VOICE_CONNECT)) {
37
+				// The bot does not have permission to join any voice channel. Don't forget the .queue()!
38
+				channel.sendMessage("I do not have permissions to join a voice channel!").queue();
39
+				return;
40
+			}
41
+
42
+//			net.dv8tion.jda.api.entities.Member m = event.getMember();
43
+			// Creates a variable equal to the channel that the user is in.
44
+			VoiceChannel connectedChannel = event.getMember().getVoiceState().getChannel();
45
+			// Checks if they are in a channel -- not being in a channel means that the variable = null.
46
+			if(connectedChannel == null) {
47
+				// Don't forget to .queue()!
48
+				channel.sendMessage("You are not connected to a voice channel!").queue();
49
+				return;
50
+			}
51
+			// Gets the audio manager.
52
+			AudioManager audioManager = event.getGuild().getAudioManager();
53
+			// When somebody really needs to chill.
54
+			if(audioManager.isAttemptingToConnect()) {
55
+				channel.sendMessage("The bot is already trying to connect! Enter the chill zone!").queue();
56
+				return;
57
+			}
58
+			// Connects to the channel.
59
+			audioManager.openAudioConnection(connectedChannel);
60
+			// Obviously people do not notice someone/something connecting.
61
+			channel.sendMessage("Connected to the voice channel!").queue();
62
+		} else if(message.equals("!leave")) { // Checks if the command is !leave.
63
+			// Gets the channel in which the bot is currently connected.
64
+            VoiceChannel connectedChannel = event.getGuild().getSelfMember().getVoiceState().getChannel();
65
+            // Checks if the bot is connected to a voice channel.
66
+            if(connectedChannel == null) {
67
+                // Get slightly fed up at the user.
68
+                channel.sendMessage("I am not connected to a voice channel!").queue();
69
+                return;
70
+            }
71
+            // Disconnect from the channel.
72
+            event.getGuild().getAudioManager().closeAudioConnection();
73
+            // Notify the user.
74
+            channel.sendMessage("Disconnected from the voice channel!").queue();
75
+		}
76
+
77
+	}
13 78
 	
14 79
 	@Override
15 80
 	public void onMessageReceived(MessageReceivedEvent event) {
@@ -18,95 +83,131 @@ public class LayoutListener extends ListenerAdapter{
18 83
 		TextChannel tc = event.getTextChannel();
19 84
 		Message msg = event.getMessage();
20 85
 		if(user.isBot()) return;
21
-		
22
-		
86
+
23 87
 		String message = msg.getContentRaw();
24
-		System.out.println(message.substring(0, 3));
25
-		
26
-		String m=message;
27
-		if(message.substring(0, 3).equals("!! ")) {
28
-			m = message.substring(3);
88
+		if(message.substring(0, 3).equals("!l ")) {
89
+			String title = message.substring(3);
90
+			
91
+			Youtube y = new Youtube();
92
+			ArrayList<String> arr = y.audio(title);
93
+			
94
+			PlayerManager Playermanager = PlayerManager.getINSTANCE();
95
+			Playermanager.loadAndPlay(tc, arr.get(0));
96
+			Playermanager.getGuildMusicManager(tc.getGuild()).player.setVolume(10);
97
+			
98
+			
99
+//			for(String s : arr) {
100
+//				// Create the EmbedBuilder instance
101
+//				EmbedBuilder eb = new EmbedBuilder();
102
+//
103
+//				/*
104
+//				    Set the title:
105
+//				    1. Arg: title as string
106
+//				    2. Arg: URL as string or could also be null
107
+//				 */
108
+//				eb.setTitle(title, null);
109
+//				eb.setThumbnail("https://swhcoding.com/img/testimonials/person-1.gif");
110
+//				eb.setColor(Color.red);
111
+//				eb.setColor(new Color(0xF40C0C));
112
+//				eb.setColor(new Color(255, 0, 54));
113
+//
114
+//				eb.addField(title, s, false);
115
+////				tc.sendMessage(eb.build()).queue(response /* => Message */ -> {
116
+////
117
+////	        		response.editMessage(s).queue();
118
+////
119
+////	        	});
120
+//				tc.sendMessage(title) /* => RestAction<Message> */
121
+//            	.queue(response /* => Message */ -> {
122
+//
123
+//            		response.editMessage(s).queue();
124
+//
125
+//            	});
126
+//	        }
29 127
 		}
30
-		
31
-//		// 형태소 분석
32
-//		for (Eojeol eojeol : Analyzer.parseEojeolJava(msg.getContentRaw())) {
33
-//			for (LNode node : eojeol.nodesJava()) {
34
-//				Morpheme m = node.morpheme();
35
-//				tc.sendMessage(m.surface() + " / 품사:" + m.feature().head()).queue();
36
-//			}
37
-//		}
38
-		
39
-//		EmbedBuilder eb = new EmbedBuilder();
40
-//		eb.setTitle("It's GIVEAWAY-TIME!");
41
-//		eb.setDescription("Prize: " + "\n Winners: " + 1);
42
-//		eb.setColor(Color.BLUE);
43
-//		eb.setFooter("바닥");
44
-		
45
-		// Create the EmbedBuilder instance
46
-		EmbedBuilder eb = new EmbedBuilder();
47
-
48
-		/*
49
-		    Set the title:
50
-		    1. Arg: title as string
51
-		    2. Arg: URL as string or could also be null
52
-		 */
53
-		eb.setTitle(m, null);
54 128
 
55
-		/*
56
-		    Set the color
57
-		 */
58
-		eb.setColor(Color.red);
59
-		eb.setColor(new Color(0xF40C0C));
60
-		eb.setColor(new Color(255, 0, 54));
61 129
 
62
-		/*
63
-		    Set the text of the Embed:
64
-		    Arg: text as string
65
-		 */
66
-		eb.setDescription("Text");
67 130
 
68
-		/*
69
-		    Add fields to embed:
70
-		    1. Arg: title as string
71
-		    2. Arg: text as string
72
-		    3. Arg: inline mode true / false
73
-		 */
74
-		eb.addField("Title of field", "test of field", false);
131
+		//		// 형태소 분석
132
+		//		for (Eojeol eojeol : Analyzer.parseEojeolJava(msg.getContentRaw())) {
133
+		//			for (LNode node : eojeol.nodesJava()) {
134
+		//				Morpheme m = node.morpheme();
135
+		//				tc.sendMessage(m.surface() + " / 품사:" + m.feature().head()).queue();
136
+		//			}
137
+		//		}
75 138
 
76
-		/*
77
-		    Add spacer like field
78
-		    Arg: inline mode true / false
79
-		 */
80
-		eb.addBlankField(false);
139
+		//		EmbedBuilder eb = new EmbedBuilder();
140
+		//		eb.setTitle("It's GIVEAWAY-TIME!");
141
+		//		eb.setDescription("Prize: " + "\n Winners: " + 1);
142
+		//		eb.setColor(Color.BLUE);
143
+		//		eb.setFooter("바닥");
81 144
 
82
-		/*
83
-		    Add embed author:
84
-		    1. Arg: name as string
85
-		    2. Arg: url as string (can be null)
86
-		    3. Arg: icon url as string (can be null)
87
-		 */
88
-//		eb.setAuthor("name", null, "https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/zekroBot_Logo_-_round_small.png");
89
-
90
-		/*
91
-		    Set footer:
92
-		    1. Arg: text as string
93
-		    2. icon url as string (can be null)
94
-		 */
95
-//		eb.setFooter("Text", "https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/zekroBot_Logo_-_round_small.png");
96
-
97
-		/*
98
-		    Set image:
99
-		    Arg: image url as string
100
-		 */
101
-//		eb.setImage("https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/logo%20-%20title.png");
145
+//		// Create the EmbedBuilder instance
146
+//		EmbedBuilder eb = new EmbedBuilder();
147
+//
148
+//		/*
149
+//		    Set the title:
150
+//		    1. Arg: title as string
151
+//		    2. Arg: URL as string or could also be null
152
+//		 */
153
+//		eb.setTitle(m, null);
154
+//		eb.setThumbnail("https://swhcoding.com/img/testimonials/person-1.gif");
155
+//
156
+//		/*
157
+//		    Set the color
158
+//		 */
159
+//		eb.setColor(Color.red);
160
+//		eb.setColor(new Color(0xF40C0C));
161
+//		eb.setColor(new Color(255, 0, 54));
162
+//
163
+//		/*
164
+//		    Set the text of the Embed:
165
+//		    Arg: text as string
166
+//		 */
167
+////		eb.setDescription("Text");
168
+//
169
+//		/*
170
+//		    Add fields to embed:
171
+//		    1. Arg: title as string
172
+//		    2. Arg: text as string
173
+//		    3. Arg: inline mode true / false
174
+//		 */
175
+//		eb.addField("Title of field", "test of field", false);
176
+//
177
+////		/*
178
+////		    Add spacer like field
179
+////		    Arg: inline mode true / false
180
+////		 */
181
+////		eb.addBlankField(false);
182
+//
183
+//		/*
184
+//		    Add embed author:
185
+//		    1. Arg: name as string
186
+//		    2. Arg: url as string (can be null)
187
+//		    3. Arg: icon url as string (can be null)
188
+//		 */
189
+//		//		eb.setAuthor("name", null, "https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/zekroBot_Logo_-_round_small.png");
190
+//
191
+//		/*
192
+//		    Set footer:
193
+//		    1. Arg: text as string
194
+//		    2. icon url as string (can be null)
195
+//		 */
196
+//		//		eb.setFooter("Text", "https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/zekroBot_Logo_-_round_small.png");
197
+//
198
+//		/*
199
+//		    Set image:
200
+//		    Arg: image url as string
201
+//		 */
202
+//		//		eb.setImage("https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/logo%20-%20title.png");
203
+//
204
+//		/*
205
+//		    Set thumbnail image:
206
+//		    Arg: image url as string
207
+//		 */
208
+//		//		eb.setThumbnail("https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/logo%20-%20title.png");
209
+//		event.getTextChannel().sendMessage(eb.build()).queue();
102 210
 
103
-		/*
104
-		    Set thumbnail image:
105
-		    Arg: image url as string
106
-		 */
107
-//		eb.setThumbnail("https://github.com/zekroTJA/DiscordBot/blob/master/.websrc/logo%20-%20title.png");
108
-		event.getTextChannel().sendMessage(eb.build()).queue();
109
-		
110 211
 	}
111 212
 
112 213
 }

+ 107
- 0
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/PlayerManager.java 파일 보기

@@ -0,0 +1,107 @@
1
+package kr.co.swh.lecture.opensource.project.discode.music; 
2
+
3
+import org.apache.log4j.Logger;
4
+import com.sedmelluq.discord.lavaplayer.player.AudioLoadResultHandler;
5
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayerManager;
6
+import com.sedmelluq.discord.lavaplayer.player.DefaultAudioPlayerManager;
7
+import com.sedmelluq.discord.lavaplayer.source.AudioSourceManagers;
8
+import com.sedmelluq.discord.lavaplayer.tools.FriendlyException;
9
+import com.sedmelluq.discord.lavaplayer.track.AudioPlaylist;
10
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
11
+import net.dv8tion.jda.api.entities.Guild;
12
+import net.dv8tion.jda.api.entities.TextChannel;
13
+
14
+import java.util.HashMap;
15
+import java.util.Map;
16
+
17
+/**
18
+ * <pre>
19
+ * kr.co.swh.lecture.opensource.project.discode.music 
20
+ * PlayerManager.java
21
+ *
22
+ * 설명 :
23
+ * </pre>
24
+ * 
25
+ * @since : 2021. 6. 13.
26
+ * @author : tobby48
27
+ * @version : v1.0
28
+ */
29
+public class PlayerManager {
30
+    private static PlayerManager INSTANCE;
31
+    private final AudioPlayerManager playerManager;
32
+    private final Map<Long, GuildMusicManager> musicManagers;
33
+
34
+    private PlayerManager() {
35
+        this.musicManagers = new HashMap<>();
36
+
37
+        this.playerManager = new DefaultAudioPlayerManager();
38
+        AudioSourceManagers.registerRemoteSources(playerManager);
39
+        AudioSourceManagers.registerLocalSource(playerManager);
40
+    }
41
+
42
+    public synchronized GuildMusicManager getGuildMusicManager(Guild guild) {
43
+        long guildId = guild.getIdLong();
44
+        GuildMusicManager musicManager = musicManagers.get(guildId);
45
+
46
+        if (musicManager == null) {
47
+            musicManager = new GuildMusicManager(playerManager);
48
+            musicManagers.put(guildId,musicManager);
49
+        }
50
+
51
+        guild.getAudioManager().setSendingHandler(musicManager.getSendHandler());
52
+
53
+        return musicManager;
54
+
55
+    }
56
+
57
+    public void loadAndPlay(TextChannel channel,String trackURL) {
58
+        String prefix = "[MusicBotInfo]";
59
+        GuildMusicManager musicManager = getGuildMusicManager(channel.getGuild());
60
+
61
+        playerManager.loadItemOrdered(musicManager, trackURL, new AudioLoadResultHandler() {
62
+            @Override
63
+            public void trackLoaded(AudioTrack track) {
64
+//                Main.sendMessage(Main.channel, prefix + "次の音楽を再生します:" + track.getInfo());
65
+                play(musicManager,track);
66
+            }
67
+
68
+            @Override
69
+            public void playlistLoaded(AudioPlaylist playlist) {
70
+                AudioTrack firstTrack = playlist.getSelectedTrack();
71
+
72
+                if (firstTrack == null) {
73
+                    firstTrack = playlist.getTracks().get(0);
74
+                }
75
+
76
+//                Main.sendMessage(Main.channel, prefix + "次の音楽を再生します:" + firstTrack.getInfo());
77
+
78
+                play(musicManager,firstTrack);
79
+            }
80
+
81
+            @Override
82
+            public void noMatches() {
83
+                //見つからなかった
84
+                channel.sendMessage(prefix + "指定されたURLの音楽が見つかりませんでした。");
85
+            }
86
+
87
+            @Override
88
+            public void loadFailed(FriendlyException e) {
89
+                //ロード時にエラー発生
90
+                channel.sendMessage(prefix + "再生のロードでエラーが発生しました。");
91
+            }
92
+        });
93
+
94
+    }
95
+
96
+    private void play(GuildMusicManager musicManager,AudioTrack track) {
97
+        musicManager.scheduler.queue(track);
98
+    }
99
+
100
+    public static synchronized PlayerManager getINSTANCE() {
101
+        if (INSTANCE == null) {
102
+            INSTANCE = new PlayerManager();
103
+        }
104
+
105
+        return INSTANCE;
106
+    }
107
+}

+ 65
- 0
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/TrackScheduler.java 파일 보기

@@ -0,0 +1,65 @@
1
+package kr.co.swh.lecture.opensource.project.discode.music; 
2
+
3
+import java.util.concurrent.BlockingQueue;
4
+import java.util.concurrent.LinkedBlockingQueue;
5
+
6
+import com.sedmelluq.discord.lavaplayer.player.AudioPlayer;
7
+import com.sedmelluq.discord.lavaplayer.player.event.AudioEventAdapter;
8
+import com.sedmelluq.discord.lavaplayer.track.AudioTrack;
9
+import com.sedmelluq.discord.lavaplayer.track.AudioTrackEndReason;
10
+
11
+/**
12
+ * <pre>
13
+ * kr.co.swh.lecture.opensource.project.discode.music 
14
+ * TrackScheduler.java
15
+ *
16
+ * 설명 :
17
+ * </pre>
18
+ * 
19
+ * @since : 2021. 6. 13.
20
+ * @author : tobby48
21
+ * @version : v1.0
22
+ */
23
+public class TrackScheduler extends AudioEventAdapter {
24
+    private final AudioPlayer player;
25
+    private final BlockingQueue<AudioTrack> queue;
26
+
27
+    /**
28
+     * @param player The audio player this scheduler uses
29
+     */
30
+    public TrackScheduler(AudioPlayer player) {
31
+        this.player = player;
32
+        this.queue = new LinkedBlockingQueue<>();
33
+    }
34
+
35
+    /**
36
+     * Add the next track to queue or play right away if nothing is in the queue.
37
+     *
38
+     * @param track The track to play or add to queue.
39
+     */
40
+    public void queue(AudioTrack track) {
41
+        // Calling startTrack with the noInterrupt set to true will start the track only if nothing is currently playing. If
42
+        // something is playing, it returns false and does nothing. In that case the player was already playing so this
43
+        // track goes to the queue instead.
44
+        if (!player.startTrack(track, true)) {
45
+            queue.offer(track);
46
+        }
47
+    }
48
+
49
+    /**
50
+     * Start the next track, stopping the current one if it is playing.
51
+     */
52
+    public void nextTrack() {
53
+        // Start the next track, regardless of if something is already playing or not. In case queue was empty, we are
54
+        // giving null to startTrack, which is a valid argument and will simply stop the player.
55
+        player.startTrack(queue.poll(), false);
56
+    }
57
+
58
+    @Override
59
+    public void onTrackEnd(AudioPlayer player, AudioTrack track, AudioTrackEndReason endReason) {
60
+        // Only start the next track if the end reason is suitable for it (FINISHED or LOAD_FAILED)
61
+        if (endReason.mayStartNext) {
62
+            nextTrack();
63
+        }
64
+    }
65
+}

+ 163
- 0
src/main/java/kr/co/swh/lecture/opensource/project/discode/music/Youtube.java 파일 보기

@@ -0,0 +1,163 @@
1
+package kr.co.swh.lecture.opensource.project.discode.music; 
2
+
3
+/**
4
+ * <pre>
5
+ * kr.co.swh.lecture.opensource.project.youtube 
6
+ * Youtube.java
7
+ *
8
+ * 설명 :
9
+ * </pre>
10
+ * 
11
+ * @since : 2021. 6. 6.
12
+ * @author : tobby48
13
+ * @version : v1.0
14
+ */
15
+import java.io.BufferedReader;
16
+import java.io.IOException;
17
+import java.io.InputStreamReader;
18
+import java.net.HttpURLConnection;
19
+import java.net.URL;
20
+import java.net.URLEncoder;
21
+import java.util.ArrayList;
22
+import java.util.HashMap;
23
+import java.util.List;
24
+import java.util.Map;
25
+import java.util.Scanner;
26
+
27
+import com.google.gson.Gson;
28
+
29
+
30
+
31
+
32
+public class Youtube {
33
+	public String search(String search) throws IOException {
34
+		
35
+		String apiurl = "https://www.googleapis.com/youtube/v3/search";
36
+		apiurl += "?key=AIzaSyAI9M3FgT9emj5omLmbvm8rRDVLQvMMgE8";
37
+		apiurl += "&part=snippet&type=video&maxResults=20&videoEmbeddable=true";
38
+		apiurl += "&q="+URLEncoder.encode(search,"UTF-8");
39
+		
40
+		URL url = new URL(apiurl);
41
+		HttpURLConnection con = (HttpURLConnection) url.openConnection();
42
+		con.setRequestMethod("GET");
43
+		
44
+		BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
45
+		String inputLine;
46
+		StringBuffer response = new StringBuffer();
47
+		while((inputLine = br.readLine()) != null) {
48
+			response.append(inputLine);
49
+		}
50
+		br.close();
51
+		
52
+		return response.toString();
53
+	}
54
+	
55
+	public ArrayList<String> audio(String audio) {
56
+		
57
+		Gson gsonObj = new Gson();
58
+		Map<String, String> inputMap = new HashMap<String, String>();
59
+		inputMap.put("name", "makesomething");
60
+		inputMap.put("blog", "https://web-inf.tistory.com");
61
+		
62
+		Youtube y = new Youtube();
63
+		ArrayList<String> alist = new ArrayList<String>();
64
+		try {
65
+			String s = y.search(""+ audio +"");
66
+			Map map = gsonObj.fromJson(s, Map.class);	
67
+
68
+
69
+			//			List list = gsonObj.fromJson(map.get("items"), List.class);	
70
+			List list = (List)map.get("items");
71
+
72
+			//			Map map1 = gsonObj.fromJson(list.get(0).toString(), Map.class);
73
+			for(int a = 0; a < list.size(); a++) {
74
+
75
+				Map id = (Map)list.get(a);
76
+				Map videoId = (Map)id.get("id");
77
+				//System.out.println(videoId.get("videoId"));
78
+
79
+				Map snippet = (Map)list.get(a);
80
+				Map title = (Map)id.get("snippet");
81
+				//System.out.println(title.get("title"));
82
+				String popo;
83
+				HashMap<String,String> disc = new HashMap<String,String>();
84
+				//disc.put("number",String.valueOf(a+1));
85
+				//disc.put("title",(String) title.get("title")); //값 추가
86
+				disc.put("address","https://www.youtube.com/watch?v="+((String) videoId.get("videoId")));
87
+				System.out.println(disc);
88
+				popo = "https://www.youtube.com/watch?v="+((String) videoId.get("videoId"));
89
+				
90
+				alist.add(popo);	
91
+					if(a > 10)   
92
+					{
93
+						break;
94
+					}
95
+					else if(alist.toString().length() > 2000) 
96
+					{
97
+						alist.remove(a);
98
+						break;
99
+					}
100
+				}
101
+
102
+			//			System.out.println(map.get("items"));
103
+
104
+			//			System.out.println(s);
105
+
106
+
107
+		} catch (IOException e) {
108
+			// TODO Auto-generated catch block
109
+			e.printStackTrace();
110
+		}
111
+		return alist;
112
+	}
113
+	public static void main(String[] args) {
114
+		String name;
115
+		Gson gsonObj = new Gson();
116
+		Map<String, String> inputMap = new HashMap<String, String>();
117
+		inputMap.put("name", "makesomething");
118
+		inputMap.put("blog", "https://web-inf.tistory.com");
119
+		Scanner sc = new Scanner(System.in);
120
+		name = sc.next();
121
+		Youtube y = new Youtube();
122
+		
123
+		try {
124
+			String s = y.search(""+ name +"");
125
+			Map map = gsonObj.fromJson(s, Map.class);	
126
+
127
+
128
+			//			List list = gsonObj.fromJson(map.get("items"), List.class);	
129
+			List list = (List)map.get("items");
130
+
131
+			//			Map map1 = gsonObj.fromJson(list.get(0).toString(), Map.class);
132
+			for(int a = 0; a<15; a++) {
133
+
134
+				Map id = (Map)list.get(a);
135
+				Map videoId = (Map)id.get("id");
136
+				//System.out.println(videoId.get("videoId"));
137
+
138
+				Map snippet = (Map)list.get(a);
139
+				Map title = (Map)id.get("snippet");
140
+				//System.out.println(title.get("title"));
141
+
142
+				HashMap<String,String> disc = new HashMap<String,String>();
143
+				disc.put("number",String.valueOf(a+1));
144
+				disc.put("title",(String) title.get("title")); //값 추가
145
+				disc.put("address","https://www.youtube.com/watch?v="+((String) videoId.get("videoId")));
146
+				System.out.println(disc);
147
+
148
+
149
+			}
150
+
151
+			//			System.out.println(map.get("items"));
152
+
153
+			//			System.out.println(s);
154
+
155
+
156
+		} catch (IOException e) {
157
+			// TODO Auto-generated catch block
158
+			e.printStackTrace();
159
+		}
160
+		
161
+		
162
+	}
163
+}