Skip to content

Commit

Permalink
Merge pull request #474 from matsuyuki-a/fix/reserved-user-program
Browse files Browse the repository at this point in the history
修正: 予約されたユーザー生放送の放送開始前にストリームを流せない不具合を修正
  • Loading branch information
matsuyuki-a committed Nov 24, 2020
2 parents 60d13ac + 23f2211 commit f88e0bb
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 8 deletions.
77 changes: 72 additions & 5 deletions app/services/streaming/streaming.test.ts
Expand Up @@ -3,7 +3,7 @@ import { EStreamingState, ERecordingState } from './streaming-api';

import { createSetupFunction } from 'util/test-setup';

function noop() {}
function noop(..._args: any[]) { }

jest.mock('services/stateful-service');
jest.mock('util/injector');
Expand Down Expand Up @@ -530,13 +530,14 @@ test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログ
expect(instance.optimizeForNiconicoAndStartStreaming).not.toHaveBeenCalled();
});

test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログインしていて、番組が定まり、最適化を行う場合', async () => {
test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログインしていて、番組が定まり(番組放送中)、最適化を行う場合', async () => {
const updateStreamSettings = jest.fn(() => {
return { key: 'hoge' };
});
setup({
injectee: createInjectee({
isNiconicoLoggedIn: true,
updateStreamSettings: () => {
return { key: 'hoge' };
},
updateStreamSettings,
optimizeForNiconico: true,
}),
state: {
Expand All @@ -554,8 +555,74 @@ test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログ
instance.client.fetchOnairUserProgram = jest.fn(() => Promise.resolve({ programId: 'lv12345' }));
instance.client.fetchOnairChannels = jest.fn(() => Promise.resolve({ ok: true, value: [] }));

await instance.toggleStreamingAsync();
expect(updateStreamSettings).toBeCalledWith('lv12345');
expect(instance.optimizeForNiconicoAndStartStreaming).toHaveBeenCalledTimes(1);
expect(instance.toggleStreaming).not.toHaveBeenCalled();
});

test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログインしていて、番組が定まり(番組放送中+予約番組あり)、最適化を行う場合', async () => {
const updateStreamSettings = jest.fn(() => {
return { key: 'hoge' };
});
setup({
injectee: createInjectee({
isNiconicoLoggedIn: true,
updateStreamSettings,
optimizeForNiconico: true,
}),
state: {
StreamingService: {
streamingStatus: EStreamingState.Offline,
},
},
});

const { StreamingService } = require('./streaming');
const { instance } = StreamingService;
instance.optimizeForNiconicoAndStartStreaming = jest.fn();
instance.toggleStreaming = jest.fn();

instance.client.fetchOnairUserProgram = jest.fn(() => Promise.resolve({
programId: 'lv12345',
nextProgramId: 'lv67890'
}));
instance.client.fetchOnairChannels = jest.fn(() => Promise.resolve({ ok: true, value: [] }));

await instance.toggleStreamingAsync();
expect(updateStreamSettings).toBeCalledWith('lv12345');
expect(instance.optimizeForNiconicoAndStartStreaming).toHaveBeenCalledTimes(1);
expect(instance.toggleStreaming).not.toHaveBeenCalled();
});

test('toggleStreamingAsyncでstreamingStatusがoffline、ニコニコにログインしていて、番組が定まり(予約番組のみ)、最適化を行う場合', async () => {
const updateStreamSettings = jest.fn(() => {
return { key: 'hoge' };
});
setup({
injectee: createInjectee({
isNiconicoLoggedIn: true,
updateStreamSettings,
optimizeForNiconico: true,
}),
state: {
StreamingService: {
streamingStatus: EStreamingState.Offline,
},
},
});

const { StreamingService } = require('./streaming');
const { instance } = StreamingService;
instance.optimizeForNiconicoAndStartStreaming = jest.fn();
instance.toggleStreaming = jest.fn();

instance.client.fetchOnairUserProgram = jest.fn(() => Promise.resolve({ nextProgramId: 'lv67890' }));
instance.client.fetchOnairChannels = jest.fn(() => Promise.resolve({ ok: true, value: [] }));

await instance.toggleStreamingAsync();

expect(updateStreamSettings).toBeCalledWith('lv67890');
expect(instance.optimizeForNiconicoAndStartStreaming).toHaveBeenCalledTimes(1);
expect(instance.toggleStreaming).not.toHaveBeenCalled();
});
Expand Down
8 changes: 5 additions & 3 deletions app/services/streaming/streaming.ts
Expand Up @@ -176,17 +176,19 @@ export class StreamingService extends StatefulService<IStreamingServiceState>
}

// 配信可能チャンネルがなく、配信できるユーザー生放送もない場合
if (!broadcastableUserProgram.programId) {
if (!broadcastableUserProgram.programId && !broadcastableUserProgram.nextProgramId) {
return this.showNotBroadcastingMessageBox();
}
}

// 配信番組選択ウィンドウでチャンネル番組が選ばれた時はそのチャンネル番組を, それ以外の場合は放送中のユーザー番組を代入
// 配信番組選択ウィンドウでチャンネル番組が選ばれた時はそのチャンネル番組を, それ以外の場合は放送中のユーザー番組のIDを代入
// ユーザー番組については、即時番組があればそれを優先し、なければ予約番組の番組IDを採用する。
const programId =
opts.nicoliveProgramSelectorResult &&
opts.nicoliveProgramSelectorResult.providerType === 'channel' &&
opts.nicoliveProgramSelectorResult.channelProgramId ?
opts.nicoliveProgramSelectorResult.channelProgramId : broadcastableUserProgram.programId;
opts.nicoliveProgramSelectorResult.channelProgramId :
(broadcastableUserProgram.programId || broadcastableUserProgram.nextProgramId)

// 配信番組選択ウィンドウでユーザー番組を選んだが、配信可能なユーザー番組がない場合
if (!programId) {
Expand Down

0 comments on commit f88e0bb

Please sign in to comment.