Skip to content

Commit

Permalink
[subtitle] load .sup subtitle like other external subtitles.
Browse files Browse the repository at this point in the history
  • Loading branch information
taxigps committed Nov 6, 2021
1 parent 1fb18c8 commit 590d6da
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 75 deletions.
56 changes: 0 additions & 56 deletions xbmc/Util.cpp
Expand Up @@ -2279,62 +2279,6 @@ std::string CUtil::GetVobSubIdxFromSub(const std::string& vobSub)
return std::string();
}

void CUtil::ScanForExternalDemuxSub(const std::string& videoPath, std::vector<std::string>& vecSubtitles)
{
CFileItem item(videoPath, false);
if (item.IsInternetStream()
|| item.IsPlayList()
|| item.IsLiveTV()
|| item.IsPVR()
|| !item.IsVideo())
return;

std::string strBasePath;
std::string strSubtitle;

GetVideoBasePathAndFileName(videoPath, strBasePath, strSubtitle);

CFileItemList items;
const std::vector<std::string> common_sub_dirs = { "subs", "subtitles", "vobsubs", "sub", "vobsub", "subtitle" };
const std::string demuxSubExtensions = ".sup";
GetItemsToScan(strBasePath, demuxSubExtensions, common_sub_dirs, items);

const std::string customPath = CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(
CSettings::SETTING_SUBTITLES_CUSTOMPATH);

if (!CMediaSettings::GetInstance().GetAdditionalSubtitleDirectoryChecked() &&
!customPath.empty()) // to avoid checking non-existent directories (network) every time..
{
if (!CServiceBroker::GetNetwork().IsAvailable() && !URIUtils::IsHD(customPath))
{
CLog::Log(LOGINFO, "CUtil::CacheSubtitles: disabling alternate subtitle directory for this "
"session, it's inaccessible");
CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(-1); // disabled
}
else if (!CDirectory::Exists(customPath))
{
CLog::Log(LOGINFO, "CUtil::CacheSubtitles: disabling alternate subtitle directory for this "
"session, it's nonexistent");
CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(-1); // disabled
}
else
CMediaSettings::GetInstance().SetAdditionalSubtitleDirectoryChecked(1);
}

if (CMediaSettings::GetInstance().GetAdditionalSubtitleDirectoryChecked() == 1)
{
std::string strPath2 = customPath;
URIUtils::AddSlashAtEnd(strPath2);
int flags = DIR_FLAG_NO_FILE_DIRS | DIR_FLAG_NO_FILE_INFO;
CFileItemList moreItems;
CDirectory::GetDirectory(strPath2, moreItems, demuxSubExtensions, flags);
items.Append(moreItems);
}

std::vector<std::string> exts = StringUtils::Split(demuxSubExtensions, "|");
ScanPathsForAssociatedItems(strSubtitle, items, exts, vecSubtitles);
}

