@@ -61,6 +61,11 @@ private void generateAccessTokenAsync(Consumer<AccessTokenResponse> callback) {
6161 });
6262 }
6363
64+ /**
65+ * Request server time of Spotify for time-based one time password
66+ *
67+ * @return server time in seconds
68+ */
6469 public long requestServerTime () throws IOException {
6570 // Get server time
6671 URL url = new URL (URL_API_SERVER_TIME );
@@ -78,22 +83,33 @@ public long requestServerTime() throws IOException {
7883 return obj .get ("serverTime" ).getAsLong ();
7984 }
8085
86+ /**
87+ * Generate time-based one time password
88+ *
89+ * @param serverTime server time in seconds
90+ * @return 6 digits one time password
91+ */
8192 public String generateTotp (long serverTime ) {
93+ // Convert secret numbers to xor results
8294 StringBuilder xorResults = new StringBuilder ();
8395 for (int i = 0 ; i < TOTP_SECRET .length ; i ++) {
8496 int result = TOTP_SECRET [i ] ^ (i % 33 + 9 );
8597 xorResults .append (result );
8698 }
99+
100+ // Convert xor results to hex
87101 StringBuilder hexResult = new StringBuilder ();
88102 for (int i = 0 ; i < xorResults .length (); i ++) {
89103 hexResult .append (String .format ("%02x" , (int ) xorResults .charAt (i )));
90104 }
105+
106+ // Convert hex to byte array
91107 byte [] byteArray = new byte [hexResult .length () / 2 ];
92108 for (int i = 0 ; i < hexResult .length (); i += 2 ) {
93109 int byteValue = Integer .parseInt (hexResult .substring (i , i + 2 ), 16 );
94110 byteArray [i / 2 ] = (byte ) byteValue ;
95111 }
96- return TOTP .generateOtp (byteArray , serverTime );
112+ return TOTP .generateOtp (byteArray , serverTime , 30 , 6 );
97113 }
98114
99115 /**
@@ -116,10 +132,6 @@ private AccessTokenResponse generateAccessToken() throws IOException {
116132 return response ;
117133 }
118134
119- private boolean hasValidAccessToken (AccessTokenResponse response ) {
120- return response != null && response .accessToken != null && !response .accessToken .isEmpty ();
121- }
122-
123135 /**
124136 * Retrieve access token using totp
125137 */
@@ -377,6 +389,10 @@ public <T> T request(String url, Class<?> clazz, boolean canGenerateNewAccessTok
377389 return GSON .fromJson (reader , clazz );
378390 }
379391
392+ private boolean hasValidAccessToken (AccessTokenResponse response ) {
393+ return response != null && response .accessToken != null && !response .accessToken .isEmpty ();
394+ }
395+
380396 public Cache <BufferedImage > getImageCache () {
381397 return this .imageCache ;
382398 }
0 commit comments