diff --git a/src/helpers.cpp b/src/helpers.cpp index bd9b93a8..a366b283 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -40,6 +40,27 @@ const MPD::Song *currentSong(const BaseScreen *screen) return ptr; } +MPD::SongIterator getDatabaseIterator(MPD::Connection &mpd) +{ + MPD::SongIterator result; + try + { + result = mpd.GetDirectoryRecursive("/"); + } + catch (MPD::ClientError &e) + { + if (e.code() == MPD_ERROR_CLOSED) + { + // If we can't get the database, display appropriate + // error message and reconnect with the MPD server. + Statusbar::print("Unable to fetch the data, increase max_buffer_output_size in your MPD configuration file"); + mpd.Disconnect(); + mpd.Connect(); + } + } + return result; +} + typedef std::vector::const_iterator VectorSongIterator; bool addSongsToPlaylist(VectorSongIterator first, VectorSongIterator last, bool play, int position) { diff --git a/src/helpers.h b/src/helpers.h index 79dd6c64..9a100732 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -394,6 +394,8 @@ bool addSongToPlaylist(const MPD::Song &s, bool play, int position = -1); const MPD::Song *currentSong(const BaseScreen *screen); +MPD::SongIterator getDatabaseIterator(MPD::Connection &mpd); + std::string timeFormat(const char *format, time_t t); std::string Timestamp(time_t t); diff --git a/src/media_library.cpp b/src/media_library.cpp index 7e5fba12..2063141f 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -283,7 +283,7 @@ void MediaLibrary::update() { m_albums_update_request = false; std::map, time_t> albums; - for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s) + for (MPD::SongIterator s = getDatabaseIterator(Mpd), end; s != end; ++s) { std::string tag; unsigned idx = 0; @@ -326,7 +326,7 @@ void MediaLibrary::update() std::map tags; if (Config.media_library_sort_by_mtime) { - for (MPD::SongIterator s = Mpd.GetDirectoryRecursive("/"), end; s != end; ++s) + for (MPD::SongIterator s = getDatabaseIterator(Mpd), end; s != end; ++s) { std::string tag; unsigned idx = 0; diff --git a/src/search_engine.cpp b/src/search_engine.cpp index eb6b5ac4..7979c3d2 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -453,7 +453,7 @@ void SearchEngine::Search() input_song_iterator s, end; if (Config.search_in_db) { - s = input_song_iterator(Mpd.GetDirectoryRecursive("/")); + s = input_song_iterator(getDatabaseIterator(Mpd)); end = input_song_iterator(MPD::SongIterator()); } else