Musorg で日本語 CDDB から楽曲情報取ってくるパッチ書いた

MacCDDB から情報を取って来れるいい感じの
ID3 タグエディタを探していたら Musorg を見つけた。
しかし、CDDB サーバが freedb.org で決めうちされており、
日本語のデータがあんまり取れない。


ソースコードが付いていたので
freedb 日本語(freedbtest.dyndns.org)から
情報を取ってくるようにパッチを書いた。


最初は、ハードコーディングされたサーバ名(freedb.freedb.org)を
freedbtest.dyndns.org にハードコーディングしなおせば(オイ)
うまく動くと思っていたが、うまく行かなかった。


原因はプロトコルの違い。
Musorg は CDDB プロトコルのみ対応。
freedb 日本語 は HTTP のみ対応。


結局、HTTP で CDDB に接続する処理まで書いた。

なにげに Objective-C 初めて書いたYO!
まったくわからんね。


うまく動いてるのでよしとするか…。


ホントは、 CDDB のサーバを設定でかえられるようにして
CDDB プロトコルか HTTP かを選べるようにするべきだけど
Objective-C はホントわからないんで勘弁してください。



対象は Musorg 0.2.2

Freedb.h.patch

--- sources/Freedb.h	2007-03-14 20:16:43.000000000 +0900
+++ sources.new/Freedb.h	2008-07-10 22:48:58.000000000 +0900
@@ -35,8 +35,8 @@
 	
 	NSMutableArray *freedbAlbums;
 	
-	NSInputStream *inputStream;
-	NSOutputStream *outputStream;
+//	NSInputStream *inputStream;
+//	NSOutputStream *outputStream;
 	
 	NSMutableData *sendQueue;
 	NSMutableArray *tmpQueue;
@@ -45,7 +45,7 @@
 	
 	NSMutableData *readBuffer;
 	
-	BOOL sending;
+//	BOOL sending;
 	unsigned int bytesRead;
 	unsigned int resultCount;
 }
@@ -64,23 +64,23 @@
 - (int)discIdSum:(long)sec;
 
 	// Called when there is data to read.
-- (void)handleReadEvent:(NSStreamEvent)eventCode;
+//- (void)handleReadEvent:(NSStreamEvent)eventCode;
 	// Called when stream is ready for writing.
-- (void)handleWriteEvent:(NSStreamEvent)eventCode;
+//- (void)handleWriteEvent:(NSStreamEvent)eventCode;
 
 	// Connect to server.
-- (void)connect;
+//- (void)connect;
 	// Read bytes from the stream.
-- (void)readBytes;
+//- (void)readBytes;
 	// Send data.
 - (void)send:(NSString *)msg;
 
 	// Do handshake.
-- (void)sendHandshake;
+- (NSString *)makeHandshakeString;
 	// Quit.
 - (void)sendQuit;
 	// End connection. Send quit. Release used resources.
-- (void)endConnection;
+//- (void)endConnection;
 	// Send disc query to server.
 - (void)sendQuery:(unsigned int)discid numOfTracks:(unsigned int) tracks
 		   length:(unsigned int)secs offsets:(NSArray*)offsets;


Freedb.m.patch

--- sources/Freedb.m	2007-08-24 05:26:51.000000000 +0900
+++ sources.new/Freedb.m	2008-07-11 02:26:28.000000000 +0900
@@ -31,7 +31,7 @@
 		requests = [ [NSMutableArray alloc ] init];
 		freedbAlbums = [ [NSMutableArray alloc] init];
 		
-		sending = FALSE;
+		//sending = FALSE;
 		resultCount = 0;
 	}
 	
@@ -45,8 +45,8 @@
 	[tmpQueue release];
 	[requests release];
 	
-	[inputStream release];
-	[outputStream release];
+//	[inputStream release];
+//	[outputStream release];
 
 	[super dealloc];
 }
@@ -54,7 +54,7 @@
 -(IBAction)stopLookup:(id)sender {
 	
 	// Close connection.
-	[self endConnection];
+//	[self endConnection];
 	
 	[freedbAlbumsController removeObjects:freedbAlbums];
 	
@@ -124,14 +124,15 @@
 	return ret;
 }
 
+/*
 - (void)connect {
 	
 	NSHost *host;
 	
 	// FIXME user should be able to select different server too.	
-	host = [NSHost hostWithName:@"freedb.freedb.org"];
+	host = [NSHost hostWithName:@"freedbtest.dyndns.org"];
 	
-	[NSStream getStreamsToHost: host port: 8880
+	[NSStream getStreamsToHost: host port: 80
 				   inputStream:&inputStream
 				  outputStream:&outputStream];
 	
@@ -157,29 +158,29 @@
 	bytesRead = 0;
 
 	// Handshake.
-	[self sendHandshake];
+	//[self sendHandshake];
 
 }
-
+*/
 
 - (void)sendQuit {
 	
 	// Closes connection.
-	[requests addObject:[NSNumber numberWithInt:IgnoreRequest] ];
-	[self send:@"quit¥n"];
+	//[requests addObject:[NSNumber numberWithInt:IgnoreRequest] ];
+	//[self send:@"quit¥n"];
 	
 }
 
