Skip to content

Commit

Permalink
CreateRecordResult を複数返すように変更
Browse files Browse the repository at this point in the history
  • Loading branch information
SlashNephy committed Jun 16, 2021
1 parent 29db67f commit e51a180
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 70 deletions.
124 changes: 69 additions & 55 deletions AnnictRecorder/AnnictRecorder.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ namespace AnnictRecorder
return std::optional(Multi2Wide(value));
}

static CreateRecordResult CreateEpisodeRecord(
static std::vector<CreateRecordResult> CreateEpisodeRecord(
const uint32_t annictWorkId,
const std::optional<float_t> episodeCount,
const std::optional<std::string> episodeTitle,
Expand Down Expand Up @@ -69,9 +69,11 @@ namespace AnnictRecorder
if (episodeIterator == episodes.end())
{
PrintDebug(L"Annict でのエピソードデータが見つかりませんでした。スキップします。(WorkID={}, Count={})", annictWorkId, episodeCount.value_or(0));
return {
false,
L"Annictにエピソードデータが見つかりません。"
return std::vector{
CreateRecordResult{
false,
L"Annictにエピソードデータが見つかりません。"
}
};
}

Expand Down Expand Up @@ -118,17 +120,19 @@ namespace AnnictRecorder
);
}

return {
true,
message,
workName,
episodeName,
episodeNumber,
episodeNumberText
return std::vector{
CreateRecordResult{
true,
message,
workName,
episodeName,
episodeNumber,
episodeNumberText
}
};
}

static CreateRecordResult CreateWorkRecord(
static std::vector<CreateRecordResult> CreateWorkRecord(
const uint32_t annictWorkId,
const nlohmann::json& annictWork,
const Config& Config
Expand All @@ -140,24 +144,28 @@ namespace AnnictRecorder

const auto workName = GetWStringOrNull(annictWork, "title");

return {
true,
std::format(L"「{}」を記録しました。", workName.value_or(L"タイトル不明")),
workName, std::nullopt, std::nullopt, std::nullopt
return std::vector{
CreateRecordResult{
true,
std::format(L"「{}」を記録しました。", workName.value_or(L"タイトル不明")),
workName, std::nullopt, std::nullopt, std::nullopt
}
};
}

static CreateRecordResult CreateAtxRecord(
static std::vector<CreateRecordResult> CreateAtxRecord(
const Config& Config,
const std::wstring& EventName
)
{
const auto extraction = Title::ExtractAtxTitle(EventName);
if (!extraction.found)
{
return {
false,
L"タイトルの抽出に失敗しました。"
return std::vector{
CreateRecordResult{
false,
L"タイトルの抽出に失敗しました。"
}
};
}

Expand All @@ -167,32 +175,29 @@ namespace AnnictRecorder
const auto annictWork = Annict::SearchWorkIdOrNull(title, Config.annictToken);
if (!annictWork.has_value())
{
return {
false,
L"Annictに作品データが見つかりません。"
return std::vector{
CreateRecordResult{
false,
L"Annictに作品データが見つかりません。"
}
};
}

const auto annictWorkId = annictWork.value();

CreateRecordResult Success{};
CreateRecordResult Failed{true};
for (auto count = extraction.countStart; count <= extraction.countEnd; count++)
auto results = std::vector<CreateRecordResult>();
for (auto count = extraction.countStart; count <= extraction.countEnd; count += 1)
{
if (const auto result = CreateEpisodeRecord(annictWorkId, static_cast<float_t>(count), std::nullopt, Config); result.success)
{
Success = result;
}
else
for (const auto& r : CreateEpisodeRecord(annictWorkId, count, std::nullopt, Config))
{
Failed = result;
results.push_back(r);
}
}

return Failed.success ? Success : Failed;
return results;
}

static CreateRecordResult CreateRecord(
static std::vector<CreateRecordResult> CreateRecord(
const Config& Config,
const TVTest::ServiceInfo& Service,
const TVTest::ProgramInfo& Program,
Expand All @@ -207,9 +212,11 @@ namespace AnnictRecorder
{
PrintDebug(L"sayaのチャンネル定義に存在しないチャンネルです。スキップします。(サービス名: {}, サービス ID: {})", Service.szServiceName, Service.ServiceID);

return {
false,
L"sayaのチャンネル定義に存在しないチャンネルです。"
return std::vector{
CreateRecordResult{
false,
L"sayaのチャンネル定義に存在しないチャンネルです。"
}
};
}

Expand All @@ -218,8 +225,11 @@ namespace AnnictRecorder
if (!rawSyoboCalId.IsDefined())
{
PrintDebug(L"しょぼいカレンダーに登録されていないチャンネルです。スキップします。");
return {
false, L"しょぼいカレンダーに登録されていないチャンネルです。"
return std::vector{
CreateRecordResult{
false,
L"しょぼいカレンダーに登録されていないチャンネルです。"
}
};
}

Expand All @@ -237,8 +247,11 @@ namespace AnnictRecorder
}

PrintDebug(L"しょぼいカレンダーに放送時刻が登録されていません。スキップします。(ChID={})", syoboCalChId);
return {
false, L"しょぼいカレンダーに放送時刻データがありません。"
return std::vector{
CreateRecordResult{
false,
L"しょぼいカレンダーに放送時刻データがありません。"
}
};
}

Expand All @@ -247,8 +260,11 @@ namespace AnnictRecorder
if (!AnnictIds.contains(syoboCalTID))
{
PrintDebug(L"Annict での作品データが見つかりませんでした。スキップします。(TID={})", syoboCalTID);
return {
false, L"Annictに作品データが見つかりません。"
return std::vector{
CreateRecordResult{
false,
L"Annictに作品データが見つかりません。"
}
};
}

Expand All @@ -257,29 +273,27 @@ namespace AnnictRecorder
if (!annictWork.has_value())
{
PrintDebug(L"Annict での作品データが見つかりませんでした。スキップします。(TID={}, WorkID={})", syoboCalTID, annictWorkId);
return {
false, L"Annictに作品データが見つかりません。"
return std::vector{
CreateRecordResult{
false,
L"Annictに作品データが見つかりません。"
}
};
}

// エピソードで別れている場合, 該当のエピソードを記録
if (!annictWork.value()["no_episodes"].get<bool>())
{
CreateRecordResult Success{};
CreateRecordResult Failed{true};
for (auto count = syoboCalProgram.value().countStart; count <= syoboCalProgram.value().countEnd; count++)
auto results = std::vector<CreateRecordResult>();
for (auto count = syoboCalProgram.value().countStart; count <= syoboCalProgram.value().countEnd; count += 1)
{
if (const auto result = CreateEpisodeRecord(annictWorkId, count, syoboCalProgram.value().subTitle, Config); result.success)
{
Success = result;
}
else
for (const auto& r : CreateEpisodeRecord(annictWorkId, count, syoboCalProgram.value().subTitle, Config))
{
Failed = result;
results.push_back(r);
}
}

return Failed.success ? Success : Failed;
return results;
}

// エピソードで別れていない場合 (映画など), 作品自体を「見た」に設定
Expand Down
42 changes: 27 additions & 15 deletions AnnictRecorder/Plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,31 +409,43 @@ void CAnnictRecorderPlugin::CheckCurrentProgram()
{
PrintDebug(L"チューニング空間の取得に失敗しました。(サービス ID: {}, サービス名: {})", Service.value().ServiceID, Service.value().szServiceName);
}

const auto result = AnnictRecorder::CreateRecord(m_config, Service.value(), Program, ChannelType, m_annictIds, m_definitions);
if (result.success)

AnnictRecorder::CreateRecordResult Success{};
AnnictRecorder::CreateRecordResult Failed{true};

const auto results = CreateRecord(m_config, Service.value(), Program, ChannelType, m_annictIds, m_definitions);
for (const auto& result : results)
{
m_pApp->AddLog(L"Annict に視聴記録を送信しました。");
m_pApp->AddLog(
std::format(
L"Annict 作品名: {}, エピソード名: {} ({})",
result.workName.value_or(L"タイトル不明"),
result.episodeName.value_or(L"サブタイトル不明"),
result.episodeNumberText.value_or(L"話数不明")
).c_str()
);
if (result.success)
{
m_pApp->AddLog(L"Annict に視聴記録を送信しました。");
m_pApp->AddLog(
std::format(
L"Annict 作品名: {}, エピソード名: {} ({})",
result.workName.value_or(L"タイトル不明"),
result.episodeName.value_or(L"サブタイトル不明"),
result.episodeNumberText.value_or(L"話数不明")
).c_str()
);
Success = result;
}
else
{
Failed = result;
}
}
else

if (!Failed.success)
{
m_pApp->AddLog(L"Annict に視聴記録を送信できませんでした。Annict 上に見つからない作品か, しょぼいカレンダーに放送時間が登録されていません。", TVTest::LOG_TYPE_WARNING);
m_pApp->AddLog(result.message.c_str());
m_pApp->AddLog(Failed.message.c_str());
m_pApp->AddLog(
std::format(L"番組名: {}, サービス名: {}", Program.pszEventName, Service.value().szServiceName).c_str()
);
}

m_lastRecordResult = Failed.success ? Success : Failed;
m_recorded[programId] = true;
m_lastRecordResult = result;
}

PrintDebug(L"クリティカルセクションから出ました。");
Expand Down

0 comments on commit e51a180

Please sign in to comment.