annotate stream/stream_cddb.c @ 25779:ad419ff363d7

Simplify and keep terminating end-of-line
author reimar
date Sat, 19 Jan 2008 16:57:53 +0000
parents 15c5da485a77
children 8c53d40799e1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
1 /*
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
2 * CDDB HTTP protocol
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
3 * by Bertrand Baudet <bertrand_baudet@yahoo.com>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
4 * (C) 2002, MPlayer team.
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
5 *
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
6 * Implementation follow the freedb.howto1.06.txt specification
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
7 * from http://freedb.freedb.org
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
8 *
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
9 * discid computation by Jeremy D. Zawodny
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
10 * Copyright (c) 1998-2000 Jeremy D. Zawodny <Jeremy@Zawodny.com>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
11 * Code release under GPL
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
12 *
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
13 */
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
14
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
15 #include "config.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
16
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
17 #include <stdio.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
18 #include <stdlib.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
19 #include <fcntl.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
20 #include <stdarg.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
21 #include <errno.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
22 #include <unistd.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
23 #include <string.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
24 #ifdef WIN32
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
25 #ifdef __MINGW32__
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
26 #define mkdir(a,b) mkdir(a)
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
27 #endif
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
28 #include <windows.h>
17446
9604131f9196 Cygwin compilation fix
diego
parents: 17044
diff changeset
29 #ifdef HAVE_WINSOCK2
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
30 #include <winsock2.h>
17446
9604131f9196 Cygwin compilation fix
diego
parents: 17044
diff changeset
31 #endif
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
32 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
33 #include <netdb.h>
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
34 #include <sys/ioctl.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
35 #endif
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
36 #include <sys/types.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
37 #include <sys/stat.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
38
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
39 #include "mp_msg.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
40 #include "help_mp.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
41
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
42 #if defined(__linux__)
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
43 #include <linux/cdrom.h>
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
44 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
45 #include <sys/cdio.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
46 #elif defined(WIN32)
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
47 #include <ddk/ntddcdrm.h>
17044
cb84dbc30d7b When it comes to CD/DVD handling bsdi has a linux CD/DVD compatibility
diego
parents: 17012
diff changeset
48 #elif (__bsdi__)
cb84dbc30d7b When it comes to CD/DVD handling bsdi has a linux CD/DVD compatibility
diego
parents: 17012
diff changeset
49 #include <dvd.h>
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
50 #elif defined(__APPLE__) || defined(__DARWIN__)
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
51 #include <IOKit/storage/IOCDTypes.h>
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
52 #include <IOKit/storage/IOCDMediaBSDClient.h>
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
53 #include "mpbswap.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
54 #endif
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
55
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
56 #include "cdd.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16967
diff changeset
57 #include "version.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
58 #include "stream.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
59 #include "network.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
60
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
61 #define DEFAULT_FREEDB_SERVER "freedb.freedb.org"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
62 #define DEFAULT_CACHE_DIR "/.cddb/"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
63
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
64 stream_t* open_cdda(char *dev, char *track);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
65
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
66 static cd_toc_t cdtoc[100];
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
67 static int cdtoc_last_track;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
68
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
69 int
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
70 read_toc(const char *dev) {
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
71 int first = 0, last = -1;
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
72 int i;
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
73 #ifdef WIN32
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
74 HANDLE drive;
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
75 DWORD r;
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
76 CDROM_TOC toc;
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
77 char device[10];
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
78
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
79 sprintf(device, "\\\\.\\%s", dev);
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
80 drive = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
81
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
82 if(!DeviceIoControl(drive, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(CDROM_TOC), &r, 0)) {
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
83 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
84 return 0;
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
85 }
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
86
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
87 first = toc.FirstTrack - 1; last = toc.LastTrack;
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
88 for (i = first; i <= last; i++) {
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
89 cdtoc[i].min = toc.TrackData[i].Address[1];
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
90 cdtoc[i].sec = toc.TrackData[i].Address[2];
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
91 cdtoc[i].frame = toc.TrackData[i].Address[3];
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
92 }
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
93 CloseHandle(drive);
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
94
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
95 #else
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
96 int drive;
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
97 drive = open(dev, O_RDONLY | O_NONBLOCK);
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
98 if( drive<0 ) {
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
99 return drive;
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
100 }
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
101
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
102 #if defined(__linux__) || defined(__bsdi__)
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
103 {
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
104 struct cdrom_tochdr tochdr;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
105 ioctl(drive, CDROMREADTOCHDR, &tochdr);
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
106 first = tochdr.cdth_trk0 - 1; last = tochdr.cdth_trk1;
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
107 }
20583
47d5d63e8214 Avoid code duplication for "last" toc entry.
reimar
parents: 20582
diff changeset
108 for (i = first; i <= last; i++) {
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
109 struct cdrom_tocentry tocentry;
23269
6606c4f5c78c Fix track info being read for the wrong track introduced in r20598
reimar
parents: 23268
diff changeset
110 tocentry.cdte_track = (i == last) ? 0xAA : i + 1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
111 tocentry.cdte_format = CDROM_MSF;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
112 ioctl(drive, CDROMREADTOCENTRY, &tocentry);
20582
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
113 cdtoc[i].min = tocentry.cdte_addr.msf.minute;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
114 cdtoc[i].sec = tocentry.cdte_addr.msf.second;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
115 cdtoc[i].frame = tocentry.cdte_addr.msf.frame;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
116 }
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
117 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
118 {
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
119 struct ioc_toc_header tochdr;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
120 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
23268
686107ddaab5 Missing -1 in the FreeBSD code to get the first CD track number
reimar
parents: 21848
diff changeset
121 first = tochdr.starting_track - 1; last = tochdr.ending_track;
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
122 }
20583
47d5d63e8214 Avoid code duplication for "last" toc entry.
reimar
parents: 20582
diff changeset
123 for (i = first; i <= last; i++) {
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
124 struct ioc_read_toc_single_entry tocentry;
23269
6606c4f5c78c Fix track info being read for the wrong track introduced in r20598
reimar
parents: 23268
diff changeset
125 tocentry.track = (i == last) ? 0xAA : i + 1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
126 tocentry.address_format = CD_MSF_FORMAT;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
127 ioctl(drive, CDIOREADTOCENTRY, &tocentry);
20582
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
128 cdtoc[i].min = tocentry.entry.addr.msf.minute;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
129 cdtoc[i].sec = tocentry.entry.addr.msf.second;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
130 cdtoc[i].frame = tocentry.entry.addr.msf.frame;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
131 }
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
132 #elif defined(__NetBSD__) || defined(__OpenBSD__)
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
133 {
8609
1d98280b9ad1 The following patch allows the MPlayer "cdparanoia" support to work on
arpi
parents: 8557
diff changeset
134 struct ioc_toc_header tochdr;
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
135 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
136 first = tochdr.starting_track - 1; last = tochdr.ending_track;
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
137 }
20583
47d5d63e8214 Avoid code duplication for "last" toc entry.
reimar
parents: 20582
diff changeset
138 for (i = first; i <= last; i++) {
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
139 struct ioc_read_toc_entry tocentry;
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
140 struct cd_toc_entry toc_buffer;
23269
6606c4f5c78c Fix track info being read for the wrong track introduced in r20598
reimar
parents: 23268
diff changeset
141 tocentry.starting_track = (i == last) ? 0xAA : i + 1;
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
142 tocentry.address_format = CD_MSF_FORMAT;
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
143 tocentry.data = &toc_buffer;
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
144 tocentry.data_len = sizeof(toc_buffer);
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
145 ioctl(drive, CDIOREADTOCENTRYS, &tocentry);
20582
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
146 cdtoc[i].min = toc_buffer.addr.msf.minute;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
147 cdtoc[i].sec = toc_buffer.addr.msf.second;
04b535afeaea simplify/unify read_toc
reimar
parents: 20581
diff changeset
148 cdtoc[i].frame = toc_buffer.addr.msf.frame;
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
149 }
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
150 #elif defined(__APPLE__) || defined(__DARWIN__)
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
151 {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
152 dk_cd_read_toc_t tochdr;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
153 uint8_t buf[4];
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
154 uint8_t buf2[100 * sizeof(CDTOCDescriptor) + sizeof(CDTOC)];
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
155 memset(&tochdr, 0, sizeof(tochdr));
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
156 tochdr.bufferLength = sizeof(buf);
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
157 tochdr.buffer = &buf;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
158 if (!ioctl(drive, DKIOCCDREADTOC, &tochdr)
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
159 && tochdr.bufferLength == sizeof(buf)) {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
160 first = buf[2] - 1;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
161 last = buf[3];
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
162 }
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
163 if (last >= 0) {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
164 memset(&tochdr, 0, sizeof(tochdr));
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
165 tochdr.bufferLength = sizeof(buf2);
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
166 tochdr.buffer = &buf2;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
167 tochdr.format = kCDTOCFormatTOC;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
168 if (ioctl(drive, DKIOCCDREADTOC, &tochdr)
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
169 || tochdr.bufferLength < sizeof(CDTOC))
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
170 last = -1;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
171 }
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
172 if (last >= 0) {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
173 CDTOC *cdToc = (CDTOC *)buf2;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
174 CDTrackInfo lastTrack;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
175 dk_cd_read_track_info_t trackInfoParams;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
176 for (i = first; i < last; ++i) {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
177 CDMSF msf = CDConvertTrackNumberToMSF(i + 1, cdToc);
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
178 cdtoc[i].min = msf.minute;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
179 cdtoc[i].sec = msf.second;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
180 cdtoc[i].frame = msf.frame;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
181 }
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
182 memset(&trackInfoParams, 0, sizeof(trackInfoParams));
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
183 trackInfoParams.addressType = kCDTrackInfoAddressTypeTrackNumber;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
184 trackInfoParams.bufferLength = sizeof(lastTrack);
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
185 trackInfoParams.address = last;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
186 trackInfoParams.buffer = &lastTrack;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
187 if (!ioctl(drive, DKIOCCDREADTRACKINFO, &trackInfoParams)) {
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
188 CDMSF msf = CDConvertLBAToMSF(be2me_32(lastTrack.trackStartAddress)
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
189 + be2me_32(lastTrack.trackSize));
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
190 cdtoc[last].min = msf.minute;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
191 cdtoc[last].sec = msf.second;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
192 cdtoc[last].frame = msf.frame;
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
193 }
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
194 }
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
195 }
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
196 #endif
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
197 close(drive);
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
198 #endif
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
199 for (i = first; i <= last; i++)
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
200 cdtoc[i].frame += (cdtoc[i].min * 60 + cdtoc[i].sec) * 75;
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
201 return last;
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
202 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
203
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
204 /**
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
205 \brief Reads TOC from CD in the given device and prints the number of tracks
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
206 and the length of each track in minute:second:frame format.
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
207 \param *dev the device to analyse
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
208 \return if the command line -identify is given, returns the last track of
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
209 the TOC or -1 if the TOC can't be read,
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
210 otherwise just returns 0 and let cddb_resolve the TOC
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
211 */
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
212 int cdd_identify(const char *dev)
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
213 {
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
214 cdtoc_last_track = 0;
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18176
diff changeset
215 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO))
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
216 {
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
217 int i, min, sec, frame;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
218 cdtoc_last_track = read_toc(dev);
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
219 if (cdtoc_last_track < 0) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
220 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice, dev);
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
221 return -1;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
222 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
223 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CDDA_TRACKS=%d\n", cdtoc_last_track);
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
224 for (i = 1; i <= cdtoc_last_track; i++)
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
225 {
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
226 frame = cdtoc[i].frame - cdtoc[i-1].frame;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
227 sec = frame / 75;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
228 frame -= sec * 75;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
229 min = sec / 60;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
230 sec -= min * 60;
18237
4231482179b6 Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents: 18176
diff changeset
231 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK_%d_MSF=%02d:%02d:%02d\n", i, min, sec, frame);
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
232 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
233 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
234 return cdtoc_last_track;
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
235 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
236
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
237 unsigned int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
238 cddb_sum(int n) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
239 unsigned int ret;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
240
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
241 ret = 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
242 while (n > 0) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
243 ret += (n % 10);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
244 n /= 10;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
245 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
246 return ret;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
247 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
248
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
249 unsigned long
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
250 cddb_discid(int tot_trks) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
251 unsigned int i, t = 0, n = 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
252
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
253 i = 0;
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
254 while (i < (unsigned int)tot_trks) {
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
255 n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
256 i++;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
257 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
258 t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
259 ((cdtoc[0].min * 60) + cdtoc[0].sec);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
260 return ((n % 0xff) << 24 | t << 8 | tot_trks);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
261 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
262
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
263
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
264
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
265 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
266 cddb_http_request(char *command, int (*reply_parser)(HTTP_header_t*,cddb_data_t*), cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
267 char request[4096];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
268 int fd, ret = 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
269 URL_t *url;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
270 HTTP_header_t *http_hdr;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
271
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
272 if( reply_parser==NULL || command==NULL || cddb_data==NULL ) return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
273
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
274 sprintf( request, "http://%s/~cddb/cddb.cgi?cmd=%s%s&proto=%d", cddb_data->freedb_server, command, cddb_data->cddb_hello, cddb_data->freedb_proto_level );
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17446
diff changeset
275 mp_msg(MSGT_OPEN, MSGL_INFO,"Request[%s]\n", request );
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
276
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
277 url = url_new(request);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
278 if( url==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
279 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NotAValidURL);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
280 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
281 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
282
11965
3d75bcc28231 enable seeking in http streams
attila
parents: 10121
diff changeset
283 fd = http_send_request(url,0);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
284 if( fd<0 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
285 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToSendHTTPRequest);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
286 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
287 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
288
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
289 http_hdr = http_read_response( fd );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
290 if( http_hdr==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
291 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadHTTPResponse);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
292 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
293 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
294
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
295 http_debug_hdr(http_hdr);
18176
f72bc5754209 Part3 of Otvos Attila's oattila AT chello-hu mp_msg changes, with lots of modifications as usual
reynaldo
parents: 17446
diff changeset
296 mp_msg(MSGT_OPEN, MSGL_INFO,"body=[%s]\n", http_hdr->body );
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
297
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
298 switch(http_hdr->status_code) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
299 case 200:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
300 ret = reply_parser(http_hdr, cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
301 break;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
302 case 400:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
303 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorNOTFOUND);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
304 break;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
305 default:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
306 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorUnknown);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
307 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
308
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
309 http_free( http_hdr );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
310 url_free( url );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
311
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
312 return ret;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
313 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
314
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
315 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
316 cddb_read_cache(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
317 char file_name[100];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
318 struct stat stats;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
319 int file_fd, ret;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
320 size_t file_size;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
321
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
322 if( cddb_data==NULL || cddb_data->cache_dir==NULL ) return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
323
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
324 sprintf( file_name, "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
325
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
326 file_fd = open(file_name, O_RDONLY
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
327 #ifdef WIN32
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
328 | O_BINARY
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
329 #endif
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
330 );
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
331 if( file_fd<0 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
332 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCacheFound);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
333 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
334 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
335
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
336 ret = fstat( file_fd, &stats );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
337 if( ret<0 ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
338 perror("fstat");
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
339 file_size = 4096;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
340 } else {
25777
1d16b891d440 Cached file must be 0-terminated since we use string processing functions on it
reimar
parents: 25776
diff changeset
341 file_size = stats.st_size < UINT_MAX ? stats.st_size : UINT_MAX - 1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
342 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
343
25777
1d16b891d440 Cached file must be 0-terminated since we use string processing functions on it
reimar
parents: 25776
diff changeset
344 cddb_data->xmcd_file = malloc(file_size+1);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
345 if( cddb_data->xmcd_file==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
346 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
347 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
348 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
349 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
350 cddb_data->xmcd_file_size = read(file_fd, cddb_data->xmcd_file, file_size);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
351 if( cddb_data->xmcd_file_size!=file_size ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
352 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenRead);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
353 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
354 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
355 }
25777
1d16b891d440 Cached file must be 0-terminated since we use string processing functions on it
reimar
parents: 25776
diff changeset
356 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
357
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
358 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
359
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
360 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
361 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
362
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
363 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
364 cddb_write_cache(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
365 // We have the file, save it for cache.
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
366 struct stat file_stat;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
367 char file_name[100];
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
368 int file_fd, ret;
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
369 int wrote=0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
370
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
371 if( cddb_data==NULL || cddb_data->cache_dir==NULL ) return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
372
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
373 // Check if the CDDB cache dir exist
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
374 ret = stat( cddb_data->cache_dir, &file_stat );
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
375 if( ret<0 ) {
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
376 // Directory not present, create it.
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
377 ret = mkdir( cddb_data->cache_dir, 0755 );
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
378 #ifdef __MINGW32__
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
379 if( ret<0 && errno != EEXIST ) {
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
380 #else
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
381 if( ret<0 ) {
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
382 #endif
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
383 perror("mkdir");
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
384 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToCreateDirectory, cddb_data->cache_dir);
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
385 return -1;
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
386 }
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
387 }
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
388
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
389 sprintf( file_name, "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id );
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
390
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
391 file_fd = creat(file_name, S_IREAD|S_IWRITE);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
392 if( file_fd<0 ) {
7721
765afc1fcd67 Create the ~/.cddb directory if not present.
bertrand
parents: 7431
diff changeset
393 perror("create");
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
394 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
395 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
396
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
397 wrote = write(file_fd, cddb_data->xmcd_file, cddb_data->xmcd_file_size);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
398 if( wrote<0 ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
399 perror("write");
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
400 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
401 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
402 }
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
403 if( (unsigned int)wrote!=cddb_data->xmcd_file_size ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
404 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenWritten);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
405 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
406 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
407 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
408
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
409 close(file_fd);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
410
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
411 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
412 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
413
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
414 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
415 cddb_read_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
416 unsigned long disc_id;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
417 char category[100];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
418 char *ptr=NULL, *ptr2=NULL;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
419 int ret, status;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
420
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
421 if( http_hdr==NULL || cddb_data==NULL ) return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
422
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
423 ret = sscanf( http_hdr->body, "%d ", &status);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
424 if( ret!=1 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
425 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
426 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
427 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
428
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
429 switch(status) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
430 case 210:
23452
3e676c9e1e35 Avoiding sscanf in cddb support reading more data with %s than buffer size
reimar
parents: 23269
diff changeset
431 ret = sscanf( http_hdr->body, "%d %99s %08lx", &status, category, &disc_id);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
432 if( ret!=3 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
433 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
434 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
435 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
436 // Check if it's a xmcd database file
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
437 ptr = strstr(http_hdr->body, "# xmcd");
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
438 if( ptr==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
439 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_InvalidXMCDDatabaseReturned);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
440 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
441 }
25778
15c5da485a77 Remove a broken and useless hack to avoid a memcpy
reimar
parents: 25777
diff changeset
442 ptr = strdup(ptr);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
443 // Ok found the beginning of the file
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
444 // look for the end
25779
ad419ff363d7 Simplify and keep terminating end-of-line
reimar
parents: 25778
diff changeset
445 ptr2 = strstr(ptr, "\n.\r\n");
ad419ff363d7 Simplify and keep terminating end-of-line
reimar
parents: 25778
diff changeset
446 if (!ptr2)
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
447 ptr2 = strstr(ptr, "\n.\n");
25779
ad419ff363d7 Simplify and keep terminating end-of-line
reimar
parents: 25778
diff changeset
448 if (ptr2) ptr2++;
ad419ff363d7 Simplify and keep terminating end-of-line
reimar
parents: 25778
diff changeset
449 else {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
450 mp_msg(MSGT_DEMUX, MSGL_FIXME, "Unable to find '.'\n");
8557
97cf659a4c38 - fixed uninitialized offsets[]
arpi
parents: 7953
diff changeset
451 ptr2=ptr+strlen(ptr); //return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
452 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
453 // Ok found the end
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
454 // do a sanity check
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7746
diff changeset
455 if( http_hdr->body_size<(unsigned int)(ptr2-ptr) ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
456 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnexpectedFIXME);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
457 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
458 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
459 cddb_data->xmcd_file = ptr;
25776
cf1d3164d30c Make sure we do not write the terminating 0 out of bounds
reimar
parents: 25393
diff changeset
460 cddb_data->xmcd_file_size = ptr2-ptr;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
461 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = '\0';
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
462 return cddb_write_cache(cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
463 default:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
464 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
465 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
466 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
467 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
468
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
469 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
470 cddb_request_titles(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
471 char command[1024];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
472 sprintf( command, "cddb+read+%s+%08lx", cddb_data->category, cddb_data->disc_id);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
473 return cddb_http_request(command, cddb_read_parse, cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
474 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
475
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
476 int
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
477 cddb_parse_matches_list(HTTP_header_t *http_hdr, cddb_data_t *cddb_data) {
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
478 char album_title[100];
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
479 char *ptr = NULL;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
480 int ret;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
481
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
482 ptr = strstr(http_hdr->body, "\n");
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
483 if( ptr==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
484 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnableToFindEOL);
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
485 return -1;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
486 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
487 ptr++;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
488 // We have a list of exact/inexact matches, so which one do we use?
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
489 // So let's take the first one.
23452
3e676c9e1e35 Avoiding sscanf in cddb support reading more data with %s than buffer size
reimar
parents: 23269
diff changeset
490 ret = sscanf(ptr, "%99s %08lx %99s", cddb_data->category, &(cddb_data->disc_id), album_title);
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
491 if( ret!=3 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
492 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
493 return -1;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
494 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
495 ptr = strstr(http_hdr->body, album_title);
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
496 if( ptr!=NULL ) {
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
497 char *ptr2;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
498 int len;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
499 ptr2 = strstr(ptr, "\n");
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
500 if( ptr2==NULL ) {
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
501 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
502 } else {
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
503 len = ptr2-ptr+1;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
504 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
505 strncpy(album_title, ptr, len);
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
506 album_title[len-2]='\0';
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
507 }
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
508 mp_msg(MSGT_DEMUX, MSGL_STATUS, MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle, album_title);
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
509 return 0;
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
510 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
511
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
512 int
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
513 cddb_query_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
514 char album_title[100];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
515 char *ptr = NULL;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
516 int ret, status;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
517
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
518 ret = sscanf( http_hdr->body, "%d ", &status);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
519 if( ret!=1 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
520 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
521 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
522 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
523
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
524 switch(status) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
525 case 200:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
526 // Found exact match
23452
3e676c9e1e35 Avoiding sscanf in cddb support reading more data with %s than buffer size
reimar
parents: 23269
diff changeset
527 ret = sscanf(http_hdr->body, "%d %99s %08lx %99s", &status, cddb_data->category, &(cddb_data->disc_id), album_title);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
528 if( ret!=4 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
529 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
530 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
531 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
532 ptr = strstr(http_hdr->body, album_title);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
533 if( ptr!=NULL ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
534 char *ptr2;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
535 int len;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
536 ptr2 = strstr(ptr, "\n");
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
537 if( ptr2==NULL ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
538 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
539 } else {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
540 len = ptr2-ptr+1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
541 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
542 strncpy(album_title, ptr, len);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
543 album_title[len-2]='\0';
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
544 }
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
545 mp_msg(MSGT_DEMUX, MSGL_STATUS, MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle, album_title);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
546 return cddb_request_titles(cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
547 case 202:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
548 // No match found
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
549 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_AlbumNotFound);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
550 break;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
551 case 210:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
552 // Found exact matches, list follows
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
553 cddb_parse_matches_list(http_hdr, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
554 return cddb_request_titles(cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
555 /*
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
556 body=[210 Found exact matches, list follows (until terminating `.')
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
557 misc c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
558 rock c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
559 blues c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
560 .]
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
561 */
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
562 case 211:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
563 // Found inexact matches, list follows
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
564 cddb_parse_matches_list(http_hdr, cddb_data);
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
565 return cddb_request_titles(cddb_data);
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
566 case 500:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
567 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_ServerReturnsCommandSyntaxErr);
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
568 break;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
569 default:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
570 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
571 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
572 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
573 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
574
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
575 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
576 cddb_proto_level_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
577 int max;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
578 int ret, status;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
579 char *ptr;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
580
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
581 ret = sscanf( http_hdr->body, "%d ", &status);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
582 if( ret!=1 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
583 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
584 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
585 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
586
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
587 switch(status) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
588 case 210:
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
589 ptr = strstr(http_hdr->body, "max proto:");
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
590 if( ptr==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
591 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
592 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
593 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
594 ret = sscanf(ptr, "max proto: %d", &max);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
595 if( ret!=1 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
596 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
597 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
598 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
599 cddb_data->freedb_proto_level = max;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
600 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
601 default:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
602 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
603 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
604 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
605 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
606
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
607 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
608 cddb_get_proto_level(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
609 return cddb_http_request("stat", cddb_proto_level_parse, cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
610 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
611
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
612 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
613 cddb_freedb_sites_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
614 int ret, status;
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
615
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
616 ret = sscanf( http_hdr->body, "%d ", &status);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
617 if( ret!=1 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
618 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
619 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
620 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
621
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
622 switch(status) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
623 case 210:
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
624 // TODO: Parse the sites
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
625 ret = cddb_data->anonymous; // For gcc complaining about unused parameter.
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
626 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
627 case 401:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
628 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_NoSitesInfoAvailable);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
629 break;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
630 default:
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
631 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
632 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
633 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
634 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
635
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
636 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
637 cddb_get_freedb_sites(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
638 return cddb_http_request("sites", cddb_freedb_sites_parse, cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
639 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
640
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
641 void
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
642 cddb_create_hello(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
643 char host_name[51];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
644 char *user_name;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
645
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
646 if( cddb_data->anonymous ) { // Default is anonymous
23734
acfe034e5386 ISO8859-1 --> UTF-8
diego
parents: 23452
diff changeset
647 /* Note from Eduardo Pérez Ureta <eperez@it.uc3m.es> :
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
648 * We don't send current user/host name in hello to prevent spam.
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
649 * Software that sends this is considered spyware
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
650 * that most people don't like.
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
651 */
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
652 user_name = "anonymous";
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
653 strcpy(host_name, "localhost");
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
654 } else {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
655 if( gethostname(host_name, 50)<0 ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
656 strcpy(host_name, "localhost");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
657 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
658 user_name = getenv("LOGNAME");
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
659 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
660 sprintf( cddb_data->cddb_hello, "&hello=%s+%s+%s+%s", user_name, host_name, "MPlayer", VERSION );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
661 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
662
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
663 int
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
664 cddb_retrieve(cddb_data_t *cddb_data) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
665 char offsets[1024], command[1024];
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
666 char *ptr;
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
667 unsigned int i, time_len;
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
668 int ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
669
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
670 ptr = offsets;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
671 for( i=0; i<cddb_data->tracks ; i++ ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
672 ptr += sprintf(ptr, "%d+", cdtoc[i].frame );
12289
e197979a0883 potentially exploitable buffer overflow with maliciously crafted cd toc
rfelker
parents: 11965
diff changeset
673 if (ptr-offsets > sizeof offsets - 40) break;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
674 }
8557
97cf659a4c38 - fixed uninitialized offsets[]
arpi
parents: 7953
diff changeset
675 ptr[0]=0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
676 time_len = (cdtoc[cddb_data->tracks].frame)/75;
8557
97cf659a4c38 - fixed uninitialized offsets[]
arpi
parents: 7953
diff changeset
677
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
678 cddb_data->freedb_server = DEFAULT_FREEDB_SERVER;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
679 cddb_data->freedb_proto_level = 1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
680 cddb_data->xmcd_file = NULL;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
681
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
682 cddb_create_hello(cddb_data);
6475
837ca6fd4adf Checked the return value when retrieving the protocol level.
bertrand
parents: 6474
diff changeset
683 if( cddb_get_proto_level(cddb_data)<0 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
684 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToGetProtocolLevel);
6475
837ca6fd4adf Checked the return value when retrieving the protocol level.
bertrand
parents: 6474
diff changeset
685 return -1;
837ca6fd4adf Checked the return value when retrieving the protocol level.
bertrand
parents: 6474
diff changeset
686 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
687
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
688 //cddb_get_freedb_sites(&cddb_data);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
689
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
690 sprintf(command, "cddb+query+%08lx+%d+%s%d", cddb_data->disc_id, cddb_data->tracks, offsets, time_len );
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
691 ret = cddb_http_request(command, cddb_query_parse, cddb_data);
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
692 if( ret<0 ) return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
693
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
694 if( cddb_data->cache_dir!=NULL ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
695 free(cddb_data->cache_dir);
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
696 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
697 return 0;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
698 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
699
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
700 int
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
701 cddb_resolve(const char *dev, char **xmcd_file) {
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
702 char cddb_cache_dir[] = DEFAULT_CACHE_DIR;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
703 char *home_dir = NULL;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
704 cddb_data_t cddb_data;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
705
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
706 if (cdtoc_last_track <= 0)
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
707 {
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
708 cdtoc_last_track = read_toc(dev);
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
709 if (cdtoc_last_track < 0) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
710 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice, dev);
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
711 return -1;
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
712 }
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
713 }
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
714 cddb_data.tracks = cdtoc_last_track;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
715 cddb_data.disc_id = cddb_discid(cddb_data.tracks);
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
716 cddb_data.anonymous = 1; // Don't send user info by default
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
717
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
718 // Check if there is a CD in the drive
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
719 // FIXME: That's not really a good way to check
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
720 if( cddb_data.disc_id==0 ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
721 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCDInDrive);
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
722 return -1;
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
723 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
724
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
725 home_dir = getenv("HOME");
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
726 #ifdef __MINGW32__
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
727 if( home_dir==NULL ) home_dir = getenv("USERPROFILE");
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
728 if( home_dir==NULL ) home_dir = getenv("HOMEPATH");
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
729 // Last resort, store the cddb cache in the mplayer directory
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
730 if( home_dir==NULL ) home_dir = (char *)get_path("");
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
731 #endif
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
732 if( home_dir==NULL ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
733 cddb_data.cache_dir = NULL;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
734 } else {
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
735 cddb_data.cache_dir = malloc(strlen(home_dir)+strlen(cddb_cache_dir)+1);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
736 if( cddb_data.cache_dir==NULL ) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
737 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
738 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
739 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
740 sprintf(cddb_data.cache_dir, "%s%s", home_dir, cddb_cache_dir );
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
741 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
742
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
743 // Check for a cached file
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
744 if( cddb_read_cache(&cddb_data)<0 ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
745 // No Cache found
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
746 if( cddb_retrieve(&cddb_data)<0 ) {
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
747 return -1;
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
748 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
749 }
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
750
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
751 if( cddb_data.xmcd_file!=NULL ) {
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
752 // printf("%s\n", cddb_data.xmcd_file );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
753 *xmcd_file = cddb_data.xmcd_file;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
754 return 0;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
755 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
756
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
757 return -1;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
758 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
759
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
760 /*******************************************************************************************************************
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
761 *
7431
e46eeafcd4df Moved all the cdinfo specific from cddb to a standalone file(cdinfo.c), so
bertrand
parents: 7269
diff changeset
762 * xmcd parser
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
763 *
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
764 *******************************************************************************************************************/
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
765 char*
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
766 xmcd_parse_dtitle(cd_info_t *cd_info, char *line) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
767 char *ptr, *album;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
768 ptr = strstr(line, "DTITLE=");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
769 if( ptr!=NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
770 ptr += 7;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
771 album = strstr(ptr, "/");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
772 if( album==NULL ) return NULL;
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
773 cd_info->album = malloc(strlen(album+2)+1);
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
774 if( cd_info->album==NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
775 return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
776 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
777 strcpy( cd_info->album, album+2 );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
778 album--;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
779 album[0] = '\0';
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
780 cd_info->artist = malloc(strlen(ptr)+1);
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
781 if( cd_info->artist==NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
782 return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
783 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
784 strcpy( cd_info->artist, ptr );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
785 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
786 return ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
787 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
788
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
789 char*
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
790 xmcd_parse_dgenre(cd_info_t *cd_info, char *line) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
791 char *ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
792 ptr = strstr(line, "DGENRE=");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
793 if( ptr!=NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
794 ptr += 7;
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
795 cd_info->genre = malloc(strlen(ptr)+1);
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
796 if( cd_info->genre==NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
797 return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
798 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
799 strcpy( cd_info->genre, ptr );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
800 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
801 return ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
802 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
803
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
804 char*
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
805 xmcd_parse_ttitle(cd_info_t *cd_info, char *line) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
806 unsigned int track_nb;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
807 unsigned long sec, off;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
808 char *ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
809 ptr = strstr(line, "TTITLE");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
810 if( ptr!=NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
811 ptr += 6;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
812 // Here we point to the track number
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
813 track_nb = atoi(ptr);
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
814 ptr = strstr(ptr, "=");
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
815 if( ptr==NULL ) return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
816 ptr++;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
817
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
818 sec = cdtoc[track_nb].frame;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
819 off = cdtoc[track_nb+1].frame-sec+1;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
820
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
821 cd_info_add_track( cd_info, ptr, track_nb+1, (unsigned int)(off/(60*75)), (unsigned int)((off/75)%60), (unsigned int)(off%75), sec, off );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
822 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
823 return ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
824 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
825
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
826 cd_info_t*
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
827 cddb_parse_xmcd(char *xmcd_file) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
828 cd_info_t *cd_info = NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
829 int length, pos = 0;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
830 char *ptr, *ptr2;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
831 unsigned int audiolen;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
832 if( xmcd_file==NULL ) return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
833
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
834 cd_info = cd_info_new();
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
835 if( cd_info==NULL ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
836 return NULL;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
837 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
838
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
839 length = strlen(xmcd_file);
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
840 ptr = xmcd_file;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
841 while( ptr!=NULL && pos<length ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
842 // Read a line
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
843 ptr2 = ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
844 while( ptr2[0]!='\0' && ptr2[0]!='\r' && ptr2[0]!='\n' ) ptr2++;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
845 if( ptr2[0]=='\0' ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
846 break;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
847 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
848 ptr2[0] = '\0';
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
849 // Ignore comments
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
850 if( ptr[0]!='#' ) {
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
851 // Search for the album title
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
852 if( xmcd_parse_dtitle(cd_info, ptr) );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
853 // Search for the genre
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
854 else if( xmcd_parse_dgenre(cd_info, ptr) );
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
855 // Search for a track title
7953
60624e692b95 GCC warning fixes
bertrand
parents: 7746
diff changeset
856 else if( xmcd_parse_ttitle(cd_info, ptr) ) audiolen++; // <-- audiolen++ to shut up gcc warning
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
857 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
858 if( ptr2[1]=='\n' ) ptr2++;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
859 pos = (ptr2+1)-ptr;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
860 ptr = ptr2+1;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
861 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
862
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
863 audiolen = cdtoc[cd_info->nb_tracks].frame-cdtoc[0].frame;
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
864 cd_info->min = (unsigned int)(audiolen/(60*75));
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
865 cd_info->sec = (unsigned int)((audiolen/75)%60);
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
866 cd_info->msec = (unsigned int)(audiolen%75);
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
867
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
868 return cd_info;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
869 }