-- (void)sendHandshake {
+- (NSString *)makeHandshakeString {
 	
 	NSHost *currentHost = [NSHost currentHost];
 	NSMutableString	*instanceName;
 	NSEnumerator *enumerator = [ [currentHost addresses] objectEnumerator];
 
 	// Hello, always after connection msg so 1 
-	[requests insertObject:[NSNumber numberWithInt:HandshakeRequest] atIndex:1];
+	//[requests insertObject:[NSNumber numberWithInt:HandshakeRequest] atIndex:1];
 	// Protocol, always after hello msg so 2
-	[requests insertObject:[NSNumber numberWithInt:IgnoreRequest] atIndex:2];
+	//[requests insertObject:[NSNumber numberWithInt:IgnoreRequest] atIndex:2];
 	// Queue may contain other msgs so those must be inserted before them.
 	
 	// Search for correct IP-address.
@@ -203,12 +204,13 @@
 	NSString *hostname = [localhost name] ? [localhost name] : instanceName;
 
 	// Send client info, username and hostname.
-	NSString *tmp = [NSString stringWithFormat:@"cddb hello %s %s musorg 0.1¥n",
-		[NSUserName() UTF8String], [hostname UTF8String] ];
-	[self send:tmp];
+	NSString *tmp = [NSString stringWithFormat:@"&hello=%s+%s+musorg+0.1",
+		[@"test" UTF8String], [hostname UTF8String] ];
+	//[self send:tmp];
 	
 	// Sets protocol for level 6, supports UTF-8.
-	[self send:@"proto 6¥n"];
+	//[self send:@"proto 6¥n"];
+	return [tmp stringByAppendingString:@"&proto=6"];
 	
 }
 
@@ -216,8 +218,8 @@
 		   length:(unsigned int)secs offsets:(NSArray*)offsets {	
 	
 	
-	NSString *tmp = [NSString stringWithFormat:@"cddb query %08x %i %s %i¥n",
-		discid, tracks, [ [offsets componentsJoinedByString:@" "]
+	NSString *tmp = [NSString stringWithFormat:@"cmd=cddb+query+%08x+%i+%s+%i",
+		discid, tracks, [ [offsets componentsJoinedByString:@"+"]
 		UTF8String], secs];
 		
 	[requests addObject:[NSNumber numberWithInt:QueryRequest] ];
@@ -227,18 +229,48 @@
 - (void)sendRead:(NSString*)discid genre:(NSString*)genre {
 	
 	
-	NSString *tmp = [NSString stringWithFormat:@"cddb read %s %s¥n",
+	NSString *tmp = [NSString stringWithFormat:@"cmd=cddb+read+%s+%s",
 		[genre UTF8String], [discid UTF8String] ];
 	
 	[requests addObject:[NSNumber numberWithInt:ReadRequest] ];
 	[self send:tmp];
 }
 
+-(void) connectionDidFinishLoading:(NSURLConnection *)connection {
+	if (bytesRead > 0) {
+		[self processInput];
+	}
+}
+
+- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
+	[connection release];
+	[readBuffer setLength:0];
+}
+
+- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
+{
+	if (!readBuffer)
+		readBuffer = [ [NSMutableData data] retain];
+	[readBuffer setLength:0];
+	bytesRead = 0;
+}
+
+- (void)connection:(NSURLConnection*)conn didReceiveData:(NSData*)data
+{
+	//readBuffer = (NSMutableData *)data;
+	[readBuffer setData:data];
+	bytesRead = [readBuffer length];
+}
+
 - (void)send:(NSString *)msg {
-	
-	NSData *tmp = [NSData dataWithBytes:[msg UTF8String] 
-		length:[msg lengthOfBytesUsingEncoding:NSUTF8StringEncoding] ];
+	NSString *urlstr = [@"http://freedbtest.dyndns.org/ ̄cddb/cddb.cgi?" stringByAppendingString: msg];
+	urlstr = [urlstr stringByAppendingString: [self makeHandshakeString]];
+	NSURL *url = [ NSURL URLWithString : urlstr ];
+	NSMutableURLRequest *req = [ NSMutableURLRequest requestWithURL : url ];
+	[req setHTTPMethod:@"GET"];
+	[[NSURLConnection alloc] initWithRequest:req delegate:self];
 
+/*
 	// If not connected connect.
 	if (!inputStream) {
 		[self connect];
@@ -268,9 +300,9 @@
 		[sendQueue setData:[sendQueue subdataWithRange:range] ];		
 		[sendQueue resetBytesInRange:range];
 	} 
-	
+*/	
 }
-
+/*
 - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
 	
 	if (aStream == inputStream)
@@ -326,7 +358,7 @@
 		[self processInput];
 	}
 }
-
+*/
 - (void)processInput {
 	
 	if (bytesRead < 3 )
@@ -385,9 +417,8 @@
 		[readBuffer retain];
 	}
 	
-	[self send:@""];
-	
-	bytesRead = [ data lengthOfBytesUsingEncoding:NSUTF8StringEncoding ];
+	//[self send:@""];
+	//bytesRead = [ data lengthOfBytesUsingEncoding:NSUTF8StringEncoding ];
 
 }
 
@@ -555,7 +586,7 @@
 						objectAtIndex:0] intValue];
 	
 }
-
+/*
 - (void)handleWriteEvent:(NSStreamEvent)eventCode {
     
 	switch (eventCode) {
@@ -576,8 +607,8 @@
 		}
     }
 }
-
-- (void)endConnection {
+*/
+/*- (void)endConnection {
 
 	[inputStream close];
 	[inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
@@ -593,6 +624,6 @@
 	[outputStream release];
 	outputStream = nil;
 	
-}
+}*/
 
 @end