I just noticed a problem with the encoding of the artists name int the
sid muscis. They use some special characters like this:
Code:
--------------------
| Title : So Alone |
| Author : Johan Åstrand (Zyron) |
| Released : 1996 Oxsid Planetary |
+------------------------------------------------------+
| Playlist : 1/1 (tune 1/1[1]) |
| Song Length : 03:30 |
+------------------------------------------------------+
Creating audio file, please wait...
2005-11-15 15:28:39.0617 Malformed UTF-8 character (unexpected
non-continuation byte 0x73, immediately after start byte 0xc5) in unpack at
/home/slimserver/Slim/Display/Graphics.pm line 192.
--------------------
I guess I should convert from latin to UTF-8 before assigning the
string to the tags.
I found this code somewhere in the checkins I'll see if that help if I
use it on the strings. Wow it worked. I'm rescanning my entire library
which takes a bit of time. Here's the new and imporved Sid.pm:
Code:
--------------------
package Slim::Formats::Sid;
# SlimServer Copyright (c) 2001-2004 Sean Adams, Slim Devices Inc.
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License,
# version 2.
# Written by WildCoder (who still don't know perl)
# to play C64 Sid musics in slimserver
# Last modification 2005-11-15
use strict;
# Given a file, return a hash of name value pairs,
# where each name is a tag name.
sub getTag {
my $file = shift || "";
my $filesize = -s $file;
$::d_formats && msg( "Opening SID information for $file\n");
# Make sure the file exists.
return undef unless $filesize && -r $file;
$::d_formats && msg( "Reading SID information for $file\n");
my $tags = {};
my $f;
my $signature;
open $f, "<$file" || return undef;
$::d_formats && msg( "Checking SID header for $file\n");
return undef if read($f, $signature, 4) < 4;
return undef if ($signature ne 'PSID');
my $chunkpos = 22;
return undef unless seek($f, $chunkpos, 0);
my $songname;
my $artist;
my $album;
my $year;
my $filer;
return undef if read($f, $songname, 32) < 32;
return undef if read($f, $artist, 32) < 32;
return undef if read($f, $year, 4) < 4;
return undef if read($f, $filer, 1) < 1;
return undef if read($f, $album, 27) < 27;
# Settings that sidplay2 uses to convert the sid tune (matches what's in
convert.conf)
my $endian = 0; # little-endian
my $numChannels = 2; # Stereo.
my $sampleSize = 16;
my $samplesPerSecond = 44100;
my $numSampleFrames = $samplesPerSecond * ((3 * 60)+30); # Default to 3:30
minutes like sidplay2 output
# This tags appears to be the minimum require to get it to work
$tags->{'ENDIAN'} = $endian;
$tags->{'FS'} = $filesize;
$tags->{'CHANNELS'} = $numChannels;
$tags->{'SAMPLESIZE'} = $sampleSize;
$tags->{'SIZE'} = $numSampleFrames * $numChannels * $sampleSize / 8;
$tags->{'OFFSET'} = 0;
$tags->{'RATE'} = $samplesPerSecond;
$tags->{'BITRATE'} = $samplesPerSecond * $numChannels * $sampleSize;
$tags->{'SECS'} = $numSampleFrames / $samplesPerSecond;
$tags->{'BLOCKALIGN'} = $numChannels * $sampleSize / 8;
# These tags just make it look nicer
$tags->{'ALBUM'} = latin1toUTF8 ($album);
$tags->{'GENRE'} = "Computer SID Music";
$tags->{'ARTIST'} = latin1toUTF8 ($artist);
$tags->{'TITLE'} = latin1toUTF8 ($songname);
$tags->{'YEAR'} = $year;
#$tags->{'TRACKNUM'} = "Doubt we'll ever have tracks unless we can track down
some musicdiscs";
return $tags;
}
sub latin1toUTF8 {
my $data = shift;
if ($] > 5.007) {
$data = eval { Encode::encode('utf8', $data, Encode::FB_QUIET()) } || $data;
} else {
$data =~ s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
}
return $data;
}
1;
--------------------
-WildCoder
--
WildCoder
------------------------------------------------------------------------
WildCoder's Profile: http://forums.slimdevices.com/member.php?userid=1827
View this thread: http://forums.slimdevices.com/showthread.php?t=18221
_______________________________________________
unix mailing list
[email protected]
http://lists.slimdevices.com/lists/listinfo/unix