diff --git a/cuesheet.cpp b/cuesheet.cpp index d02052bb..b2b7695b 100644 --- a/cuesheet.cpp +++ b/cuesheet.cpp @@ -153,7 +153,8 @@ void CueSheet::parse(std::wstreambuf *src) void CueSheet::loadTracks(playlist::Playlist &tracks, const std::wstring &cuedir, - const std::wstring &fname_format) + const std::wstring &fname_format, + const wchar_t *embedder_fname) { std::shared_ptr src; std::for_each(begin(), end(), [&](const CueTrack &track) { @@ -163,6 +164,8 @@ void CueSheet::loadTracks(playlist::Playlist &tracks, if (seg.m_filename == L"__GAP__") { if (src.get()) src.reset(new NullSource(src->getSampleFormat())); + } else if (embedder_fname) { + src = input::factory()->open(embedder_fname); } else { std::wstring ifilename = win32::PathCombineX(cuedir, seg.m_filename); diff --git a/cuesheet.h b/cuesheet.h index d99e155e..0180ee30 100644 --- a/cuesheet.h +++ b/cuesheet.h @@ -84,7 +84,8 @@ class CueSheet { void parse(std::wstreambuf *src); void loadTracks(playlist::Playlist &tracks, const std::wstring &cuedir, - const std::wstring &fname_format); + const std::wstring &fname_format, + const wchar_t *embedder_fname=0); void asChapters(double duration, /* total duration in sec. */ std::vector *chapters) const; void getTags(std::map *tags) const; diff --git a/flacsrc.cpp b/flacsrc.cpp index 2f0a2502..f435f0e3 100644 --- a/flacsrc.cpp +++ b/flacsrc.cpp @@ -225,20 +225,8 @@ void FLACSource::handleVorbisComment( if (sscanf(value, "%i", &mask) == 1) chanmap::getChannels(mask, &m_chanmap); } else if (value) { - if (!strcasecmp(key, "cuesheet")) - cuesheet = strutil::us2w(value); - else - tags[key] = value; + tags[key] = value; } } - if (cuesheet.size()) { - std::map ctags; - Cue::CueSheetToChapters(cuesheet, - m_length / m_asbd.mSampleRate, - &m_chapters, &ctags); - std::map::const_iterator it; - for (it = ctags.begin(); it != ctags.end(); ++it) - tags[it->first] = it->second; - } TextBasedTag::normalizeTags(tags, &m_tags); } diff --git a/main.cpp b/main.cpp index 4712b13e..284b4c54 100644 --- a/main.cpp +++ b/main.cpp @@ -1726,8 +1726,32 @@ int wmain1(int argc, wchar_t **argv) ifilename = argv[i]; if (strutil::wslower(PathFindExtensionW(ifilename)) == L".cue") load_cue_sheet(ifilename, opts, tracks); - else + else { load_track(ifilename, opts, tracks); + auto src = tracks.back().source; + auto parser = dynamic_cast(src.get()); + do { + if (!parser) break; + auto &tags = parser->getTags(); + auto ti = tags.begin(); + for (; ti != tags.end(); ++ti) + if (strcasecmp(ti->first.c_str(), "cuesheet") == 0) + break; + if (ti == tags.end()) + break; + try { + std::wstringbuf wsb(strutil::us2w(ti->second)); + CueSheet cue; + cue.parse(&wsb); + tracks.pop_back(); + cue.loadTracks(tracks, L"", + opts.fname_format + ? opts.fname_format + : L"${tracknumber}${title& }${title}", + ifilename); + } catch (...) {} + } while (0); + } } SetConsoleCtrlHandler(console_interrupt_handler, TRUE); if (!opts.concat) { diff --git a/taksrc.cpp b/taksrc.cpp index d59abca2..43d07744 100644 --- a/taksrc.cpp +++ b/taksrc.cpp @@ -177,19 +177,7 @@ void TakSource::fetchTags() continue; std::string key = it->first.toCString(); std::wstring value = it->second.toString().toWString(); - if (strutil::slower(key) == "cuesheet") - cuesheet = value; - else - tags[key] = strutil::w2us(value); - } - if (cuesheet.size()) { - std::map ctags; - Cue::CueSheetToChapters(cuesheet, - m_length / m_asbd.mSampleRate, - &m_chapters, &ctags); - std::map::const_iterator it; - for (it = ctags.begin(); it != ctags.end(); ++it) - tags[it->first] = it->second; + tags[key] = strutil::w2us(value); } TextBasedTag::normalizeTags(tags, &m_tags); } diff --git a/wvpacksrc.cpp b/wvpacksrc.cpp index 4c1c35e0..42821f3c 100644 --- a/wvpacksrc.cpp +++ b/wvpacksrc.cpp @@ -196,19 +196,7 @@ void WavpackSource::fetchTags() size = m_module.GetTagItem(wpc, &name[0], 0, 0); std::vector value(size + 1); m_module.GetTagItem(wpc, &name[0], &value[0], value.size()); - if (!strcasecmp(&name[0], "cuesheet")) - cuesheet = strutil::us2w(&value[0]); - else - tags[&name[0]] = &value[0]; - } - if (cuesheet.size()) { - std::map ctags; - Cue::CueSheetToChapters(cuesheet, - m_length / m_asbd.mSampleRate, - &m_chapters, &ctags); - std::map::const_iterator it; - for (it = ctags.begin(); it != ctags.end(); ++it) - tags[it->first] = it->second; + tags[&name[0]] = &value[0]; } TextBasedTag::normalizeTags(tags, &m_tags); }