Net-FreeDB

 view release on metacpan or  search on metacpan

FreeDB.pm  view on Meta::CPAN



=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.

FreeDB.pm  view on Meta::CPAN

    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 )