int resolve_unknown_type(const char * path, media_types dir_type) { struct stat entry; unsigned char type = TYPE_UNKNOWN; char str_buf[PATH_MAX]; ssize_t len; if( lstat(path, &entry) == 0 ) { if( S_ISLNK(entry.st_mode) ) { if( (len = readlink(path, str_buf, PATH_MAX-1)) > 0 ) { str_buf[len] = '\0'; //DEBUG DPRINTF(E_DEBUG, L_GENERAL, "Checking for recursive symbolic link: %s (%s)\n", path, str_buf); if( strncmp(path, str_buf, strlen(str_buf)) == 0 ) { DPRINTF(E_DEBUG, L_GENERAL, "Ignoring recursive symbolic link: %s (%s)\n", path, str_buf); return type; } } stat(path, &entry); } if( S_ISDIR(entry.st_mode) ) { type = TYPE_DIR; } else if( S_ISREG(entry.st_mode) ) { switch( dir_type ) { case ALL_MEDIA: if( is_image(path) || is_audio(path) || is_video(path) || is_playlist(path) ) type = TYPE_FILE; break; case TYPE_AUDIO: if( is_audio(path) || is_playlist(path) ) type = TYPE_FILE; break; case TYPE_VIDEO: if( is_video(path) ) type = TYPE_FILE; break; case TYPE_IMAGES: if( is_image(path) ) type = TYPE_FILE; break; default: break; } } } return type; }
static int recurse(const char * path) { FTS *fts; FTSENT *ftsent; char * const apath[] = { strdup(path), NULL }; fts = fts_open(apath,FTS_NOCHDIR|FTS_NOSTAT|FTS_COMFOLLOW, NULL); if ( NULL == fts) { ERROR("fts_open(%s) failed", path); return EXIT_FAILURE; } while ((ftsent = fts_read(fts))) switch (ftsent->fts_info) { case FTS_F: if ( is_video(ftsent) ) if ( convert_video(ftsent) ) ERROR("conversion failed: %s", ftsent->fts_path); break; case FTS_SLNONE: case FTS_NS: case FTS_ERR: ERROR("fts_read: %s (%s)", ftsent->fts_path, strerror(errno)); default:(void)0; } fts_close(fts); free(apath[0]); return EXIT_SUCCESS; }
int resolve_unknown_type(const char * path, enum media_types dir_type) { struct stat entry; unsigned char type = TYPE_UNKNOWN; if( stat(path, &entry) == 0 ) { if( S_ISDIR(entry.st_mode) ) { type = TYPE_DIR; } else if( S_ISREG(entry.st_mode) ) { switch( dir_type ) { case ALL_MEDIA: if( is_image(path) || is_audio(path) || is_video(path) || is_playlist(path) ) type = TYPE_FILE; break; case AUDIO_ONLY: if( is_audio(path) || is_playlist(path) ) type = TYPE_FILE; break; case VIDEO_ONLY: if( is_video(path) ) type = TYPE_FILE; break; case IMAGES_ONLY: if( is_image(path) ) type = TYPE_FILE; break; default: break; } } } return type; }
/* And our main album art functions */ void update_if_album_art(const char *path) { char *dir; char *match; char file[MAXPATHLEN]; char fpath[MAXPATHLEN]; char dpath[MAXPATHLEN]; int ncmp = 0; int album_art; DIR *dh; struct dirent *dp; enum file_types type = TYPE_UNKNOWN; int64_t art_id = 0; int ret; strncpyt(fpath, path, sizeof(fpath)); match = basename(fpath); /* Check if this file name matches a specific audio or video file */ if( ends_with(match, ".cover.jpg") ) { ncmp = strlen(match)-10; } else { ncmp = strrchr(match, '.') - match; } /* Check if this file name matches one of the default album art names */ album_art = is_album_art(match); strncpyt(dpath, path, sizeof(dpath)); dir = dirname(dpath); dh = opendir(dir); if( !dh ) return; while ((dp = readdir(dh)) != NULL) { switch( dp->d_type ) { case DT_REG: type = TYPE_FILE; break; case DT_LNK: case DT_UNKNOWN: snprintf(file, sizeof(file), "%s/%s", dir, dp->d_name); type = resolve_unknown_type(file, ALL_MEDIA); break; default: type = TYPE_UNKNOWN; break; } if( type != TYPE_FILE ) continue; if( (*(dp->d_name) != '.') && (is_video(dp->d_name) || is_audio(dp->d_name)) && (album_art || strncmp(dp->d_name, match, ncmp) == 0) ) { DPRINTF(E_DEBUG, L_METADATA, "New file %s looks like cover art for %s\n", path, dp->d_name); snprintf(file, sizeof(file), "%s/%s", dir, dp->d_name); art_id = find_album_art(file, NULL, 0); ret = sql_exec(db, "UPDATE DETAILS set ALBUM_ART = %lld where PATH = '%q'", (long long)art_id, file); if( ret != SQLITE_OK ) DPRINTF(E_WARN, L_METADATA, "Error setting %s as cover art for %s\n", match, dp->d_name); } } closedir(dh); }
bool mmg_track_t::is_webm_compatible() { static wxRegEx re_valid_webm_codecs(wxT("VP8|Vorbis"), wxRE_ICASE); return (is_audio() || is_video()) && re_valid_webm_codecs.Matches(ctype); }
static void select_callback(mvp_widget_t *widget, char *item, void *key) { char path[1024], *ptr; struct stat64 sb; sprintf(path, "%s/%s", cwd, item); if (stat64(path, &sb)!=0) { printf("Could not stat %s error %d\n",item,errno); if (strcmp(item,"../")==0 ) { // probably lost network put you back in root strcpy(cwd,"/"); strcpy(path,"/"); stat64(path, &sb); } } if (current_pl && !is_playlist(item)) { free(current_pl); current_pl = NULL; } if (current_pl && (playlist == NULL)) { free(current_pl); current_pl = NULL; } printf("%s(): path '%s'\n", __FUNCTION__, path); if (current && (strcmp(path, current) == 0)) { printf("selected current item\n"); if (is_video(item) || (is_streaming(item) > 100)) { mvpw_hide(widget); mvpw_hide(fb_progress); av_move(0, 0, 0); screensaver_disable(); return; } } if (current_pl && (strcmp(path, current_pl) == 0)) { if (is_playlist(item)) { mvpw_show(fb_progress); mvpw_set_timer(fb_progress, fb_osd_update, 500); mvpw_hide(widget); printf("Show playlist menu\n"); mvpw_show(playlist_widget); mvpw_focus(playlist_widget); return; } } if (S_ISDIR(sb.st_mode)) { if (strcmp(item, "../") == 0) { strcpy(path, cwd); if (path[strlen(path)-1] == '/') path[strlen(path)-1] = '\0'; if ((ptr=strrchr(path, '/')) != NULL) *ptr = '\0'; if (path[0] == '\0') sprintf(path, "/"); } else { if ((ptr=strrchr(path, '/')) != NULL) *ptr = '\0'; } if (strstr(path,"/uPnP")!=NULL && strstr(cwd,"/uPnP")==NULL ){ mount_djmount(path); } else if (strstr(path,"/uPnP")==NULL && strstr(cwd,"/uPnP")!=NULL ) { unmount_djmount(); } strncpy(cwd, path, sizeof(cwd)); while ((cwd[0] == '/') && (cwd[1] == '/')) memmove(cwd, cwd+1, strlen(cwd)); mvpw_clear_menu(widget); mvpw_set_menu_title(widget, cwd); busy_start(); add_dirs(widget); add_files(widget); busy_end(); mvpw_expose(widget); } else { switch_hw_state(MVPMC_STATE_FILEBROWSER); if (current) free(current); current = NULL; audio_stop = 1; pthread_kill(audio_thread, SIGURG); while (audio_playing) usleep(1000); current = strdup(path); if (is_streaming(item) > 100) { // Use VLC callbacks for streaming items video_functions = &vlc_functions; // Allow broadcast messages to be sent so // we can tell VLC to start the stream vlc_broadcast_enabled = 1; } else { video_functions = &file_functions; } add_osd_widget(fb_program_widget, OSD_PROGRAM, osd_settings.program, NULL); mvpw_set_text_str(fb_name, item); /* * This code sends the currently playing file name to the display. */ snprintf(display_message, sizeof(display_message), "File:%s\n", item); display_send(display_message); audio_clear(); video_clear(); playlist_clear(); if (is_video(item)) { if (key != NULL) { mvpw_hide(widget); mvpw_hide(fb_progress); av_move(0, 0, 0); } else { mvpw_show(fb_progress); } mvpw_set_timer(fb_progress, fb_osd_update, 500); video_play(NULL); mvpw_show(root); mvpw_expose(root); mvpw_focus(root); } else if (is_audio(item) || is_streaming(item)>=0 ) { mvpw_show(fb_progress); mvpw_set_timer(fb_progress, fb_osd_update, 500); audio_play(NULL); } else if (is_image(item)) { mvpw_hide(widget); printf("Displaying image '%s'\n", path); if (mvpw_load_image_jpeg(iw, path) == 0) { mvpw_show_image_jpeg(iw); av_wss_update_aspect(WSS_ASPECT_UNKNOWN); } else { mvpw_set_image(iw, path); } mvpw_show(iw); mvpw_focus(iw); loaded_offset = 0; loaded_status = 0; fb_next_image(1); } else if (is_playlist(item)) { if (current_pl) free(current_pl); current_pl = strdup(path); mvpw_show(fb_progress); mvpw_set_timer(fb_progress, fb_osd_update, 500); mvpw_hide(widget); printf("Show playlist menu\n"); mvpw_show(playlist_widget); mvpw_focus(playlist_widget); playlist_clear(); playlist_play(NULL); } } }
/* And our main album art functions */ void update_if_album_art(const char * path) { char * dir; char * match = NULL; char * file = NULL; int ncmp = 0; struct album_art_name_s * album_art_name; DIR * dh; struct dirent *dp; enum file_types type = TYPE_UNKNOWN; sqlite_int64 art_id = 0; match = strdup(basename((char *)path)); /* Check if this file name matches a specific audio or video file */ if( ends_with(match, ".cover.jpg") ) { ncmp = strlen(match)-10; } else { ncmp = strrchr(match, '.')-match; } /* Check if this file name matches one of the default album art names */ for( album_art_name = album_art_names; album_art_name; album_art_name = album_art_name->next ) { if( strcmp(album_art_name->name, match) == 0 ) break; } dir = dirname(strdup(path)); dh = opendir(dir); if( !dh ) return; while ((dp = readdir(dh)) != NULL) { switch( dp->d_type ) { case DT_REG: type = TYPE_FILE; break; case DT_LNK: case DT_UNKNOWN: asprintf(&file, "%s/%s", dir, dp->d_name); type = resolve_unknown_type(file, ALL_MEDIA); free(file); break; default: type = TYPE_UNKNOWN; break; } if( type != TYPE_FILE ) continue; if( (*(dp->d_name) != '.') && (is_video(dp->d_name) || is_audio(dp->d_name)) && (album_art_name || strncmp(dp->d_name, match, ncmp) == 0) ) { DPRINTF(E_DEBUG, L_METADATA, "New file %s looks like cover art for %s\n", path, dp->d_name); asprintf(&file, "%s/%s", dir, dp->d_name); art_id = find_album_art(file, NULL, 0); if( sql_exec(db, "UPDATE DETAILS set ALBUM_ART = %lld where PATH = '%q'", art_id, file) != SQLITE_OK ) DPRINTF(E_WARN, L_METADATA, "Error setting %s as cover art for %s\n", match, dp->d_name); free(file); } } closedir(dh); free(dir); free(match); }