annotate stream/stream_cddb.c @ 31366:0bf908d29807

SIGPIPE is not really a crash, try to exit cleanly in case we receive one. Particularly in the network code it would be better to ignore it, but some window managers use it to indicate a close request.
author reimar
date Wed, 16 Jun 2010 17:33:17 +0000
parents ce19feeb5cbb
children ce2892e4d7a8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
1 /*
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
2 * CDDB HTTP protocol
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
3 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
4 * Copyright (C) 2002 Bertrand Baudet <bertrand_baudet@yahoo.com>
6474
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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
8 *
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
9 * discid computation by Jeremy D. Zawodny
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
10 * Copyright (c) 1998-2000 Jeremy D. Zawodny <Jeremy@Zawodny.com>
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
11 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
12 * This file is part of MPlayer.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
13 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
14 * MPlayer is free software; you can redistribute it and/or modify
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
15 * it under the terms of the GNU General Public License as published by
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
16 * the Free Software Foundation; either version 2 of the License, or
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
17 * (at your option) any later version.
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
18 *
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
19 * MPlayer is distributed in the hope that it will be useful,
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
22 * GNU General Public License for more details.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
23 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
24 * You should have received a copy of the GNU General Public License along
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
25 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
27 */
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
28
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
29 #include "config.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
30
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
31 #include <stdio.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
32 #include <stdlib.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
33 #include <fcntl.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
34 #include <stdarg.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
35 #include <errno.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
36 #include <unistd.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
37 #include <string.h>
25792
0bf5384fb82c Fix compilation failue:
ulion
parents: 25780
diff changeset
38 #include <limits.h>
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
39 #if defined(__MINGW32__) || defined(__CYGWIN__)
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
40 #ifdef __MINGW32__
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
41 #define mkdir(a,b) mkdir(a)
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
42 #endif
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
43 #include <windows.h>
28402
c884d17bd005 Convert HAVE_WINSOCK2_H into a 0/1 definition.
diego
parents: 27727
diff changeset
44 #if HAVE_WINSOCK2_H
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
45 #include <winsock2.h>
17446
9604131f9196 Cygwin compilation fix
diego
parents: 17044
diff changeset
46 #endif
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
47 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
48 #include <netdb.h>
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
49 #include <sys/ioctl.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
50 #endif
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
51 #include <sys/types.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
52 #include <sys/stat.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
53
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
54 #include "mp_msg.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
55 #include "help_mp.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
56
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
57 #if defined(__linux__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
58 #include <linux/cdrom.h>
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
59 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
60 #include <sys/cdio.h>
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
61 #elif defined(__MINGW32__) || defined(__CYGWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
62 #include <ddk/ntddcdrm.h>
30613
e04602bd557a Add missing 'defined' for __bsdi__.
komh
parents: 30426
diff changeset
63 #elif defined(__bsdi__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
64 #include <dvd.h>
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
65 #elif defined(__APPLE__) || defined(__DARWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
66 #include <IOKit/storage/IOCDTypes.h>
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
67 #include <IOKit/storage/IOCDMediaBSDClient.h>
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
68 #include "mpbswap.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
69 #endif
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
70
30746
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
71 #include "osdep/osdep.h"
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
72
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
73 #include "cdd.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16967
diff changeset
74 #include "version.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
75 #include "stream.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
76 #include "network.h"
25948
e8945e43a36f #include just libavutil/common.h, not all of libavutil/intreadwrite.h.
diego
parents: 25796
diff changeset
77 #include "libavutil/common.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
78
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
79 #define DEFAULT_FREEDB_SERVER "freedb.freedb.org"
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
80 #define DEFAULT_CACHE_DIR "/.cddb/"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
81
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
82 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
83 static int cdtoc_last_track;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
84
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
85 static int read_toc(const char *dev)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
86 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
87 int first = 0, last = -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
88 int i;
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
89 #if defined(__MINGW32__) || defined(__CYGWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
90 HANDLE drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
91 DWORD r;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
92 CDROM_TOC toc;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
93 char device[10];
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
94
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
95 sprintf(device, "\\\\.\\%s", dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
96 drive = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
97 OPEN_EXISTING, 0, 0);
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
98
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
99 if (!DeviceIoControl(drive, IOCTL_CDROM_READ_TOC, NULL, 0, &toc,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
100 sizeof(CDROM_TOC), &r, 0)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
101 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
102 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
103 }
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
104
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
105 first = toc.FirstTrack - 1; last = toc.LastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
106 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
107 cdtoc[i].min = toc.TrackData[i].Address[1];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
108 cdtoc[i].sec = toc.TrackData[i].Address[2];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
109 cdtoc[i].frame = toc.TrackData[i].Address[3];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
110 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
111 CloseHandle(drive);
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
112
30746
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
113 #elif defined(__OS2__)
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
114 UCHAR auchParamDisk[4] = {'C', 'D', '0', '1'};
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
115
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
116 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
117 BYTE bFirstTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
118 BYTE bLastTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
119 BYTE bLeadOutF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
120 BYTE bLeadOutS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
121 BYTE bLeadOutM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
122 BYTE bLeadOutReserved;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
123 } __attribute__((packed)) sDataDisk;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
124
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
125 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
126 UCHAR auchSign[4];
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
127 BYTE bTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
128 } __attribute__((packed)) sParamTrack = {{'C', 'D', '0', '1'},};
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
129
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
130 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
131 BYTE bStartF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
132 BYTE bStartS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
133 BYTE bStartM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
134 BYTE bStartReserved;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
135 BYTE bControlInfo;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
136 } __attribute__((packed)) sDataTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
137
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
138 HFILE hcd;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
139 ULONG ulAction;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
140 ULONG ulParamLen;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
141 ULONG ulDataLen;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
142 ULONG rc;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
143
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
144 rc = DosOpen(dev, &hcd, &ulAction, 0, FILE_NORMAL,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
145 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
146 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
147 NULL);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
148 if (rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
149 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
150 return -1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
151 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
152
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
153 rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
154 auchParamDisk, sizeof(auchParamDisk), &ulParamLen,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
155 &sDataDisk, sizeof(sDataDisk), &ulDataLen);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
156 if (!rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
157 first = sDataDisk.bFirstTrack - 1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
158 last = sDataDisk.bLastTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
159 for (i = first; i <= last; i++) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
160 if (i == last) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
161 sDataTrack.bStartM = sDataDisk.bLeadOutM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
162 sDataTrack.bStartS = sDataDisk.bLeadOutS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
163 sDataTrack.bStartF = sDataDisk.bLeadOutF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
164 } else {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
165 sParamTrack.bTrack = i + 1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
166 rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
167 &sParamTrack, sizeof(sParamTrack), &ulParamLen,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
168 &sDataTrack, sizeof(sDataTrack), &ulDataLen);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
169 if (rc)
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
170 break;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
171 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
172
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
173 cdtoc[i].min = sDataTrack.bStartM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
174 cdtoc[i].sec = sDataTrack.bStartS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
175 cdtoc[i].frame = sDataTrack.bStartF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
176 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
177 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
178
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
179 DosClose(hcd);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
180
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
181 if (rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
182 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
183 return -1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
184 }
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
185 #else
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
186 int drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
187 drive = open(dev, O_RDONLY | O_NONBLOCK);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
188 if (drive < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
189 return drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
190 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
191
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
192 #if defined(__linux__) || defined(__bsdi__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
193 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
194 struct cdrom_tochdr tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
195 ioctl(drive, CDROMREADTOCHDR, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
196 first = tochdr.cdth_trk0 - 1; last = tochdr.cdth_trk1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
197 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
198 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
199 struct cdrom_tocentry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
200 tocentry.cdte_track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
201 tocentry.cdte_format = CDROM_MSF;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
202 ioctl(drive, CDROMREADTOCENTRY, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
203 cdtoc[i].min = tocentry.cdte_addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
204 cdtoc[i].sec = tocentry.cdte_addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
205 cdtoc[i].frame = tocentry.cdte_addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
206 }
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
207 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
208 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
209 struct ioc_toc_header tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
210 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
211 first = tochdr.starting_track - 1; last = tochdr.ending_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
212 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
213 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
214 struct ioc_read_toc_single_entry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
215 tocentry.track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
216 tocentry.address_format = CD_MSF_FORMAT;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
217 ioctl(drive, CDIOREADTOCENTRY, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
218 cdtoc[i].min = tocentry.entry.addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
219 cdtoc[i].sec = tocentry.entry.addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
220 cdtoc[i].frame = tocentry.entry.addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
221 }
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
222 #elif defined(__NetBSD__) || defined(__OpenBSD__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
223 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
224 struct ioc_toc_header tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
225 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
226 first = tochdr.starting_track - 1; last = tochdr.ending_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
227 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
228 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
229 struct ioc_read_toc_entry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
230 struct cd_toc_entry toc_buffer;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
231 tocentry.starting_track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
232 tocentry.address_format = CD_MSF_FORMAT;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
233 tocentry.data = &toc_buffer;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
234 tocentry.data_len = sizeof(toc_buffer);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
235 ioctl(drive, CDIOREADTOCENTRYS, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
236 cdtoc[i].min = toc_buffer.addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
237 cdtoc[i].sec = toc_buffer.addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
238 cdtoc[i].frame = toc_buffer.addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
239 }
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
240 #elif defined(__APPLE__) || defined(__DARWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
241 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
242 dk_cd_read_toc_t tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
243 uint8_t buf[4];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
244 uint8_t buf2[100 * sizeof(CDTOCDescriptor) + sizeof(CDTOC)];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
245 memset(&tochdr, 0, sizeof(tochdr));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
246 tochdr.bufferLength = sizeof(buf);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
247 tochdr.buffer = &buf;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
248 if (!ioctl(drive, DKIOCCDREADTOC, &tochdr)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
249 && tochdr.bufferLength == sizeof(buf)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
250 first = buf[2] - 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
251 last = buf[3];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
252 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
253 if (last >= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
254 memset(&tochdr, 0, sizeof(tochdr));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
255 tochdr.bufferLength = sizeof(buf2);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
256 tochdr.buffer = &buf2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
257 tochdr.format = kCDTOCFormatTOC;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
258 if (ioctl(drive, DKIOCCDREADTOC, &tochdr)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
259 || tochdr.bufferLength < sizeof(CDTOC))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
260 last = -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
261 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
262 if (last >= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
263 CDTOC *cdToc = (CDTOC *)buf2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
264 CDTrackInfo lastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
265 dk_cd_read_track_info_t trackInfoParams;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
266 for (i = first; i < last; ++i) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
267 CDMSF msf = CDConvertTrackNumberToMSF(i + 1, cdToc);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
268 cdtoc[i].min = msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
269 cdtoc[i].sec = msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
270 cdtoc[i].frame = msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
271 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
272 memset(&trackInfoParams, 0, sizeof(trackInfoParams));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
273 trackInfoParams.addressType = kCDTrackInfoAddressTypeTrackNumber;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
274 trackInfoParams.bufferLength = sizeof(lastTrack);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
275 trackInfoParams.address = last;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
276 trackInfoParams.buffer = &lastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
277 if (!ioctl(drive, DKIOCCDREADTRACKINFO, &trackInfoParams)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
278 CDMSF msf = CDConvertLBAToMSF(be2me_32(lastTrack.trackStartAddress)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
279 + be2me_32(lastTrack.trackSize));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
280 cdtoc[last].min = msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
281 cdtoc[last].sec = msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
282 cdtoc[last].frame = msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
283 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
284 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
285 }
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
286 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
287 close(drive);
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
288 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
289 for (i = first; i <= last; i++)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
290 cdtoc[i].frame += (cdtoc[i].min * 60 + cdtoc[i].sec) * 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
291 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
292 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
293
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
294 /**
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
295 \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
296 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
297 \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
298 \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
299 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
300 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
301 */
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
302 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
303 {
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
304 cdtoc_last_track = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
305 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
306 int i, min, sec, frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
307 cdtoc_last_track = read_toc(dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
308 if (cdtoc_last_track < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
309 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
310 dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
311 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
312 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
313 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CDDA_TRACKS=%d\n", cdtoc_last_track);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
314 for (i = 1; i <= cdtoc_last_track; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
315 frame = cdtoc[i].frame - cdtoc[i-1].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
316 sec = frame / 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
317 frame -= sec * 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
318 min = sec / 60;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
319 sec -= min * 60;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
320 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
321 "ID_CDDA_TRACK_%d_MSF=%02d:%02d:%02d\n", i, min, sec, frame);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
322 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
323 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
324 return cdtoc_last_track;
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
325 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
326
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
327 static unsigned int cddb_sum(int n)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
328 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
329 unsigned int ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
330
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
331 ret = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
332 while (n > 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
333 ret += (n % 10);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
334 n /= 10;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
335 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
336 return ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
337 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
338
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
339 static unsigned long cddb_discid(int tot_trks)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
340 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
341 unsigned int i, t = 0, n = 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
342
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
343 i = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
344 while (i < (unsigned int)tot_trks) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
345 n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
346 i++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
347 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
348 t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
349 ((cdtoc[0].min * 60) + cdtoc[0].sec);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
350 return (n % 0xff) << 24 | t << 8 | tot_trks;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
351 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
352
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
353
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
354
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
355 static int cddb_http_request(char *command,
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
356 int (*reply_parser)(HTTP_header_t*, cddb_data_t*),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
357 cddb_data_t *cddb_data)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
358 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
359 char request[4096];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
360 int fd, ret = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
361 URL_t *url;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
362 HTTP_header_t *http_hdr;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
363
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
364 if (reply_parser == NULL || command == NULL || cddb_data == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
365 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
366
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
367 sprintf(request, "http://%s/~cddb/cddb.cgi?cmd=%s%s&proto=%d",
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
368 cddb_data->freedb_server, command, cddb_data->cddb_hello,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
369 cddb_data->freedb_proto_level);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
370 mp_msg(MSGT_OPEN, MSGL_INFO,"Request[%s]\n", request);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
371
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
372 url = url_new(request);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
373 if (url == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
374 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NotAValidURL);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
375 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
376 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
377
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
378 fd = http_send_request(url,0);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
379 if (fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
380 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
381 MSGTR_MPDEMUX_CDDB_FailedToSendHTTPRequest);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
382 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
383 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
384
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
385 http_hdr = http_read_response(fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
386 if (http_hdr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
387 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
388 MSGTR_MPDEMUX_CDDB_FailedToReadHTTPResponse);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
389 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
390 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
391
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
392 http_debug_hdr(http_hdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
393 mp_msg(MSGT_OPEN, MSGL_INFO,"body=[%s]\n", http_hdr->body);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
394
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
395 switch (http_hdr->status_code) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
396 case 200:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
397 ret = reply_parser(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
398 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
399 case 400:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
400 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorNOTFOUND);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
401 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
402 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
403 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorUnknown);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
404 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
405
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
406 http_free(http_hdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
407 url_free(url);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
408
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
409 return ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
410 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
411
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
412 static int cddb_read_cache(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
413 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
414 char file_name[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
415 struct stat stats;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
416 int file_fd, ret;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
417 size_t file_size;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
418
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
419 if (cddb_data == NULL || cddb_data->cache_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
420 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
421
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
422 sprintf(file_name, "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
423
30685
7e2f58933cc1 Define O_BINARY if it is undefined.
komh
parents: 30629
diff changeset
424 file_fd = open(file_name, O_RDONLY | O_BINARY);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
425 if (file_fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
426 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCacheFound);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
427 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
428 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
429
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
430 ret = fstat(file_fd, &stats);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
431 if (ret < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
432 perror("fstat");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
433 file_size = 4096;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
434 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
435 file_size = stats.st_size < UINT_MAX ? stats.st_size : UINT_MAX - 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
436 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
437
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
438 cddb_data->xmcd_file = malloc(file_size + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
439 if (cddb_data->xmcd_file == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
440 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
441 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
442 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
443 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
444 cddb_data->xmcd_file_size = read(file_fd, cddb_data->xmcd_file, file_size);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
445 if (cddb_data->xmcd_file_size != file_size) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
446 mp_msg(MSGT_DEMUX, MSGL_WARN,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
447 MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenRead);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
448 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
449 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
450 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
451 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
452
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
453 close(file_fd);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
454
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
455 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
456 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
457
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
458 static int cddb_write_cache(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
459 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
460 // We have the file, save it for cache.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
461 struct stat file_stat;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
462 char file_name[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
463 int file_fd, ret;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
464 int wrote = 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
465
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
466 if (cddb_data == NULL || cddb_data->cache_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
467 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
468
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
469 // Check if the CDDB cache dir exist
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
470 ret = stat(cddb_data->cache_dir, &file_stat);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
471 if (ret < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
472 // Directory not present, create it.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
473 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
474 #ifdef __MINGW32__
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
475 if (ret < 0 && errno != EEXIST) {
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
476 #else
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
477 if (ret < 0) {
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
478 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
479 perror("mkdir");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
480 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
481 MSGTR_MPDEMUX_CDDB_FailedToCreateDirectory,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
482 cddb_data->cache_dir);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
483 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
484 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
485 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
486
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
487 sprintf(file_name, "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
488
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
489 file_fd = creat(file_name, S_IRUSR | S_IWUSR);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
490 if (file_fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
491 perror("create");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
492 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
493 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
494
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
495 wrote = write(file_fd, cddb_data->xmcd_file, cddb_data->xmcd_file_size);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
496 if (wrote < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
497 perror("write");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
498 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
499 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
500 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
501 if ((unsigned int) wrote != cddb_data->xmcd_file_size) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
502 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenWritten);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
503 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
504 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
505 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
506
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
507 close(file_fd);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
508
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
509 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
510 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
511
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
512 static int cddb_read_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
513 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
514 unsigned long disc_id;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
515 char category[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
516 char *ptr = NULL, *ptr2 = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
517 int ret, status;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
518
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
519 if (http_hdr == NULL || cddb_data == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
520 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
521
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
522 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
523 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
524 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
525 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
526 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
527
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
528 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
529 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
530 ret = sscanf(http_hdr->body, "%d %99s %08lx", &status,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
531 category, &disc_id);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
532 if (ret != 3) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
533 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
534 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
535 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
536 // Check if it's a xmcd database file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
537 ptr = strstr(http_hdr->body, "# xmcd");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
538 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
539 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
540 MSGTR_MPDEMUX_CDDB_InvalidXMCDDatabaseReturned);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
541 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
542 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
543 ptr = strdup(ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
544 // Ok found the beginning of the file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
545 // look for the end
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
546 ptr2 = strstr(ptr, "\n.\r\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
547 if (!ptr2)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
548 ptr2 = strstr(ptr, "\n.\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
549 if (ptr2) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
550 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
551 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
552 mp_msg(MSGT_DEMUX, MSGL_FIXME, "Unable to find '.'\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
553 ptr2 = ptr + strlen(ptr); //return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
554 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
555 // Ok found the end
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
556 // do a sanity check
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
557 if (http_hdr->body_size < (unsigned int)(ptr2 - ptr)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
558 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnexpectedFIXME);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
559 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
560 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
561 cddb_data->xmcd_file = ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
562 cddb_data->xmcd_file_size = ptr2 - ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
563 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
564 return cddb_write_cache(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
565 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
566 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
567 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
568 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
569 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
570
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
571 static int cddb_request_titles(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
572 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
573 char command[1024];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
574 sprintf(command, "cddb+read+%s+%08lx",
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
575 cddb_data->category, cddb_data->disc_id);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
576 return cddb_http_request(command, cddb_read_parse, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
577 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
578
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
579 static int cddb_parse_matches_list(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
580 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
581 char album_title[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
582 char *ptr = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
583 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
584
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
585 ptr = strstr(http_hdr->body, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
586 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
587 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnableToFindEOL);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
588 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
589 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
590 ptr++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
591 // We have a list of exact/inexact matches, so which one do we use?
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
592 // So let's take the first one.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
593 ret = sscanf(ptr, "%99s %08lx %99s", cddb_data->category,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
594 &(cddb_data->disc_id), album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
595 if (ret != 3) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
596 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
597 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
598 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
599 ptr = strstr(http_hdr->body, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
600 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
601 char *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
602 int len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
603 ptr2 = strstr(ptr, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
604 if (ptr2 == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
605 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
606 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
607 len = ptr2-ptr+1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
608 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
609 len = FFMIN(sizeof(album_title) - 1, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
610 strncpy(album_title, ptr, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
611 album_title[len]='\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
612 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
613 mp_msg(MSGT_DEMUX, MSGL_STATUS, MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
614 album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
615 return 0;
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
616 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
617
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
618 static int cddb_query_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
619 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
620 char album_title[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
621 char *ptr = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
622 int ret, status;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
623
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
624 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
625 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
626 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
627 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
628 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
629
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
630 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
631 case 200:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
632 // Found exact match
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
633 ret = sscanf(http_hdr->body, "%d %99s %08lx %99s", &status,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
634 cddb_data->category, &(cddb_data->disc_id), album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
635 if (ret != 4) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
636 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
637 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
638 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
639 ptr = strstr(http_hdr->body, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
640 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
641 char *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
642 int len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
643 ptr2 = strstr(ptr, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
644 if (ptr2 == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
645 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
646 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
647 len = ptr2-ptr+1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
648 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
649 len = FFMIN(sizeof(album_title) - 1, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
650 strncpy(album_title, ptr, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
651 album_title[len]='\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
652 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
653 mp_msg(MSGT_DEMUX, MSGL_STATUS,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
654 MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
655 return cddb_request_titles(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
656 case 202:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
657 // No match found
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
658 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_AlbumNotFound);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
659 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
660 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
661 // Found exact matches, list follows
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
662 cddb_parse_matches_list(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
663 return cddb_request_titles(cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
664 /*
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
665 body=[210 Found exact matches, list follows (until terminating `.')
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
666 misc c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
667 rock c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
668 blues c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
669 .]
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
670 */
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
671 case 211:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
672 // Found inexact matches, list follows
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
673 cddb_parse_matches_list(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
674 return cddb_request_titles(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
675 case 500:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
676 mp_msg(MSGT_DEMUX, MSGL_FIXME,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
677 MSGTR_MPDEMUX_CDDB_ServerReturnsCommandSyntaxErr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
678 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
679 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
680 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
681 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
682 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
683 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
684
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
685 static int cddb_proto_level_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
686 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
687 int max;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
688 int ret, status;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
689 char *ptr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
690
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
691 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
692 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
693 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
694 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
695 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
696
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
697 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
698 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
699 ptr = strstr(http_hdr->body, "max proto:");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
700 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
701 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
702 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
703 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
704 ret = sscanf(ptr, "max proto: %d", &max);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
705 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
706 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
707 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
708 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
709 cddb_data->freedb_proto_level = max;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
710 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
711 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
712 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
713 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
714 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
715 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
716
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
717 static int cddb_get_proto_level(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
718 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
719 return cddb_http_request("stat", cddb_proto_level_parse, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
720 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
721
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
722 static int cddb_freedb_sites_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
723 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
724 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
725
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
726 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
727 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
728 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
729 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
730 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
731
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
732 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
733 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
734 // TODO: Parse the sites
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
735 ret = cddb_data->anonymous; // For gcc complaining about unused parameter.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
736 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
737 case 401:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
738 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_NoSitesInfoAvailable);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
739 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
740 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
741 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
742 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
743 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
744 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
745
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
746 static int cddb_get_freedb_sites(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
747 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
748 return cddb_http_request("sites", cddb_freedb_sites_parse, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
749 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
750
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
751 static void cddb_create_hello(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
752 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
753 char host_name[51];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
754 char *user_name;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
755
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
756 if (cddb_data->anonymous) { // Default is anonymous
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
757 /* Note from Eduardo Pérez Ureta <eperez@it.uc3m.es> :
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
758 * We don't send current user/host name in hello to prevent spam.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
759 * Software that sends this is considered spyware
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
760 * that most people don't like.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
761 */
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
762 user_name = "anonymous";
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
763 strcpy(host_name, "localhost");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
764 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
765 if (gethostname(host_name, 50) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
766 strcpy(host_name, "localhost");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
767 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
768 user_name = getenv("LOGNAME");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
769 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
770 sprintf(cddb_data->cddb_hello, "&hello=%s+%s+%s+%s",
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
771 user_name, host_name, "MPlayer", VERSION);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
772 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
773
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
774 static int cddb_retrieve(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
775 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
776 char offsets[1024], command[1024];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
777 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
778 unsigned int i, time_len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
779 int ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
780
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
781 ptr = offsets;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
782 for (i = 0; i < cddb_data->tracks ; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
783 ptr += sprintf(ptr, "%d+", cdtoc[i].frame);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
784 if (ptr-offsets > sizeof offsets - 40) break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
785 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
786 ptr[0] = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
787 time_len = (cdtoc[cddb_data->tracks].frame)/75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
788
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
789 cddb_data->freedb_server = DEFAULT_FREEDB_SERVER;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
790 cddb_data->freedb_proto_level = 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
791 cddb_data->xmcd_file = NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
792
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
793 cddb_create_hello(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
794 if (cddb_get_proto_level(cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
795 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
796 MSGTR_MPDEMUX_CDDB_FailedToGetProtocolLevel);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
797 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
798 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
799
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
800 //cddb_get_freedb_sites(&cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
801
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
802 sprintf(command, "cddb+query+%08lx+%d+%s%d", cddb_data->disc_id,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
803 cddb_data->tracks, offsets, time_len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
804 ret = cddb_http_request(command, cddb_query_parse, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
805 if (ret < 0)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
806 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
807
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
808 if (cddb_data->cache_dir != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
809 free(cddb_data->cache_dir);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
810 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
811 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
812 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
813
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
814 int cddb_resolve(const char *dev, char **xmcd_file)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
815 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
816 char cddb_cache_dir[] = DEFAULT_CACHE_DIR;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
817 char *home_dir = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
818 cddb_data_t cddb_data;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
819
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
820 if (cdtoc_last_track <= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
821 cdtoc_last_track = read_toc(dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
822 if (cdtoc_last_track < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
823 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
824 dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
825 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
826 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
827 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
828 cddb_data.tracks = cdtoc_last_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
829 cddb_data.disc_id = cddb_discid(cddb_data.tracks);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
830 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
831
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
832 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDB_DISCID=%08lx\n",
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
833 cddb_data.disc_id);
27174
ee63b09aedc9 Add disc ID to -identify output.
diego
parents: 26756
diff changeset
834
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
835 // Check if there is a CD in the drive
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
836 // FIXME: That's not really a good way to check
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
837 if (cddb_data.disc_id == 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
838 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCDInDrive);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
839 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
840 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
841
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
842 home_dir = getenv("HOME");
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
843 #ifdef __MINGW32__
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
844 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
845 home_dir = getenv("USERPROFILE");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
846 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
847 home_dir = getenv("HOMEPATH");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
848 // Last resort, store the cddb cache in the mplayer directory
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
849 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
850 home_dir = (char *)get_path("");
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
851 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
852 if (home_dir == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
853 cddb_data.cache_dir = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
854 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
855 cddb_data.cache_dir = malloc(strlen(home_dir)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
856 + strlen(cddb_cache_dir) + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
857 if (cddb_data.cache_dir == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
858 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
859 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
860 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
861 sprintf(cddb_data.cache_dir, "%s%s", home_dir, cddb_cache_dir);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
862 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
863
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
864 // Check for a cached file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
865 if (cddb_read_cache(&cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
866 // No Cache found
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
867 if (cddb_retrieve(&cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
868 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
869 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
870 }
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
871
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
872 if (cddb_data.xmcd_file != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
873 // printf("%s\n", cddb_data.xmcd_file);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
874 *xmcd_file = cddb_data.xmcd_file;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
875 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
876 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
877
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
878 return -1;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
879 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
880
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
881 /***************
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
882 * xmcd parser *
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
883 ***************/
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
884 static char *xmcd_parse_dtitle(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
885 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
886 char *ptr, *album;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
887 ptr = strstr(line, "DTITLE=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
888 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
889 ptr += 7;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
890 album = strstr(ptr, "/");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
891 if (album == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
892 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
893 cd_info->album = malloc(strlen(album + 2) + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
894 if (cd_info->album == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
895 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
896 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
897 strcpy(cd_info->album, album + 2);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
898 album--;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
899 album[0] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
900 cd_info->artist = malloc(strlen(ptr) + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
901 if (cd_info->artist == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
902 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
903 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
904 strcpy(cd_info->artist, ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
905 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
906 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
907 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
908
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
909 static char *xmcd_parse_dgenre(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
910 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
911 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
912 ptr = strstr(line, "DGENRE=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
913 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
914 ptr += 7;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
915 cd_info->genre = malloc(strlen(ptr)+1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
916 if (cd_info->genre == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
917 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
918 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
919 strcpy(cd_info->genre, ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
920 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
921 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
922 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
923
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
924 static char *xmcd_parse_ttitle(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
925 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
926 unsigned int track_nb;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
927 unsigned long sec, off;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
928 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
929 ptr = strstr(line, "TTITLE");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
930 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
931 ptr += 6;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
932 // Here we point to the track number
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
933 track_nb = atoi(ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
934 ptr = strstr(ptr, "=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
935 if (ptr == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
936 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
937 ptr++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
938
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
939 sec = cdtoc[track_nb].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
940 off = cdtoc[track_nb + 1].frame - sec + 1;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
941
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
942 cd_info_add_track(cd_info, ptr, track_nb + 1,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
943 (unsigned int) (off / (60 * 75)),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
944 (unsigned int) ((off / 75) % 60),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
945 (unsigned int) (off % 75),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
946 sec, off);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
947 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
948 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
949 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
950
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
951 cd_info_t *cddb_parse_xmcd(char *xmcd_file)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
952 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
953 cd_info_t *cd_info = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
954 int length, pos = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
955 char *ptr, *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
956 unsigned int audiolen;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
957 if (xmcd_file == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
958 return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
959
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
960 cd_info = cd_info_new();
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
961 if (cd_info == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
962 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
963 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
964
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
965 length = strlen(xmcd_file);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
966 ptr = xmcd_file;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
967 while (ptr != NULL && pos < length) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
968 // Read a line
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
969 ptr2 = ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
970 while(ptr2[0] != '\0' && ptr2[0] != '\r' && ptr2[0] != '\n')
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
971 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
972 if (ptr2[0] == '\0') {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
973 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
974 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
975 ptr2[0] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
976 // Ignore comments
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
977 if (ptr[0] != '#') {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
978 // Search for the album title
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
979 if (xmcd_parse_dtitle(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
980 ;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
981 // Search for the genre
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
982 else if (xmcd_parse_dgenre(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
983 ;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
984 // Search for a track title
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
985 else if (xmcd_parse_ttitle(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
986 audiolen++; // <-- audiolen++ to shut up gcc warning
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
987 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
988 if (ptr2[1] == '\n')
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
989 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
990 pos = (ptr2 + 1) - ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
991 ptr = ptr2 + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
992 }
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
993
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
994 audiolen = cdtoc[cd_info->nb_tracks].frame-cdtoc[0].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
995 cd_info->min = (unsigned int) (audiolen / (60 * 75));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
996 cd_info->sec = (unsigned int) ((audiolen / 75) % 60);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
997 cd_info->msec = (unsigned int) (audiolen % 75);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
998
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
999 return cd_info;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
1000 }