Musorg で日本語 CDDB から楽曲情報取ってくるパッチ書いた
Mac で CDDB から情報を取って来れるいい感じの
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