mirror of
https://github.com/owntone/owntone-server.git
synced 2025-03-20 04:24:20 -04:00
Determine song length of aac files
This commit is contained in:
parent
1003467e63
commit
6795f24fae
@ -241,7 +241,10 @@ int scan_path(char *path);
|
|||||||
int scan_gettags(char *file, MP3FILE *pmp3);
|
int scan_gettags(char *file, MP3FILE *pmp3);
|
||||||
int scan_get_mp3tags(char *file, MP3FILE *pmp3);
|
int scan_get_mp3tags(char *file, MP3FILE *pmp3);
|
||||||
int scan_get_aactags(char *file, MP3FILE *pmp3);
|
int scan_get_aactags(char *file, MP3FILE *pmp3);
|
||||||
int scan_getfileinfo(char *file, MP3FILE *pmp3);
|
int scan_get_fileinfo(char *file, MP3FILE *pmp3);
|
||||||
|
int scan_get_mp3fileinfo(char *file, MP3FILE *pmp3);
|
||||||
|
int scan_get_aacfileinfo(char *file, MP3FILE *pmp3);
|
||||||
|
|
||||||
int scan_freetags(MP3FILE *pmp3);
|
int scan_freetags(MP3FILE *pmp3);
|
||||||
void scan_static_playlist(char *path, struct dirent *pde, struct stat *psb);
|
void scan_static_playlist(char *path, struct dirent *pde, struct stat *psb);
|
||||||
void scan_music_file(char *path, struct dirent *pde, struct stat *psb);
|
void scan_music_file(char *path, struct dirent *pde, struct stat *psb);
|
||||||
@ -436,7 +439,7 @@ void scan_music_file(char *path, struct dirent *pde, struct stat *psb) {
|
|||||||
|
|
||||||
/* Do the tag lookup here */
|
/* Do the tag lookup here */
|
||||||
if(!scan_gettags(mp3file.path,&mp3file) &&
|
if(!scan_gettags(mp3file.path,&mp3file) &&
|
||||||
!scan_getfileinfo(mp3file.path,&mp3file)) {
|
!scan_get_fileinfo(mp3file.path,&mp3file)) {
|
||||||
db_add(&mp3file);
|
db_add(&mp3file);
|
||||||
pl_eval(&mp3file); /* FIXME: move to db_add? */
|
pl_eval(&mp3file); /* FIXME: move to db_add? */
|
||||||
} else {
|
} else {
|
||||||
@ -604,6 +607,12 @@ int scan_gettags(char *file, MP3FILE *pmp3) {
|
|||||||
if(!strcasecmp(pmp3->type,".m4a"))
|
if(!strcasecmp(pmp3->type,".m4a"))
|
||||||
return scan_get_aactags(file,pmp3);
|
return scan_get_aactags(file,pmp3);
|
||||||
|
|
||||||
|
if(!strcasecmp(pmp3->type,".m4p"))
|
||||||
|
return scan_get_aactags(file,pmp3);
|
||||||
|
|
||||||
|
if(!strcasecmp(pmp3->type,".mp4"))
|
||||||
|
return scan_get_aactags(file,pmp3);
|
||||||
|
|
||||||
/* should handle mp3 in the same way */
|
/* should handle mp3 in the same way */
|
||||||
if(!strcasecmp(pmp3->type,".mp3"))
|
if(!strcasecmp(pmp3->type,".mp3"))
|
||||||
return scan_get_mp3tags(file,pmp3);
|
return scan_get_mp3tags(file,pmp3);
|
||||||
@ -631,9 +640,6 @@ int scan_get_mp3tags(char *file, MP3FILE *pmp3) {
|
|||||||
id3_ucs4_t const *native_text;
|
id3_ucs4_t const *native_text;
|
||||||
char *tmp;
|
char *tmp;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if(strcasecmp(pmp3->type,".mp3")) /* can't get tags for non-mp3 */
|
if(strcasecmp(pmp3->type,".mp3")) /* can't get tags for non-mp3 */
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -758,13 +764,89 @@ int scan_freetags(MP3FILE *pmp3) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* scan_getfileinfo
|
* scan_get_fileinfo
|
||||||
|
*
|
||||||
|
* Dispatch to actual file info handlers
|
||||||
|
*/
|
||||||
|
int scan_get_fileinfo(char *file, MP3FILE *pmp3) {
|
||||||
|
FILE *infile;
|
||||||
|
off_t file_size;
|
||||||
|
|
||||||
|
if(strcasestr(".aac.m4a.m4p.mp4",pmp3->type))
|
||||||
|
return scan_get_aacfileinfo(file,pmp3);
|
||||||
|
|
||||||
|
if(!strcasecmp(pmp3->type,".mp3"))
|
||||||
|
return scan_get_mp3fileinfo(file,pmp3);
|
||||||
|
|
||||||
|
/* a file we don't know anything about... ogg or aiff maybe */
|
||||||
|
if(!(infile=fopen(file,"rb"))) {
|
||||||
|
DPRINTF(ERR_WARN,"Could not open %s for reading\n",file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we can at least get this */
|
||||||
|
fseek(infile,0,SEEK_END);
|
||||||
|
file_size=ftell(infile);
|
||||||
|
fseek(infile,0,SEEK_SET);
|
||||||
|
|
||||||
|
pmp3->file_size=file_size;
|
||||||
|
|
||||||
|
fclose(infile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scan_get_aacfileinfo
|
||||||
|
*
|
||||||
|
* Get info from the actual aac headers
|
||||||
|
*/
|
||||||
|
int scan_get_aacfileinfo(char *file, MP3FILE *pmp3) {
|
||||||
|
FILE *infile;
|
||||||
|
long atom_offset;
|
||||||
|
int atom_length;
|
||||||
|
int temp_int;
|
||||||
|
off_t file_size;
|
||||||
|
|
||||||
|
DPRINTF(ERR_DEBUG,"Getting AAC file info\n");
|
||||||
|
|
||||||
|
if(!(infile=fopen(file,"rb"))) {
|
||||||
|
DPRINTF(ERR_WARN,"Could not open %s for reading\n",file);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek(infile,0,SEEK_END);
|
||||||
|
file_size=ftell(infile);
|
||||||
|
fseek(infile,0,SEEK_SET);
|
||||||
|
|
||||||
|
pmp3->file_size=file_size;
|
||||||
|
|
||||||
|
/* now, hunt for the mvhd atom */
|
||||||
|
atom_offset=scan_aac_findatom(infile,file_size,"moov",&atom_length);
|
||||||
|
if(atom_offset != -1) {
|
||||||
|
atom_offset=scan_aac_findatom(infile,atom_length-8,"mvhd",&atom_length);
|
||||||
|
if(atom_offset != -1) {
|
||||||
|
fseek(infile,16,SEEK_CUR);
|
||||||
|
fread((void*)&temp_int,1,sizeof(int),infile);
|
||||||
|
temp_int=ntohl(temp_int);
|
||||||
|
pmp3->song_length=temp_int/600;
|
||||||
|
DPRINTF(ERR_DEBUG,"Song length: %d seconds\n",temp_int/600);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(infile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* scan_get_mp3fileinfo
|
||||||
*
|
*
|
||||||
* Get information from the file headers itself -- like
|
* Get information from the file headers itself -- like
|
||||||
* song length, bit rate, etc.
|
* song length, bit rate, etc.
|
||||||
*/
|
*/
|
||||||
int scan_getfileinfo(char *file, MP3FILE *pmp3) {
|
int scan_get_mp3fileinfo(char *file, MP3FILE *pmp3) {
|
||||||
FILE *infile;
|
FILE *infile;
|
||||||
SCAN_ID3HEADER *pid3;
|
SCAN_ID3HEADER *pid3;
|
||||||
unsigned int size=0;
|
unsigned int size=0;
|
||||||
@ -790,11 +872,6 @@ int scan_getfileinfo(char *file, MP3FILE *pmp3) {
|
|||||||
|
|
||||||
pmp3->file_size=file_size;
|
pmp3->file_size=file_size;
|
||||||
|
|
||||||
if(strcasecmp(pmp3->type,".mp3")) { /* can't get bit-info for non-mp3 */
|
|
||||||
fclose(infile);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
fread(buffer,1,sizeof(buffer),infile);
|
fread(buffer,1,sizeof(buffer),infile);
|
||||||
pid3=(SCAN_ID3HEADER*)buffer;
|
pid3=(SCAN_ID3HEADER*)buffer;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user