void CUtil::ScanForExternalAudio(const std::string& videoPath, std::vector<std::string>& vecAudio)
{
CFileItem item(videoPath, false);
Expand Down
1 change: 0 additions & 1 deletion xbmc/Util.h
Expand Up @@ -87,7 +87,6 @@ class CUtil
* \param[out] vecAudio A vector containing the full paths of all found external audio files.
*/
static void ScanForExternalAudio(const std::string& videoPath, std::vector<std::string>& vecAudio);
static void ScanForExternalDemuxSub(const std::string& videoPath, std::vector<std::string>& vecSubtitles);
static int64_t ToInt64(uint32_t high, uint32_t low);
static std::string GetNextFilename(const std::string &fn_template, int max);
static std::string GetNextPathname(const std::string &path_template, int max);
Expand Down
Expand Up @@ -44,7 +44,6 @@ std::shared_ptr<CDVDInputStream> CDVDFactoryInputStream::CreateInputStream(IVide
std::vector<std::string> filenames;
filenames.push_back(file);
CUtil::ScanForExternalAudio(file, filenames);
CUtil::ScanForExternalDemuxSub(file, filenames);
if (filenames.size() >= 2)
{
return CreateInputStream(pPlayer, fileitem, filenames);
Expand Down
53 changes: 40 additions & 13 deletions xbmc/cores/VideoPlayer/VideoPlayer.cpp
Expand Up @@ -4494,23 +4494,46 @@ int CVideoPlayer::AddSubtitleFile(const std::string& filename, const std::string
{
std::string ext = URIUtils::GetExtension(filename);
std::string vobsubfile = subfilename;
if (ext == ".idx")
if (ext == ".idx" || ext == ".sup")
{
if (vobsubfile.empty()) {
// find corresponding .sub (e.g. in case of manually selected .idx sub)
vobsubfile = CUtil::GetVobSubSubFromIdx(filename);
std::shared_ptr<CDVDDemux> pDemux;
if (ext == ".idx")
{
if (vobsubfile.empty())
{
// find corresponding .sub (e.g. in case of manually selected .idx sub)
vobsubfile = CUtil::GetVobSubSubFromIdx(filename);
if (vobsubfile.empty())
return -1;
}

auto pDemuxVobsub = std::make_shared<CDVDDemuxVobsub>();
if (!pDemuxVobsub->Open(filename, STREAM_SOURCE_NONE, vobsubfile))
return -1;

m_SelectionStreams.Update(nullptr, pDemuxVobsub.get(), vobsubfile);
pDemux = pDemuxVobsub;
}
else // .sup file
{
CFileItem item(filename, false);
std::shared_ptr<CDVDInputStream> pInput;
pInput = CDVDFactoryInputStream::CreateInputStream(nullptr, item);
if (!pInput || !pInput->Open())
return -1;

auto v = std::make_shared<CDVDDemuxVobsub>();
if (!v->Open(filename, STREAM_SOURCE_NONE, vobsubfile))
return -1;
m_SelectionStreams.Update(NULL, v.get(), vobsubfile);
auto pDemuxFFmpeg = std::make_shared<CDVDDemuxFFmpeg>();
if (!pDemuxFFmpeg->Open(pInput, false))
return -1;

m_SelectionStreams.Update(nullptr, pDemuxFFmpeg.get(), filename);
pDemux = pDemuxFFmpeg;
}

ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(m_item.GetDynPath(), vobsubfile);
ExternalStreamInfo info =
CUtil::GetExternalStreamDetailsFromFilename(m_item.GetDynPath(), filename);

for (auto sub : v->GetStreams())
for (auto sub : pDemux->GetStreams())
{
if (sub->type != STREAM_SUBTITLE)
continue;
Expand All @@ -4529,19 +4552,23 @@ int CVideoPlayer::AddSubtitleFile(const std::string& filename, const std::string
if (static_cast<StreamFlags>(info.flag) != StreamFlags::FLAG_NONE)
stream.flags = static_cast<StreamFlags>(info.flag);
}

UpdateContent();
// the demuxer id is unique
m_subtitleDemuxerMap[v->GetDemuxerId()] = v;
return m_SelectionStreams.TypeIndexOf(STREAM_SUBTITLE,
m_SelectionStreams.Source(STREAM_SOURCE_DEMUX_SUB, filename), v->GetDemuxerId(), 0);
m_subtitleDemuxerMap[pDemux->GetDemuxerId()] = pDemux;
return m_SelectionStreams.TypeIndexOf(
STREAM_SUBTITLE, m_SelectionStreams.Source(STREAM_SOURCE_DEMUX_SUB, filename),
pDemux->GetDemuxerId(), 0);
}

if(ext == ".sub")
{
// if this looks like vobsub file (i.e. .idx found), add it as such
std::string vobsubidx = CUtil::GetVobSubIdxFromSub(filename);
if (!vobsubidx.empty())
return AddSubtitleFile(vobsubidx, filename);
}

SelectionStream s;
s.source = m_SelectionStreams.Source(STREAM_SOURCE_TEXT, filename);
s.type = STREAM_SUBTITLE;
Expand Down
2 changes: 1 addition & 1 deletion xbmc/network/upnp/UPnPInternal.cpp
Expand Up @@ -659,7 +659,7 @@ BuildObject(CFileItem& item,
/* Hardcoded check for extension is not the best way, but it can't be allowed to pass all
subtitle extension (ex. rar or zip). There are the most popular extensions support by UPnP devices.*/
if (ext == "txt" || ext == "srt" || ext == "ssa" || ext == "ass" || ext == "sub" ||
ext == "smi" || ext == "vtt")
ext == "smi" || ext == "vtt" || ext == "sup")
{
subtitles.push_back(filenames[i]);
}
Expand Down
1 change: 1 addition & 0 deletions xbmc/platform/darwin/ios/Info.plist.in
Expand Up @@ -395,6 +395,7 @@
<string>aqt</string>
<string>jss</string>
<string>ass</string>
<string>sup</string>
<string>vtt</string>
<string>idx</string>
<string>ifo</string>
Expand Down
2 changes: 1 addition & 1 deletion xbmc/settings/AdvancedSettings.cpp
Expand Up @@ -410,7 +410,7 @@ void CAdvancedSettings::Initialize()
m_musicExtensions = ".nsv|.m4a|.flac|.aac|.strm|.pls|.rm|.rma|.mpa|.wav|.wma|.ogg|.mp3|.mp2|.m3u|.gdm|.imf|.m15|.sfx|.uni|.ac3|.dts|.cue|.aif|.aiff|.wpl|.xspf|.ape|.mac|.mpc|.mp+|.mpp|.shn|.zip|.wv|.dsp|.xsp|.xwav|.waa|.wvs|.wam|.gcm|.idsp|.mpdsp|.mss|.spt|.rsd|.sap|.cmc|.cmr|.dmc|.mpt|.mpd|.rmt|.tmc|.tm8|.tm2|.oga|.url|.pxml|.tta|.rss|.wtv|.mka|.tak|.opus|.dff|.dsf|.m4b|.dtshd";
m_videoExtensions = ".m4v|.3g2|.3gp|.nsv|.tp|.ts|.ty|.strm|.pls|.rm|.rmvb|.mpd|.m3u|.m3u8|.ifo|.mov|.qt|.divx|.xvid|.bivx|.vob|.nrg|.img|.iso|.udf|.pva|.wmv|.asf|.asx|.ogm|.m2v|.avi|.bin|.dat|.mpg|.mpeg|.mp4|.mkv|.mk3d|.avc|.vp3|.svq3|.nuv|.viv|.dv|.fli|.flv|.001|.wpl|.xspf|.zip|.vdr|.dvr-ms|.xsp|.mts|.m2t|.m2ts|.evo|.ogv|.sdp|.avs|.rec|.url|.pxml|.vc1|.h264|.rcv|.rss|.mpls|.mpl|.webm|.bdmv|.bdm|.wtv|.trp|.f4v";
m_subtitlesExtensions = ".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.text|.ssa|.aqt|.jss|"
".ass|.vtt|.idx|.ifo|.zip";
".ass|.vtt|.idx|.ifo|.zip|.sup";
m_discStubExtensions = ".disc";
// internal music extensions
m_musicExtensions += "|.cdda";
Expand Down
4 changes: 2 additions & 2 deletions xbmc/video/dialogs/GUIDialogSubtitleSettings.cpp
Expand Up @@ -126,10 +126,10 @@ std::string CGUIDialogSubtitleSettings::BrowseForSubtitle()
}

std::string strMask =
".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.aqt|.jss|.ass|.vtt|.idx|.zip";
".utf|.utf8|.utf-8|.sub|.srt|.smi|.rt|.txt|.ssa|.aqt|.jss|.ass|.vtt|.idx|.zip|.sup";

if (g_application.GetCurrentPlayer() == "VideoPlayer")
strMask = ".srt|.zip|.ifo|.smi|.sub|.idx|.ass|.ssa|.vtt|.txt";
strMask = ".srt|.zip|.ifo|.smi|.sub|.idx|.ass|.ssa|.vtt|.txt|.sup";

strMask += extras;

Expand Down

0 comments on commit 590d6da

Please sign in to comment.