scanner: Add an extra level if there are multiple media locations.

Before, the top level of folder browsing could be messy if you were
using multiple media directories.  This should tidyt things up.
This commit is contained in:
Justin Maggard 2014-01-31 17:43:58 -08:00
parent 16b0963a5b
commit 5b35d3a165
2 changed files with 50 additions and 26 deletions

View File

@ -382,7 +382,7 @@ insert_containers(const char *name, const char *path, const char *refID, const c
valid_cache = 1; valid_cache = 1;
} }
int int64_t
insert_directory(const char *name, const char *path, const char *base, const char *parentID, int objectID) insert_directory(const char *name, const char *path, const char *base, const char *parentID, int objectID)
{ {
int64_t detailID = 0; int64_t detailID = 0;
@ -440,7 +440,8 @@ insert_directory(const char *name, const char *path, const char *base, const cha
"VALUES" "VALUES"
" ('%s%s$%X', '%s%s', %lld, '%s', '%q')", " ('%s%s$%X', '%s%s', %lld, '%s', '%q')",
base, parentID, objectID, base, parentID, detailID, class, name); base, parentID, objectID, base, parentID, detailID, class, name);
return 0;
return detailID;
} }
int int
@ -688,7 +689,7 @@ filter_avp(scan_filter *d)
); );
} }
void static void
ScanDirectory(const char *dir, const char *parent, media_types dir_types) ScanDirectory(const char *dir, const char *parent, media_types dir_types)
{ {
struct dirent **namelist; struct dirent **namelist;
@ -779,40 +780,63 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types)
} }
} }
void static void
start_scanner() _notify_start(void)
{ {
struct media_dir_s *media_path = media_dirs;
char name[MAXPATHLEN];
if (setpriority(PRIO_PROCESS, 0, 15) == -1)
DPRINTF(E_WARN, L_INOTIFY, "Failed to reduce scanner thread priority\n");
#ifdef READYNAS #ifdef READYNAS
FILE *flag = fopen("/ramfs/.upnp-av_scan", "w"); FILE *flag = fopen("/ramfs/.upnp-av_scan", "w");
if( flag ) if( flag )
fclose(flag); fclose(flag);
#endif #endif
setlocale(LC_COLLATE, "");
av_register_all();
av_log_set_level(AV_LOG_PANIC);
while( media_path )
{
int64_t id;
strncpyt(name, media_path->path, sizeof(name));
id = GetFolderMetadata(basename(name), media_path->path, NULL, NULL, 0);
/* Use TIMESTAMP to store the media type */
sql_exec(db, "UPDATE DETAILS set TIMESTAMP = %d where ID = %lld", media_path->types, (long long)id);
ScanDirectory(media_path->path, NULL, media_path->types);
sql_exec(db, "INSERT into SETTINGS values (%Q, %Q)", "media_dir", media_path->path);
media_path = media_path->next;
} }
static void
_notify_stop(void)
{
#ifdef READYNAS #ifdef READYNAS
if( access("/ramfs/.rescan_done", F_OK) == 0 ) if( access("/ramfs/.rescan_done", F_OK) == 0 )
system("/bin/sh /ramfs/.rescan_done"); system("/bin/sh /ramfs/.rescan_done");
unlink("/ramfs/.upnp-av_scan"); unlink("/ramfs/.upnp-av_scan");
#endif #endif
}
void
start_scanner()
{
struct media_dir_s *media_path;
char path[MAXPATHLEN];
if (setpriority(PRIO_PROCESS, 0, 15) == -1)
DPRINTF(E_WARN, L_INOTIFY, "Failed to reduce scanner thread priority\n");
_notify_start();
setlocale(LC_COLLATE, "");
av_register_all();
av_log_set_level(AV_LOG_PANIC);
for( media_path = media_dirs; media_path != NULL; media_path = media_path->next )
{
int64_t id;
char *bname, *parent = NULL;
char buf[8];
strncpyt(path, media_path->path, sizeof(path));
bname = basename(path);
/* If there are multiple media locations, add a level to the ContentDirectory */
if( media_dirs && media_dirs->next )
{
int startID = get_next_available_id("OBJECTS", BROWSEDIR_ID);
id = insert_directory(bname, path, BROWSEDIR_ID, "", startID);
sprintf(buf, "$%X", startID);
parent = buf;
}
else
id = GetFolderMetadata(bname, media_path->path, NULL, NULL, 0);
/* Use TIMESTAMP to store the media type */
sql_exec(db, "UPDATE DETAILS set TIMESTAMP = %d where ID = %lld", media_path->types, (long long)id);
ScanDirectory(media_path->path, parent, media_path->types);
sql_exec(db, "INSERT into SETTINGS values (%Q, %Q)", "media_dir", media_path->path);
}
_notify_stop();
/* Create this index after scanning, so it doesn't slow down the scanning process. /* Create this index after scanning, so it doesn't slow down the scanning process.
* This index is very useful for large libraries used with an XBox360 (or any * This index is very useful for large libraries used with an XBox360 (or any
* client that uses UPnPSearch on large containers). */ * client that uses UPnPSearch on large containers). */

View File

@ -71,7 +71,7 @@ is_image(const char *file);
int64_t int64_t
get_next_available_id(const char *table, const char *parentID); get_next_available_id(const char *table, const char *parentID);
int int64_t
insert_directory(const char *name, const char *path, const char *base, const char *parentID, int objectID); insert_directory(const char *name, const char *path, const char *base, const char *parentID, int objectID);
int int