annotate stream/stream_cddb.c @ 25792:0bf5384fb82c

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