|
|
@ -77,6 +77,49 @@ std::string waybar::modules::MPD::getTag(mpd_tag_type type, unsigned idx) const
|
|
|
|
return result;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Glib::ustring waybar::modules::MPD::getArtistTitleOrFilename() const {
|
|
|
|
|
|
|
|
const char* artist = mpd_song_get_tag(this->song_.get(), MPD_TAG_ARTIST, 0);
|
|
|
|
|
|
|
|
const char* title = mpd_song_get_tag(this->song_.get(), MPD_TAG_TITLE, 0);
|
|
|
|
|
|
|
|
// https://mpd.readthedocs.io/en/latest/protocol.html#tags
|
|
|
|
|
|
|
|
const char* name = mpd_song_get_tag(this->song_.get(), MPD_TAG_NAME, 0);
|
|
|
|
|
|
|
|
// it is important to use Glib::ustring here, as filenames may be utf8 encoded
|
|
|
|
|
|
|
|
// DECO*27 x ピノキオピー - デビルじゃないもん feat. 初音ミク-lMEt3RdqB9Y.m4a
|
|
|
|
|
|
|
|
Glib::ustring result;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
auto starts_with = [&](const Glib::ustring& str, const char* other) {
|
|
|
|
|
|
|
|
size_t other_len = strlen(other);
|
|
|
|
|
|
|
|
if (str.size() < other_len) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (size_t i = 0; i < other_len; i++) {
|
|
|
|
|
|
|
|
if (str[i] != other[i]) {
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (title || name) {
|
|
|
|
|
|
|
|
result = title ? title : name;
|
|
|
|
|
|
|
|
bool prepend_artist = artist != nullptr && !starts_with(result, artist);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (config_["title-len"].isInt()) {
|
|
|
|
|
|
|
|
result = result.substr(0, config_["title-len"].asInt());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (prepend_artist) {
|
|
|
|
|
|
|
|
result = std::string(artist) + " - " + std::move(result);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
result = this->getFilename();
|
|
|
|
|
|
|
|
if (config_["title-len"].isInt()) {
|
|
|
|
|
|
|
|
result = result.substr(0, config_["title-len"].asInt());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::string waybar::modules::MPD::getFilename() const {
|
|
|
|
std::string waybar::modules::MPD::getFilename() const {
|
|
|
|
std::string path = mpd_song_get_uri(song_.get());
|
|
|
|
std::string path = mpd_song_get_uri(song_.get());
|
|
|
|
size_t position = path.find_last_of("/");
|
|
|
|
size_t position = path.find_last_of("/");
|
|
|
@ -117,7 +160,7 @@ void waybar::modules::MPD::setLabel() {
|
|
|
|
label_.get_style_context()->remove_class("disconnected");
|
|
|
|
label_.get_style_context()->remove_class("disconnected");
|
|
|
|
|
|
|
|
|
|
|
|
auto format = format_;
|
|
|
|
auto format = format_;
|
|
|
|
Glib::ustring artist, album_artist, album, title;
|
|
|
|
Glib::ustring artist, album_artist, album, title, artist_title_or_filename;
|
|
|
|
std::string date, filename;
|
|
|
|
std::string date, filename;
|
|
|
|
int song_pos = 0, queue_length = 0, volume = 0;
|
|
|
|
int song_pos = 0, queue_length = 0, volume = 0;
|
|
|
|
std::chrono::seconds elapsedTime, totalTime;
|
|
|
|
std::chrono::seconds elapsedTime, totalTime;
|
|
|
@ -151,6 +194,7 @@ void waybar::modules::MPD::setLabel() {
|
|
|
|
title = sanitize_string(getTag(MPD_TAG_TITLE));
|
|
|
|
title = sanitize_string(getTag(MPD_TAG_TITLE));
|
|
|
|
date = sanitize_string(getTag(MPD_TAG_DATE));
|
|
|
|
date = sanitize_string(getTag(MPD_TAG_DATE));
|
|
|
|
filename = sanitize_string(getFilename());
|
|
|
|
filename = sanitize_string(getFilename());
|
|
|
|
|
|
|
|
artist_title_or_filename = sanitize_string(this->getArtistTitleOrFilename());
|
|
|
|
song_pos = mpd_status_get_song_pos(status_.get()) + 1;
|
|
|
|
song_pos = mpd_status_get_song_pos(status_.get()) + 1;
|
|
|
|
volume = mpd_status_get_volume(status_.get());
|
|
|
|
volume = mpd_status_get_volume(status_.get());
|
|
|
|
if (volume < 0) {
|
|
|
|
if (volume < 0) {
|
|
|
@ -179,7 +223,8 @@ void waybar::modules::MPD::setLabel() {
|
|
|
|
auto text = fmt::format(
|
|
|
|
auto text = fmt::format(
|
|
|
|
fmt::runtime(format), fmt::arg("artist", artist.raw()),
|
|
|
|
fmt::runtime(format), fmt::arg("artist", artist.raw()),
|
|
|
|
fmt::arg("albumArtist", album_artist.raw()), fmt::arg("album", album.raw()),
|
|
|
|
fmt::arg("albumArtist", album_artist.raw()), fmt::arg("album", album.raw()),
|
|
|
|
fmt::arg("title", title.raw()), fmt::arg("date", date), fmt::arg("volume", volume),
|
|
|
|
fmt::arg("title", title.raw()), fmt::arg("artistTitleOrFilename", artist_title_or_filename.raw()),
|
|
|
|
|
|
|
|
fmt::arg("date", date), fmt::arg("volume", volume),
|
|
|
|
fmt::arg("elapsedTime", elapsedTime), fmt::arg("totalTime", totalTime),
|
|
|
|
fmt::arg("elapsedTime", elapsedTime), fmt::arg("totalTime", totalTime),
|
|
|
|
fmt::arg("songPosition", song_pos), fmt::arg("queueLength", queue_length),
|
|
|
|
fmt::arg("songPosition", song_pos), fmt::arg("queueLength", queue_length),
|
|
|
|
fmt::arg("stateIcon", stateIcon), fmt::arg("consumeIcon", consumeIcon),
|
|
|
|
fmt::arg("stateIcon", stateIcon), fmt::arg("consumeIcon", consumeIcon),
|
|
|
|