static int library_open(prop_t *page, const char *url, int sync) { const char *q; bmdb_t *b; prop_t *model = prop_create(page, "model"); url += strlen("library:"); if((q = mystrbegins(url, "albums:")) != NULL) { b = bmdb_query_create(q, LIBRARY_QUERY_ALBUMS, model); } else if((q = mystrbegins(url, "album:")) != NULL) { b = bmdb_query_create(q, LIBRARY_QUERY_ALBUM, model); prop_set(model, "contents", PROP_SET_STRING, "album"); } else if((q = mystrbegins(url, "artists:")) != NULL) { b = bmdb_query_create(q, LIBRARY_QUERY_ARTISTS, model); } else if((q = mystrbegins(url, "artist:")) != NULL) { b = bmdb_query_create(q, LIBRARY_QUERY_ARTIST, model); prop_set(model, "contents", PROP_SET_STRING, "artist"); } else { nav_open_error(page, "Invalid browse URL"); return 0; } hts_thread_create_detached("bmdbquery", bmdb_thread, b, THREAD_PRIO_LOW); return 0; }
static int be_file_open(prop_t *page, const char *url) { struct fa_stat fs; char errbuf[200]; if(fa_stat(url, &fs, errbuf, sizeof(errbuf))) return nav_open_error(page, errbuf); return fs.fs_type == CONTENT_DIR ? file_open_dir(page, url) : file_open_file(page, url, &fs); }
int nav_open_errorf(prop_t *root, rstr_t *fmt, ...) { va_list ap; char buf[200]; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), rstr_get(fmt), ap); va_end(ap); rstr_release(fmt); return nav_open_error(root, buf); }
static int be_file_open(prop_t *page, const char *url, int sync) { struct fa_stat fs; char errbuf[200]; if(fa_stat(url, &fs, errbuf, sizeof(errbuf))) { nav_open_error(page, errbuf); } else if(fs.fs_type == CONTENT_DIR) { file_open_dir(page, url, fs.fs_mtime); } else { file_open_file(page, url, &fs); } return 0; }
static int file_open_file(prop_t *page, const char *url, struct fa_stat *fs) { char redir[URL_MAX]; char errbuf[200]; int c; prop_t *meta; meta = prop_create_root("metadata"); c = fa_probe(meta, url, redir, sizeof(redir), errbuf, sizeof(errbuf), fs, 1); switch(c) { case CONTENT_ARCHIVE: case CONTENT_ALBUM: prop_destroy(meta); return file_open_dir(page, redir); case CONTENT_AUDIO: if(!file_open_audio(page, url)) { prop_destroy(meta); return 0; } playqueue_play(url, meta, 0); return playqueue_open(page); case CONTENT_VIDEO: case CONTENT_DVD: prop_destroy(meta); return backend_open_video(page, url); case CONTENT_IMAGE: return file_open_image(page, meta); case CONTENT_PLUGIN: plugin_open_file(page, url); return 0; default: prop_destroy(meta); return nav_open_error(page, errbuf); } }
int ecmascript_openuri(prop_t *page, const char *url, int sync) { hts_regmatch_t matches[8]; hts_mutex_lock(&route_mutex); es_route_t *er; LIST_FOREACH(er, &routes, er_link) if(!hts_regexec(&er->er_regex, url, 8, matches, 0)) break; if(er == NULL) { hts_mutex_unlock(&route_mutex); return 1; } es_resource_retain(&er->super); es_context_t *ec = er->super.er_ctx; hts_mutex_unlock(&route_mutex); es_context_begin(ec); duk_context *ctx = ec->ec_duk; es_push_root(ctx, er); es_stprop_push(ctx, page); duk_push_boolean(ctx, sync); int array_idx = duk_push_array(ctx); for(int i = 1; i < 8; i++) { if(matches[i].rm_so == -1) break; duk_push_lstring(ctx, url + matches[i].rm_so, matches[i].rm_eo - matches[i].rm_so); duk_put_prop_index(ctx, array_idx, i-1); } int rc = duk_pcall(ctx, 3); if(rc) { if(duk_is_string(ctx, -1)) { nav_open_error(page, duk_to_string(ctx, -1)); } else { duk_get_prop_string(ctx, -1, "message"); nav_open_error(page, duk_to_string(ctx, -1)); duk_pop(ctx); } es_dump_err(ctx); } duk_pop(ctx); es_context_end(ec); es_resource_release(&er->super); return 0; }