Mercurial > audlegacy
view src/audacious/ui_albumart.c @ 2893:fb30d861b1f5 trunk
branch merge
author | William Pitcock <nenolod@atheme.org> |
---|---|
date | Sun, 24 Jun 2007 05:33:57 -0500 |
parents | 7dad846ec699 |
children | 062324422c40 |
line wrap: on
line source
/* * audacious: Cross-platform multimedia player. * ui_albumart.c: Location and management of album artwork images. * * Copyright (c) 2005-2007 Audacious development team. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <glib.h> #include <glib/gi18n.h> #include <gtk/gtk.h> #include <string.h> #include "titlestring.h" #include "ui_fileinfopopup.h" #include "main.h" #include "ui_main.h" #include "playlist.h" #include "playback.h" static gboolean has_front_cover_extension(const gchar *name) { char *ext; ext = strrchr(name, '.'); if (!ext) { /* No file extension */ return FALSE; } return g_strcasecmp(ext, ".jpg") == 0 || g_strcasecmp(ext, ".jpeg") == 0 || g_strcasecmp(ext, ".png") == 0; } static gboolean cover_name_filter(const gchar *name, const gchar *filter, const gboolean ret_on_empty) { gboolean result = FALSE; gchar **splitted; gchar *current; gchar *lname; gint i; if (!filter || strlen(filter) == 0) { return ret_on_empty; } splitted = g_strsplit(filter, ",", 0); lname = g_strdup(name); g_strdown(lname); for (i = 0; !result && (current = splitted[i]); i++) { gchar *stripped = g_strstrip(g_strdup(current)); g_strdown(stripped); result = result || strstr(lname, stripped); g_free(stripped); } g_free(lname); g_strfreev(splitted); return result; } /* Check wether it's an image we want */ static gboolean is_front_cover_image(const gchar *imgfile) { return cover_name_filter(imgfile, cfg.cover_name_include, TRUE) && !cover_name_filter(imgfile, cfg.cover_name_exclude, FALSE); } static gboolean is_file_image(const gchar *imgfile, const gchar *file_name) { char *imgfile_ext, *file_name_ext; size_t imgfile_len, file_name_len; imgfile_ext = strrchr(imgfile, '.'); if (!imgfile_ext) { /* No file extension */ return FALSE; } file_name_ext = strrchr(file_name, '.'); if (!file_name_ext) { /* No file extension */ return FALSE; } imgfile_len = (imgfile_ext - imgfile); file_name_len = (file_name_ext - file_name); if (imgfile_len == file_name_len) { return (g_ascii_strncasecmp(imgfile, file_name, imgfile_len) == 0); } else { return FALSE; } } gchar* fileinfo_recursive_get_image(const gchar* path, const gchar* file_name, gint depth) { GDir *d; if (cfg.recurse_for_cover && depth > cfg.recurse_for_cover_depth) return NULL; d = g_dir_open(path, 0, NULL); if (d) { const gchar *f; if (cfg.use_file_cover && file_name) { /* Look for images matching file name */ while((f = g_dir_read_name(d))) { gchar *newpath = g_strconcat(path, "/", f, NULL); if (!g_file_test(newpath, G_FILE_TEST_IS_DIR) && has_front_cover_extension(f) && is_file_image(f, file_name)) { g_dir_close(d); return newpath; } g_free(newpath); } g_dir_rewind(d); } /* Search for files using filter */ while ((f = g_dir_read_name(d))) { gchar *newpath = g_strconcat(path, "/", f, NULL); if (!g_file_test(newpath, G_FILE_TEST_IS_DIR) && has_front_cover_extension(f) && is_front_cover_image(f)) { g_dir_close(d); return newpath; } g_free(newpath); } g_dir_rewind(d); /* checks whether recursive or not. */ if (!cfg.recurse_for_cover) { g_dir_close(d); return NULL; } /* Descend into directories recursively. */ while ((f = g_dir_read_name(d))) { gchar *newpath = g_strconcat(path, "/", f, NULL); if(g_file_test(newpath, G_FILE_TEST_IS_DIR)) { gchar *tmp = fileinfo_recursive_get_image(newpath, NULL, depth + 1); if(tmp) { g_free(newpath); g_dir_close(d); return tmp; } } g_free(newpath); } g_dir_close(d); } return NULL; }