mirror of
https://github.com/owntone/owntone-server.git
synced 2025-01-25 13:43:18 -05:00
Remove test drivers
This commit is contained in:
parent
180cc2eb5a
commit
b4fe0300b4
@ -1,34 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#define os_opensyslog()
|
|
||||||
#define os_syslog(a,b)
|
|
||||||
#define os_closesyslog()
|
|
||||||
|
|
||||||
#include "daapd.h"
|
|
||||||
#include "conf.h"
|
|
||||||
#include "err.h"
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
int err;
|
|
||||||
|
|
||||||
printf("Reading %s\n",argv[1]);
|
|
||||||
|
|
||||||
if((err=conf_read(argv[1])) != CONF_E_SUCCESS) {
|
|
||||||
printf("Error reading config: %d\n",err);
|
|
||||||
conf_close();
|
|
||||||
} else {
|
|
||||||
printf("Read config!\n");
|
|
||||||
conf_set_string("general","stupid","lalala");
|
|
||||||
conf_set_int("potato","yummy",0);
|
|
||||||
if(conf_iswritable()) {
|
|
||||||
printf("writing config\n");
|
|
||||||
conf_write();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
conf_close();
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
# $Id$
|
|
||||||
CC=gcc
|
|
||||||
CFLAGS := $(CFLAGS) -g -DHAVE_CONFIG_H -I. -I.. -DERR_LEAN
|
|
||||||
LDFLAGS := $(LDFLAGS)
|
|
||||||
TARGET = conf
|
|
||||||
OBJECTS=config-driver.o conf.o ll.o err.o
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
|
||||||
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJECTS) $(TARGET)
|
|
372
src/io-driver.c
372
src/io-driver.c
@ -1,372 +0,0 @@
|
|||||||
|
|
||||||
#define _CRT_SECURE_NO_WARNINGS 1
|
|
||||||
#define _CRT_SECURE_NO_DEPRECATE 1
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
#include <unistd.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
# include "getopt.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "io.h"
|
|
||||||
|
|
||||||
struct testinfo {
|
|
||||||
char *name;
|
|
||||||
int files;
|
|
||||||
int restart;
|
|
||||||
int (*handler)(void);
|
|
||||||
};
|
|
||||||
|
|
||||||
int test_readfile(void);
|
|
||||||
int test_readfile_timeout(void);
|
|
||||||
int test_servefile(void);
|
|
||||||
int test_udpserver(void);
|
|
||||||
int test_udpclient(void);
|
|
||||||
int test_buffer(void);
|
|
||||||
|
|
||||||
struct testinfo tests[] = {
|
|
||||||
{ "Read file, showing block size [uri to read]", 1, 0, test_readfile },
|
|
||||||
{ "Read file, with 10s timeout [uri to read]", 1, 0, test_readfile_timeout },
|
|
||||||
{ "Serve a file [listen://port] [uri to serve]", 2, 1, test_servefile },
|
|
||||||
{ "UDP echo server [udplisten://port]", 1, 0, test_udpserver },
|
|
||||||
{ "UDP echo client [udp://server:port]", 1, 0, test_udpclient },
|
|
||||||
{ "Buffered line read [uri]", 1, 0, test_buffer }
|
|
||||||
};
|
|
||||||
|
|
||||||
int debuglevel=1;
|
|
||||||
char *files[20];
|
|
||||||
|
|
||||||
int test_udpclient(void) {
|
|
||||||
IOHANDLE ioclient;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len;
|
|
||||||
|
|
||||||
ioclient = io_new();
|
|
||||||
if(!io_open(ioclient,files[0])) {
|
|
||||||
printf("Can't open udp connection: %s\n", io_errstr(ioclient));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
strncpy((char*)buffer,"foo",sizeof(buffer));
|
|
||||||
len = (uint32_t)strlen((char*)buffer);
|
|
||||||
if(!io_write(ioclient,buffer,&len)) {
|
|
||||||
printf("Write error: %s\n",io_errstr(ioclient));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* wait for return */
|
|
||||||
len = sizeof(buffer);
|
|
||||||
if(!io_read(ioclient, buffer, &len)) {
|
|
||||||
printf("Read error: %s\n",io_errstr(ioclient));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer[len] = '\0';
|
|
||||||
printf("Read %d bytes: %s\n",len,buffer);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_udpserver(void) {
|
|
||||||
IOHANDLE ioserver;
|
|
||||||
IO_WAITHANDLE iow;
|
|
||||||
struct sockaddr_in si_from;
|
|
||||||
socklen_t si_len;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len;
|
|
||||||
uint32_t timeout;
|
|
||||||
|
|
||||||
ioserver = io_new();
|
|
||||||
if(!io_open(ioserver,files[0])) {
|
|
||||||
printf("Can't open listener: %s\n", io_errstr(ioserver));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
si_len = sizeof(si_from);
|
|
||||||
iow = io_wait_new();
|
|
||||||
io_wait_add(iow, ioserver, IO_WAIT_READ | IO_WAIT_ERROR);
|
|
||||||
|
|
||||||
timeout = 30000; /* 30 seconds */
|
|
||||||
io_wait(iow, &timeout);
|
|
||||||
|
|
||||||
if(timeout == 0) {
|
|
||||||
printf("Timeout!\n");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(io_wait_status(iow, ioserver) & IO_WAIT_ERROR) {
|
|
||||||
printf("Error in ioserver socket\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
len = sizeof(buffer);
|
|
||||||
if(!io_udp_recvfrom(ioserver, buffer, &len, &si_from, &si_len)) {
|
|
||||||
printf("Error in recvfrom: %s\n",io_errstr(ioserver));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer[len] = '\0';
|
|
||||||
printf("Got %s\n",buffer);
|
|
||||||
printf("Returning...\n");
|
|
||||||
io_udp_sendto(ioserver,buffer,&len,&si_from,si_len);
|
|
||||||
|
|
||||||
io_close(ioserver);
|
|
||||||
io_dispose(ioserver);
|
|
||||||
io_wait_dispose(iow);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int test_servefile(void) {
|
|
||||||
IOHANDLE ioserver, ioclient, iofile;
|
|
||||||
IO_WAITHANDLE iow;
|
|
||||||
uint32_t timeout;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len = sizeof(buffer);
|
|
||||||
|
|
||||||
ioserver = io_new();
|
|
||||||
if(!io_open(ioserver,files[0])) {
|
|
||||||
printf("Can't open listener: %s\n",io_errstr(ioserver));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Making new waiter...\n");
|
|
||||||
iow = io_wait_new();
|
|
||||||
printf("Adding io object to waiter\n");
|
|
||||||
io_wait_add(iow, ioserver, IO_WAIT_READ | IO_WAIT_ERROR);
|
|
||||||
|
|
||||||
timeout = 30000; /* 30 seconds */
|
|
||||||
printf("Waiting...\n");
|
|
||||||
while(io_wait(iow, &timeout)) {
|
|
||||||
printf("Done waiting.\n");
|
|
||||||
if(io_wait_status(iow, ioserver) & IO_WAIT_ERROR) {
|
|
||||||
printf("Got a status of IO_WAIT_ERROR\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if(io_wait_status(iow, ioserver) & IO_WAIT_READ) {
|
|
||||||
/* got a client */
|
|
||||||
printf("Got a client...\n");
|
|
||||||
iofile = io_new();
|
|
||||||
if(!io_open(iofile,files[1])) {
|
|
||||||
printf("Can't open file to serve: %s\n",io_errstr(iofile));
|
|
||||||
io_dispose(iofile);
|
|
||||||
io_dispose(ioserver);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
printf("Opened %s to serve\n",files[1]);
|
|
||||||
|
|
||||||
/* jet it out to the client */
|
|
||||||
ioclient = io_new();
|
|
||||||
io_listen_accept(ioserver,ioclient,NULL);
|
|
||||||
|
|
||||||
printf("Got client socket\n");
|
|
||||||
len = sizeof(buffer);
|
|
||||||
while(io_read(iofile,buffer,&len) && len) {
|
|
||||||
printf("Read %d bytes\n",len);
|
|
||||||
if(!io_write(ioclient,buffer,&len)) {
|
|
||||||
printf("write error: %s\n",io_errstr(ioclient));
|
|
||||||
}
|
|
||||||
|
|
||||||
len = sizeof(buffer);
|
|
||||||
}
|
|
||||||
io_close(ioclient);
|
|
||||||
io_dispose(ioclient);
|
|
||||||
printf("Closing client connection\n");
|
|
||||||
io_close(iofile);
|
|
||||||
io_dispose(iofile);
|
|
||||||
printf("Looping to wait again.\n");
|
|
||||||
}
|
|
||||||
timeout = 30000; /* 30 seconds */
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Wait failed: timeout: %d\n",timeout);
|
|
||||||
|
|
||||||
if(!timeout) {
|
|
||||||
printf("Timeout waiting for socket\n");
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* socket error? */
|
|
||||||
printf("Socket error: %s\n",io_errstr(ioserver));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_readfile(void) {
|
|
||||||
IOHANDLE ioh;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len = sizeof(buffer);
|
|
||||||
uint64_t file_len;
|
|
||||||
|
|
||||||
ioh = io_new();
|
|
||||||
if(ioh != INVALID_HANDLE) {
|
|
||||||
if(!io_open(ioh,files[0])) {
|
|
||||||
printf("Can't open file: %s\n",io_errstr(ioh));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
io_size(ioh, &file_len);
|
|
||||||
printf("File size: %ld bytes\n",file_len);
|
|
||||||
while(io_read(ioh,buffer,&len) && len) {
|
|
||||||
printf("Read %d bytes\n",len);
|
|
||||||
len = sizeof(buffer);
|
|
||||||
}
|
|
||||||
if(!len) {
|
|
||||||
printf("EOF!\n");
|
|
||||||
} else {
|
|
||||||
printf("Read error: %s\n",io_errstr(ioh));
|
|
||||||
}
|
|
||||||
io_close(ioh);
|
|
||||||
} else {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_buffer(void) {
|
|
||||||
IOHANDLE ioh;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len = sizeof(buffer);
|
|
||||||
uint64_t file_len;
|
|
||||||
int line=1;
|
|
||||||
|
|
||||||
ioh = io_new();
|
|
||||||
if(ioh != INVALID_HANDLE) {
|
|
||||||
if(!io_open(ioh,files[0])) {
|
|
||||||
printf("Can't open file: %s\n",io_errstr(ioh));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
io_size(ioh, &file_len);
|
|
||||||
io_buffer(ioh);
|
|
||||||
|
|
||||||
printf("File size: %ld bytes\n",file_len);
|
|
||||||
while(io_readline(ioh,buffer,&len) && len) {
|
|
||||||
printf("Read %d bytes\n",len);
|
|
||||||
len = sizeof(buffer);
|
|
||||||
printf("Line %d: %s\n",line,buffer);
|
|
||||||
line++;
|
|
||||||
}
|
|
||||||
if(!len) {
|
|
||||||
printf("EOF!\n");
|
|
||||||
} else {
|
|
||||||
printf("Read error: %s\n",io_errstr(ioh));
|
|
||||||
}
|
|
||||||
io_close(ioh);
|
|
||||||
} else {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
int test_readfile_timeout(void) {
|
|
||||||
IOHANDLE ioh;
|
|
||||||
unsigned char buffer[256];
|
|
||||||
uint32_t len = sizeof(buffer);
|
|
||||||
uint32_t timeout;
|
|
||||||
|
|
||||||
ioh = io_new();
|
|
||||||
if(ioh != INVALID_HANDLE) {
|
|
||||||
if(!io_open(ioh,files[0])) {
|
|
||||||
printf("Can't open file: %s\n",io_errstr(ioh));
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
timeout = 1000;
|
|
||||||
while(io_read_timeout(ioh,buffer,&len,&timeout) && len) {
|
|
||||||
printf("Read %d bytes\n",len);
|
|
||||||
len = sizeof(buffer);
|
|
||||||
timeout = 1000;
|
|
||||||
}
|
|
||||||
if(!len) {
|
|
||||||
printf("EOF!\n");
|
|
||||||
} else {
|
|
||||||
if(!timeout) {
|
|
||||||
printf("Timeout\n");
|
|
||||||
} else {
|
|
||||||
printf("Read error: %s\n",io_errstr(ioh));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
io_close(ioh);
|
|
||||||
} else {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void errhandler(int level, char *msg) {
|
|
||||||
if(level <= debuglevel) {
|
|
||||||
fprintf(stderr,"L%d: %s",level,msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!level) {
|
|
||||||
fflush(stdout);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
int ntests;
|
|
||||||
int test;
|
|
||||||
|
|
||||||
fprintf(stderr,"io -t<n> [[file] [...]]\n\n");
|
|
||||||
|
|
||||||
ntests = (sizeof(tests)/sizeof(struct testinfo));
|
|
||||||
for(test=0; test < ntests; test++) {
|
|
||||||
fprintf(stderr, "Test %02d: %s\n",test+1,tests[test].name);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
int option;
|
|
||||||
int test = 0;
|
|
||||||
int nfiles=0;
|
|
||||||
int retval;
|
|
||||||
|
|
||||||
while((option = getopt(argc, argv, "t:d:")) != -1) {
|
|
||||||
switch(option) {
|
|
||||||
case 't':
|
|
||||||
test = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
debuglevel = atoi(optarg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!test || (test > (sizeof(tests)/sizeof(struct testinfo))))
|
|
||||||
usage();
|
|
||||||
|
|
||||||
test--;
|
|
||||||
|
|
||||||
while((optind + nfiles) != argc) {
|
|
||||||
files[nfiles] = argv[optind + nfiles];
|
|
||||||
nfiles++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(tests[test].files != nfiles) {
|
|
||||||
fprintf(stderr,"Test %d requres %d files, only got %d\n",
|
|
||||||
test, tests[test].files, nfiles);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
io_init();
|
|
||||||
io_set_errhandler(errhandler);
|
|
||||||
|
|
||||||
printf("Executing test: %s\n",tests[test].name);
|
|
||||||
retval = tests[test].handler();
|
|
||||||
io_deinit();
|
|
||||||
|
|
||||||
return (retval == FALSE);
|
|
||||||
}
|
|
11
src/io.mk
11
src/io.mk
@ -1,11 +0,0 @@
|
|||||||
CC=gcc
|
|
||||||
CFLAGS := $(CFLAGS) -DDEBUG -g -DHAVE_UNISTD_H
|
|
||||||
LDFLAGS := $(LDFLAGS)
|
|
||||||
TARGET = io
|
|
||||||
OBJECTS= io.o io-driver.o bsd-snprintf.o
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
|
||||||
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJECTS) $(TARGET)
|
|
@ -1,93 +0,0 @@
|
|||||||
/*
|
|
||||||
* Test harness for the parser
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "daapd.h"
|
|
||||||
#include "conf.h"
|
|
||||||
#include "db-generic.h"
|
|
||||||
#include "err.h"
|
|
||||||
#include "smart-parser.h"
|
|
||||||
|
|
||||||
CONFIG config;
|
|
||||||
char *scan_winamp_genre[] = { NULL };
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
printf("Usage:\n\n parser [-t <type (0/1)>] [-d <debug level>] \"phrase\"\n\n");
|
|
||||||
exit(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
int option;
|
|
||||||
int type=0;
|
|
||||||
PARSETREE pt;
|
|
||||||
char *configfile = "/etc/mt-daapd.conf";
|
|
||||||
int debuglevel=0;
|
|
||||||
char db_type[40];
|
|
||||||
char db_parms[PATH_MAX];
|
|
||||||
int size;
|
|
||||||
int err;
|
|
||||||
char *perr;
|
|
||||||
|
|
||||||
while((option = getopt(argc, argv, "d:t:c:")) != -1) {
|
|
||||||
switch(option) {
|
|
||||||
case 'c':
|
|
||||||
configfile = optarg;
|
|
||||||
break;
|
|
||||||
case 'd':
|
|
||||||
debuglevel = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
type = atoi(optarg);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"Error: unknown option (%c)\n\n",option);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// err_setdebugmask("parse");
|
|
||||||
|
|
||||||
if(conf_read(configfile) != CONF_E_SUCCESS) {
|
|
||||||
fprintf(stderr,"could not read config file: %s\n",configfile);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(debuglevel) {
|
|
||||||
printf("Setting debug level to %d\n",debuglevel);
|
|
||||||
err_setlevel(debuglevel);
|
|
||||||
err_setdest(LOGDEST_STDERR);
|
|
||||||
}
|
|
||||||
|
|
||||||
size = sizeof(db_type);
|
|
||||||
conf_get_string("general","db_type","sqlite",db_type,&size);
|
|
||||||
size = sizeof(db_parms);
|
|
||||||
conf_get_string("general","db_parms","/var/cache/mt-daapd",db_parms,&size);
|
|
||||||
|
|
||||||
err=db_open(&perr,db_type,db_parms);
|
|
||||||
if(err != DB_E_SUCCESS) {
|
|
||||||
fprintf(stderr,"Error opening db: %s\n",perr);
|
|
||||||
free(perr);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Parsing %s\n",argv[optind]);
|
|
||||||
|
|
||||||
pt=sp_init();
|
|
||||||
if(!sp_parse(pt,argv[optind],type)) {
|
|
||||||
printf("%s\n",sp_get_error(pt));
|
|
||||||
} else {
|
|
||||||
printf("SQL: %s\n",sp_sql_clause(pt));
|
|
||||||
}
|
|
||||||
|
|
||||||
sp_dispose(pt);
|
|
||||||
conf_close();
|
|
||||||
|
|
||||||
printf("Done!\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
CC=gcc
|
|
||||||
CFLAGS := $(CFLAGS) -g -I/opt/local/include -DHAVE_CONFIG_H -I. -I.. -Wall -DHAVE_SQL -no-cpp-precomp -DMAC -DHOST='"argh"'
|
|
||||||
LDFLAGS := $(LDFLAGS) -L/opt/local/lib -lsqlite -lsqlite3 -lm -framework CoreFoundation
|
|
||||||
TARGET=parser
|
|
||||||
OBJECTS=parser-driver.o smart-parser.o err.o db-sql.o db-generic.o db-sql-sqlite3.o db-sql-sqlite2.o conf.o ll.o xml-rpc.o webserver.o uici.o os-unix.o restart.o configfile.o rend-win32.o plugin.o db-sql-updates.o dispatch.o dynamic-art.o scan-aac.o
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
|
||||||
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS)
|
|
||||||
|
|
@ -1,220 +0,0 @@
|
|||||||
/*
|
|
||||||
* $Id$
|
|
||||||
* Simple driver to test tag scanners without the overhead
|
|
||||||
* of all of mt-daapd
|
|
||||||
*
|
|
||||||
* Copyright (C) 2005 Ron Pedde (ron@pedde.com)
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
#include "config.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "daapd.h"
|
|
||||||
#include "conf.h"
|
|
||||||
#include "err.h"
|
|
||||||
#include "mp3-scanner.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* externs
|
|
||||||
*/
|
|
||||||
extern int scan_get_wmainfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_ogginfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_flacinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_mpcinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_wavinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_aacinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_mp3info(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_urlinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
extern int scan_get_aifinfo(char *filename, MP3FILE *pmp3);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Typedefs
|
|
||||||
*/
|
|
||||||
typedef struct scannerlist_tag {
|
|
||||||
char *ext;
|
|
||||||
int (*scanner)(char *file, MP3FILE *pmp3);
|
|
||||||
} SCANNERLIST;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Globals
|
|
||||||
*/
|
|
||||||
SCANNERLIST scanner_list[] = {
|
|
||||||
{ "wma",scan_get_wmainfo },
|
|
||||||
{ "flac",scan_get_flacinfo },
|
|
||||||
{ "fla",scan_get_flacinfo },
|
|
||||||
{ "mpc",scan_get_mpcinfo },
|
|
||||||
{ "mpp",scan_get_mpcinfo },
|
|
||||||
{ "mp+",scan_get_mpcinfo },
|
|
||||||
{ "ogg",scan_get_ogginfo },
|
|
||||||
{ "m4a",scan_get_aacinfo },
|
|
||||||
{ "m4p",scan_get_aacinfo },
|
|
||||||
{ "mp4",scan_get_aacinfo },
|
|
||||||
{ "wav",scan_get_wavinfo },
|
|
||||||
{ "url",scan_get_urlinfo },
|
|
||||||
{ "mp3",scan_get_mp3info },
|
|
||||||
{ "aif",scan_get_aifinfo },
|
|
||||||
{ "aiff",scan_get_aifinfo },
|
|
||||||
{ NULL, NULL }
|
|
||||||
};
|
|
||||||
char *av0;
|
|
||||||
|
|
||||||
CONFIG config;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* dump a mp3 file
|
|
||||||
*
|
|
||||||
* \param pmp3 mp3 file to dump
|
|
||||||
*/
|
|
||||||
void dump_mp3(MP3FILE *pmp3) {
|
|
||||||
int min,sec,msec;
|
|
||||||
|
|
||||||
min=(pmp3->song_length/1000) / 60;
|
|
||||||
sec = (pmp3->song_length/1000) - (60 * min);
|
|
||||||
msec = pmp3->song_length - ((pmp3->song_length/1000)*1000);
|
|
||||||
|
|
||||||
printf("path..........: %s\n",pmp3->path);
|
|
||||||
printf("fname.........: %s\n",pmp3->fname);
|
|
||||||
printf("title.........: %s\n",pmp3->title);
|
|
||||||
printf("artist........: %s\n",pmp3->artist);
|
|
||||||
printf("album_artist..: %s\n",pmp3->album_artist);
|
|
||||||
printf("album.........: %s\n",pmp3->album);
|
|
||||||
printf("genre.........: %s\n",pmp3->genre);
|
|
||||||
printf("comment.......: %s\n",pmp3->comment);
|
|
||||||
printf("type..........: %s\n",pmp3->type);
|
|
||||||
printf("composter.....: %s\n",pmp3->composer);
|
|
||||||
printf("orchestra.....: %s\n",pmp3->orchestra);
|
|
||||||
printf("conductor.....: %s\n",pmp3->conductor);
|
|
||||||
printf("grouping......: %s\n",pmp3->grouping);
|
|
||||||
printf("url...........: %s\n",pmp3->url);
|
|
||||||
printf("description...: %s\n",pmp3->description);
|
|
||||||
printf("codectype.....: %s\n",pmp3->codectype);
|
|
||||||
printf("year..........: %d\n",pmp3->year);
|
|
||||||
|
|
||||||
printf("bitrate.......: %dkb\n",pmp3->bitrate);
|
|
||||||
printf("samplerate....: %d\n",pmp3->samplerate);
|
|
||||||
printf("length........: %dms (%d:%02d.%03d)\n",pmp3->song_length,min,sec,msec);
|
|
||||||
printf("size..........: %d\n",pmp3->file_size);
|
|
||||||
|
|
||||||
printf("track.........: %d of %d\n",pmp3->track,pmp3->total_tracks);
|
|
||||||
printf("disc..........: %d of %d\n",pmp3->disc,pmp3->total_discs);
|
|
||||||
|
|
||||||
printf("compilation...: %d\n",pmp3->compilation);
|
|
||||||
|
|
||||||
printf("rating........: %d\n",pmp3->rating);
|
|
||||||
printf("disabled......: %d\n",pmp3->disabled);
|
|
||||||
printf("bpm...........: %d\n",pmp3->bpm);
|
|
||||||
printf("has_video.....: %d\n",pmp3->has_video);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* dump suage
|
|
||||||
*/
|
|
||||||
|
|
||||||
void usage(int errorcode) {
|
|
||||||
fprintf(stderr,"Usage: %s [options] input-file\n\n",av0);
|
|
||||||
fprintf(stderr,"options:\n\n");
|
|
||||||
fprintf(stderr," -d level set debuglevel (9 is highest)\n");
|
|
||||||
fprintf(stderr," -c config read config file\n");
|
|
||||||
|
|
||||||
fprintf(stderr,"\n\n");
|
|
||||||
exit(errorcode);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
MP3FILE mp3;
|
|
||||||
SCANNERLIST *plist;
|
|
||||||
int option;
|
|
||||||
char *ext;
|
|
||||||
char *configfile = "mt-daapd.conf";
|
|
||||||
int debuglevel=1;
|
|
||||||
FILE *fin;
|
|
||||||
|
|
||||||
memset((void*)&mp3,0x00,sizeof(MP3FILE));
|
|
||||||
|
|
||||||
if(strchr(argv[0],'/')) {
|
|
||||||
av0 = strrchr(argv[0],'/')+1;
|
|
||||||
} else {
|
|
||||||
av0 = argv[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
while((option = getopt(argc, argv, "d:c:")) != -1) {
|
|
||||||
switch(option) {
|
|
||||||
case 'd':
|
|
||||||
debuglevel = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
configfile=optarg;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"Error: unknown option (%c)\n\n",option);
|
|
||||||
usage(-1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
argc -= optind;
|
|
||||||
argv += optind;
|
|
||||||
|
|
||||||
if(argc == 0) {
|
|
||||||
fprintf(stderr,"Error: Must specifiy file name\n\n");
|
|
||||||
usage(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Reading config file %s\n",configfile);
|
|
||||||
if(conf_read(configfile) != CONF_E_SUCCESS) {
|
|
||||||
fprintf(stderr,"Bummer.\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
err_setdest(LOGDEST_STDERR);
|
|
||||||
err_setlevel(debuglevel);
|
|
||||||
printf("Getting info for %s\n",argv[0]);
|
|
||||||
|
|
||||||
fin=fopen(argv[0],"r");
|
|
||||||
if(!fin) {
|
|
||||||
perror("fopen");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
fseek(fin,0,SEEK_END);
|
|
||||||
mp3.file_size = ftell(fin);
|
|
||||||
fclose(fin);
|
|
||||||
|
|
||||||
ext = strrchr(argv[0],'.')+1;
|
|
||||||
plist=scanner_list;
|
|
||||||
|
|
||||||
while(plist->ext && (strcasecmp(plist->ext,ext) != 0)) {
|
|
||||||
plist++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(plist->ext) {
|
|
||||||
fprintf(stderr,"dispatching as single-file metatag parser\n");
|
|
||||||
plist->scanner(argv[0],&mp3);
|
|
||||||
dump_mp3(&mp3);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr,"unknown file extension: %s\n",ext);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +0,0 @@
|
|||||||
CC=gcc
|
|
||||||
CFLAGS := $(CFLAGS) -g -I/sw/include -DHAVE_CONFIG_H -I. -I.. -DHOST='"foo"' -DHAVE_SQL -DHAVE_CONFIG_H
|
|
||||||
LDFLAGS := $(LDFLAGS) -L/sw/lib -lid3tag -logg -lvorbisfile -lFLAC -lvorbis -ltag_c -lsqlite -lsqlite3 -lm -framework CoreFoundation
|
|
||||||
TARGET = scanner
|
|
||||||
OBJECTS=scanner-driver.o restart.o err.o scan-aif.o scan-wma.o scan-aac.o scan-wav.o scan-flac.o scan-ogg.o scan-mp3.o scan-url.o scan-mpc.o os-unix.o conf.o ll.o xml-rpc.o webserver.o uici.o rend-win32.o configfile.o db-generic.o db-sql-sqlite3.o db-sql-sqlite2.o db-sql.o smart-parser.o plugin.o dynamic-art.o db-sql-updates.o
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
|
||||||
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJECTS) $(TARGET)
|
|
@ -1,110 +0,0 @@
|
|||||||
#include <fcntl.h>
|
|
||||||
#include <getopt.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "daapd.h"
|
|
||||||
#include "conf.h"
|
|
||||||
#include "err.h"
|
|
||||||
#include "os.h"
|
|
||||||
#include "plugin.h"
|
|
||||||
#include "webserver.h"
|
|
||||||
|
|
||||||
char *av0;
|
|
||||||
CONFIG config;
|
|
||||||
char *scan_winamp_genre[] = { NULL };
|
|
||||||
|
|
||||||
void usage(void) {
|
|
||||||
fprintf(stderr,"Usage: %s [options]\n\n",av0);
|
|
||||||
fprintf(stderr,"options:\n\n");
|
|
||||||
fprintf(stderr," -d level set debuglevel (9 is highest)\n");
|
|
||||||
fprintf(stderr," -c config read config file\n");
|
|
||||||
fprintf(stderr," -f file file to transcode\n");
|
|
||||||
fprintf(stderr," -p plugin plugin to use\n");
|
|
||||||
fprintf(stderr," -t codectype\n");
|
|
||||||
|
|
||||||
fprintf(stderr,"\n\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
int option;
|
|
||||||
int debuglevel;
|
|
||||||
char *plugin=NULL;
|
|
||||||
char *file=NULL;
|
|
||||||
char *codectype=NULL;
|
|
||||||
char *configfile="mt-daapd.conf";
|
|
||||||
int bytes_read;
|
|
||||||
char *pe;
|
|
||||||
WS_CONNINFO wsc;
|
|
||||||
|
|
||||||
if(strchr(argv[0],'/')) {
|
|
||||||
av0 = strrchr(argv[0],'/')+1;
|
|
||||||
} else {
|
|
||||||
av0 = argv[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
while((option = getopt(argc, argv, "d:c:f:p:t:")) != -1) {
|
|
||||||
switch(option) {
|
|
||||||
case 'd':
|
|
||||||
debuglevel = atoi(optarg);
|
|
||||||
break;
|
|
||||||
case 'c':
|
|
||||||
configfile=optarg;
|
|
||||||
break;
|
|
||||||
case 'f':
|
|
||||||
file = optarg;
|
|
||||||
break;
|
|
||||||
case 'p':
|
|
||||||
plugin = optarg;
|
|
||||||
break;
|
|
||||||
case 't':
|
|
||||||
codectype = optarg;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,"Error: unknown option (%c)\n\n",option);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if((!plugin) || (!file) || (!codectype)) {
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("Reading config file %s\n",configfile);
|
|
||||||
if(conf_read(configfile) != CONF_E_SUCCESS) {
|
|
||||||
fprintf(stderr,"Bummer.\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
err_setdest(LOGDEST_STDERR);
|
|
||||||
err_setlevel(debuglevel);
|
|
||||||
|
|
||||||
plugin_init();
|
|
||||||
if(plugin_load(&pe, plugin) != PLUGIN_E_SUCCESS) {
|
|
||||||
fprintf(stderr,"Could not load %s: %s\n",plugin, pe);
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* fake up a wsconninfo */
|
|
||||||
memset(&wsc,0,sizeof(wsc));
|
|
||||||
wsc.fd = open("out.wav",O_WRONLY | O_CREAT, 0666);
|
|
||||||
if(wsc.fd == -1) {
|
|
||||||
fprintf(stderr,"Error opening output file\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bytes_read=plugin_ssc_transcode(&wsc,file,codectype,60*1000*3, 0,0);
|
|
||||||
close(wsc.fd);
|
|
||||||
|
|
||||||
if(bytes_read < 1) {
|
|
||||||
fprintf(stderr,"Could not transcode\n");
|
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(stderr,"Transcoded %d bytes\n",bytes_read);
|
|
||||||
|
|
||||||
plugin_deinit();
|
|
||||||
}
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
CC=gcc
|
|
||||||
CFLAGS := $(CFLAGS) -g -I/sw/include -DHAVE_CONFIG_H -I. -I.. -DHOST='"foo"' -DHAVE_SQL -DHAVE_CONFIG_H
|
|
||||||
LDFLAGS := $(LDFLAGS) -L/sw/lib -lid3tag -logg -lvorbisfile -lFLAC -lvorbis -lsqlite -lsqlite3 -lm
|
|
||||||
TARGET = transcoder
|
|
||||||
OBJECTS=transcoder-driver.o restart.o err.o os-unix.o conf.o ll.o webserver.o uici.o configfile.o plugin.o xml-rpc.o db-generic.o smart-parser.o db-sql.o db-sql-sqlite2.o db-sql-sqlite3.o dispatch.o rend-win32.o dynamic-art.o scan-aac.o
|
|
||||||
|
|
||||||
$(TARGET): $(OBJECTS)
|
|
||||||
$(CC) -o $(TARGET) $(LDFLAGS) $(OBJECTS)
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJECTS) $(TARGET)
|
|
Loading…
x
Reference in New Issue
Block a user