Net-FreeDB
view release on metacpan or search on metacpan
=head1 NAME
Net::FreeDB - Perl interface to freedb server(s)
=head1 SYNOPSIS
use Net::FreeDB;
$freedb = Net::FreeDB->new();
$discdata = $freedb->getdiscdata('/dev/cdrom');
my $cddb_file_object = $freedb->read('rock', $discdata->{ID});
print $cddb_file_object->id;
=head1 DESCRIPTION
Net::FreeDB was inspired by Net::CDDB. And in-fact
was designed as a replacement in-part by Net::CDDB's
author Jeremy D. Zawodny. Net::FreeDB allows an
oop interface to the freedb server(s) as well as
some basic cdrom functionality like determining
disc ids, track offsets, etc.
machines starting at 0. (Sorry, I may change this at a later time).
So, if you have only 1 cdrom drive then getdiscid(0) would work fine.
getdiscid() returns the discid of the current disc in the given drive.
NOTE: See BUGS
=item get_local_disc_data
Parameters:
getdiscdata($) takes the device you want to use. See getdiscid()
for full description.
getdiscdata() returns a hash of the given disc data as you would
require for a call to query. The returns hash look like:
{
ID => 'd00b3d10',
NUM_TRKS => '3',
TRACKS => [
'150',
'18082',
'29172'
],
SECONDS => '2879'
}
NOTE: A different return type/design may be developed.
=back
=head1 BUGS
The current version of getdiscid() and getdiscdata()
on the Windows platform takes ANY string in a single
cdrom configuration and works fine. That is if you
only have 1 cdrom drive; you can pass in ANY string
and it will still scan that cdrom drive and return
the correct data. If you have more then 1 cdrom drive
giving the correct drive number will return in an
accurate return.
=head1 Resources
The current version of the CDDB Server Protocol can be
FreeDB.xs.linux view on Meta::CPAN
int arg
CODE:
RETVAL = constant(s,len,arg);
OUTPUT:
RETVAL
char*
xs_discid(char* dev)
INIT:
char id[30];
struct discdata data;
CODE:
data = get_disc_id(dev);
POST_CALL:
if (data.num_of_trks == -1) {
RETVAL = "";
} else {
sprintf(id, "%08x", (unsigned int)data.discid);
RETVAL = id;
}
OUTPUT:
RETVAL
SV*
xs_discinfo(char* dev)
INIT:
int i;
char id[30];
struct discdata data;
HV* hash = newHV();
AV* tracks = newAV();
PPCODE:
data = get_disc_id(dev);
for (i = 0; i < (data.num_of_trks); i++) {
av_push(tracks, newSVnv(data.track_offsets[i]));
}
sprintf(id, "%08x", (unsigned int)data.discid);
FreeDB.xs.win32 view on Meta::CPAN
sprintf(id, "%08x", discid(driveNo));
RETVAL = id;
OUTPUT:
RETVAL
SV*
xs_discinfo(int driveNo)
INIT:
int i;
char id[30];
struct discdata data;
HV* hash = newHV();
AV* tracks = newAV();
PPCODE:
data = get_disc_id(driveNo);
for (i = 0; i < (data.num_of_trks); i++) {
av_push(tracks, newSVnv(data.track_offsets[i]));
}
sprintf(id, "%08x", (unsigned int)data.discid);
lib/freebsd.h view on Meta::CPAN
NAME: freebsd.h
FUNCTION: FreeBSD based cddb id generation code
ORIGINALLY CREATED BY: David Shultz
ORIGINALLY CREATED ON: 08/03/2001
ADAPTED BY: Peter Pentchev
ADAPTED ON: 09/28/2005
*********************************************/
#ifndef FREEBSD_H
#define FREEBSD_H
struct discdata {
unsigned long discid;
int num_of_trks;
int track_offsets[100];
int seconds;
};
/*
* The following has been blatantly stolen from FreeBSD 5.4's
* cdcontrol(8) utility.
*/
lib/freebsd.h view on Meta::CPAN
* the length of each track, and a checksum of the string
* that represents the offset of each track.
*
* Args:
* s - Pointer to the curstat_t structure.
*
* Return:
* The integer disc ID.
*/
int
dbprog_discid(int fd, struct discdata *d)
{
struct ioc_toc_header h;
int rc;
int i, ntr,
t = 0,
n = 0;
long block;
u_char m, s, f;
rc = ioctl (fd, CDIOREADTOCHEADER, &h);
lib/freebsd.h view on Meta::CPAN
d->discid = (n % 0xff) << 24 | t << 8 | ntr;
/*
block = ntohl(toc_buffer[ntr - 1].addr.lba);
d->seconds = ((block + 150) & 0xfffff) / 75;
*/
d->seconds = TC_SS(ntr) + TC_MM(ntr) * 60;
fprintf(stderr, "block is %ld, seconds are %ld\n", block, d->seconds);
return (d->discid);
}
struct discdata
get_disc_id(const char *dev)
{
int fd;
struct discdata d;
fd = open(dev, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
memset(&d, 0, sizeof(d));
return (d);
}
dbprog_discid(fd, &d);
close(fd);
return (d);
}
lib/linux.h view on Meta::CPAN
CREATED BY: David Shultz
CREATED ON: 08/03/2001
*********************************************/
#ifndef LINUX_H
#define LINUX_H
struct toc {
int min, sec, frame;
} cdtoc[100];
struct discdata {
unsigned long discid;
int num_of_trks;
int track_offsets[100];
int seconds;
};
unsigned int cddb_sum(int n)
{
unsigned int ret;
lib/linux.h view on Meta::CPAN
while (i < tot_trks) {
n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
i++;
}
t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
((cdtoc[0].min * 60) + cdtoc[0].sec);
return ((n % 0xff) << 24 | t << 8 | tot_trks);
}
struct discdata get_disc_id(char* dev)
{
struct discdata data;
int i;
data.num_of_trks = read_toc(dev);
if (data.num_of_trks == -1) {
return data;
}
data.discid = cddb_discid(data.num_of_trks);
lib/win32.h view on Meta::CPAN
int iOSVer;
DWORD (*GetASPI32SupportInfo)(void);
DWORD (*SendASPI32Command)(LPSRB);
int numDrives;
TOC toc;
DRIVELIST driveList;
HINSTANCE hDll;
struct discdata {
unsigned long discid;
int num_of_trks;
int track_offsets[100];
int seconds;
};
// Function defs
unsigned long CDDBSum(unsigned long);
static int getNumAdapters(void);
static int aspiGetNumDrives(void);
lib/win32.h view on Meta::CPAN
while(n > 0) {
retVal += (n % 10);
n /= 10;
}
return retVal;
}
void* genCddbQuery(TOC* toc) {
struct discdata* cd = (struct discdata*)malloc(sizeof(struct discdata));
int numTracks, i, ofs;
TOCTRACK *t1;
if (!toc)
return cd;
numTracks = (int)(toc->lastTrack - toc->firstTrack + 1);
// cddbid
cd->discid = genCddbId(toc);
lib/win32.h view on Meta::CPAN
if (os.dwMinorVersion == 0)
return OS_WIN95;
else
return OS_WIN98;
}
return OS_UNKNOWN;
}
unsigned long discid(int drive) {
struct discdata* cd;
int i, numTracks;
unsigned long id;
i = initTool();
getNumDrives();
ZeroMemory(&toc, sizeof(toc));
readTOC(drive, &toc);
if (!toc.firstTrack && !toc.lastTrack)
numTracks = 0;
lib/win32.h view on Meta::CPAN
if (numTracks > 0) {
// calculate the cddbId
cd = genCddbQuery(&toc);
id = cd->discid;
free(cd);
}
return id;
}
struct discdata get_disc_id(int drive) {
struct discdata* cd;
struct discdata data;
int i, numTracks;
unsigned long id;
i = initTool();
getNumDrives();
ZeroMemory(&toc, sizeof(toc));
readTOC(drive, &toc);
if (!toc.firstTrack && !toc.lastTrack) {
static char foo[2048];
numTracks = 0;
( run in 0.421 second using v1.01-cache-2.11-cpan-454fe037f31 )