From 5b35d3a165f57b858d0f5214ef931cf5033cfec1 Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Fri, 31 Jan 2014 17:43:58 -0800 Subject: [PATCH] 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. --- scanner.c | 74 ++++++++++++++++++++++++++++++++++++------------------- scanner.h | 2 +- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/scanner.c b/scanner.c index 67d9617..1a0dc13 100644 --- a/scanner.c +++ b/scanner.c @@ -382,7 +382,7 @@ insert_containers(const char *name, const char *path, const char *refID, const c valid_cache = 1; } -int +int64_t insert_directory(const char *name, const char *path, const char *base, const char *parentID, int objectID) { int64_t detailID = 0; @@ -440,7 +440,8 @@ insert_directory(const char *name, const char *path, const char *base, const cha "VALUES" " ('%s%s$%X', '%s%s', %lld, '%s', '%q')", base, parentID, objectID, base, parentID, detailID, class, name); - return 0; + + return detailID; } int @@ -688,7 +689,7 @@ filter_avp(scan_filter *d) ); } -void +static void ScanDirectory(const char *dir, const char *parent, media_types dir_types) { struct dirent **namelist; @@ -779,40 +780,63 @@ ScanDirectory(const char *dir, const char *parent, media_types dir_types) } } -void -start_scanner() +static void +_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 FILE *flag = fopen("/ramfs/.upnp-av_scan", "w"); if( flag ) fclose(flag); #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 if( access("/ramfs/.rescan_done", F_OK) == 0 ) system("/bin/sh /ramfs/.rescan_done"); unlink("/ramfs/.upnp-av_scan"); #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. * This index is very useful for large libraries used with an XBox360 (or any * client that uses UPnPSearch on large containers). */ diff --git a/scanner.h b/scanner.h index f194fac..565bcb3 100644 --- a/scanner.h +++ b/scanner.h @@ -71,7 +71,7 @@ is_image(const char *file); int64_t 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); int