@24i/bigscreen-sdk 1.0.9-alpha.2201 → 1.0.9-alpha.2203

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/bigscreen-sdk",
3
- "version": "1.0.9-alpha.2201",
3
+ "version": "1.0.9-alpha.2203",
4
4
  "description": "SmartApps BIGscreen SDK monorepo",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -49,6 +49,21 @@ export const MEDIA_INFO_DESCRIPTION: Record<string, MediaInfo> = {
49
49
  audioCodec: {
50
50
  title: 'Audio codec',
51
51
  },
52
+ audioBitrate: {
53
+ title: 'Audio bitrate',
54
+ },
55
+ audioSamplingRate: {
56
+ title: 'Audio sampling rate',
57
+ },
58
+ audioLanguage: {
59
+ title: 'Audio language',
60
+ },
61
+ subtitlesAvailable: {
62
+ title: 'Subtitles available',
63
+ },
64
+ availableSubtitlesListString: {
65
+ title: 'List of available subtitles',
66
+ },
52
67
  drmProtection: {
53
68
  title: 'DRM protection',
54
69
  },
@@ -40,7 +40,7 @@ export class DigitalClock extends Component<Props> {
40
40
 
41
41
  setTime() {
42
42
  const { withSeconds } = this.props;
43
- const currentTimestampMs = time.getCurrentUnixTime();
43
+ const currentTimestampMs = time.getCurrentTime().getTime();
44
44
  if (this.oldUnixTimestampMs !== currentTimestampMs) {
45
45
  const options = withSeconds ? WITH_SECONDS_OPTIONS : WITHOUT_SECONDS_OPTIONS;
46
46
  this.clearMount((
@@ -1,4 +1,5 @@
1
1
  import { Component, createRef, DeclareProps } from '@24i/bigscreen-sdk/jsx';
2
+ import { time } from '@24i/bigscreen-sdk/time';
2
3
  import { Picker } from '@24i/bigscreen-sdk/picker';
3
4
  import { DatePicker as NativeDatePicker } from '@24i/bigscreen-sdk/picker/DatePicker';
4
5
  import { DAY_IN_MS, HOUR_IN_MS, MINUTE_IN_MS, SECOND_IN_MS } from '@24i/bigscreen-sdk/utils';
@@ -46,9 +47,9 @@ const prepareDateData = ({
46
47
 
47
48
  const defaultFormat = (date: Date) => {
48
49
  const locale = i18n.getLanguage();
49
- return l10n.date(date, locale).toLocaleDateString(
50
- { weekday: 'short', day: 'numeric', month: 'short' },
51
- );
50
+ return l10n
51
+ .date(date.getTime() + time.getTimezoneOffsetMs(), locale)
52
+ .toLocaleDateString({ weekday: 'short', day: 'numeric', month: 'short' });
52
53
  };
53
54
 
54
55
  export class DatePicker extends Component<Props> implements IDatePicker {
@@ -6,28 +6,30 @@ import { time } from '@24i/bigscreen-sdk/time';
6
6
  import { HOUR_IN_MS } from '@24i/bigscreen-sdk/utils/timeConstants';
7
7
  import { InternalEpg, Plugin } from '../interface';
8
8
 
9
- const formatTime = (timestamp: number) => l10n.date(timestamp).toLocaleTimeString(
9
+ const formatTime = (localTimestamp: number) => l10n.date(localTimestamp).toLocaleTimeString(
10
10
  { hour: 'numeric', minute: '2-digit' },
11
11
  );
12
12
 
13
- const formatDate = (timestamp: number) => {
14
- if (time.isToday(timestamp)) {
13
+ const formatDate = (localTimestamp: number) => {
14
+ if (time.isToday(localTimestamp)) {
15
15
  return i18n.t('date.today');
16
16
  }
17
- if (time.isYesterday(timestamp)) {
17
+ if (time.isYesterday(localTimestamp)) {
18
18
  return i18n.t('date.yesterday');
19
19
  }
20
- if (time.isTomorrow(timestamp)) {
20
+ if (time.isTomorrow(localTimestamp)) {
21
21
  return i18n.t('date.tomorrow');
22
22
  }
23
- return l10n.date(timestamp).toLocaleString({
23
+ return l10n.date(localTimestamp).toLocaleString({
24
24
  weekday: 'short',
25
25
  day: 'numeric',
26
26
  month: 'short',
27
27
  });
28
28
  };
29
29
 
30
- const formatDatetime = (timestamp: number) => `${formatDate(timestamp)} • ${formatTime(timestamp)}`;
30
+ const formatDatetime = (localTimestamp: number) => (
31
+ `${formatDate(localTimestamp)} • ${formatTime(localTimestamp)}`
32
+ );
31
33
 
32
34
  type Props = {
33
35
  epg: InternalEpg<any, any, any, any>,
@@ -44,7 +46,7 @@ export class DateToast extends Component<Props> implements Plugin {
44
46
 
45
47
  onScrolledToTimestamp(timestamp: number) {
46
48
  const { epg } = this.props;
47
- const day = formatDatetime(timestamp);
49
+ const day = formatDatetime(timestamp + time.getTimezoneOffsetMs());
48
50
  if (this.lastDay === null) { // we do not want to display it after render and first move
49
51
  this.lastDay = day;
50
52
  return;
@@ -1,4 +1,5 @@
1
1
  import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
2
+ import { time } from '@24i/bigscreen-sdk/time';
2
3
  import { l10n } from '@24i/bigscreen-sdk/l10n';
3
4
  import { DayProps as Props, Day as IDay } from './interface';
4
5
 
@@ -15,9 +16,9 @@ export class Day extends Component<Props> implements IDay {
15
16
  }
16
17
 
17
18
  private formatCurrentTimestamp() {
18
- return l10n.date(this.timestamp).toLocaleDateString(
19
- { weekday: 'long', day: 'numeric', month: 'short' },
20
- );
19
+ return l10n
20
+ .date(this.timestamp + time.getTimezoneOffsetMs())
21
+ .toLocaleDateString({ weekday: 'long', day: 'numeric', month: 'short' });
21
22
  }
22
23
 
23
24
  render() {
@@ -1,4 +1,5 @@
1
1
  import { l10n } from '@24i/bigscreen-sdk/l10n';
2
+ import { time } from '@24i/bigscreen-sdk/time';
2
3
  import { Asset } from '@24i/smartapps-datalayer/models';
3
4
 
4
5
  export const cutString = (string: string, length: number) => {
@@ -16,9 +17,9 @@ export const getSubtitle = (asset: Asset) => (
16
17
  : ''
17
18
  );
18
19
 
19
- const toLocaleTimeString = (timestamp: number) => l10n.date(timestamp).toLocaleTimeString(
20
- { hour: 'numeric', minute: '2-digit' },
21
- );
20
+ const toLocaleTimeString = (timestamp: number) => l10n
21
+ .date(timestamp + time.getTimezoneOffsetMs())
22
+ .toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
22
23
 
23
24
  export const getBroadcastTime = (asset: Asset) => {
24
25
  const start = toLocaleTimeString(asset.program!.startTime);
@@ -1,4 +1,5 @@
1
1
  import { Component, createRef, setText } from '@24i/bigscreen-sdk/jsx';
2
+ import { time } from '@24i/bigscreen-sdk/time';
2
3
  import { l10n } from '@24i/bigscreen-sdk/l10n';
3
4
  import { offsetPosition } from '@24i/bigscreen-sdk/utils';
4
5
  import { TimelineSectionProps as Props, TimelineSection as ITimelineSection } from './interface';
@@ -23,7 +24,9 @@ export class TimelineSection extends Component<Props> implements ITimelineSectio
23
24
  }
24
25
 
25
26
  private formatCurrentTimestamp() {
26
- return l10n.date(this.timestamp).toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
27
+ return l10n
28
+ .date(this.timestamp + time.getTimezoneOffsetMs())
29
+ .toLocaleTimeString({ hour: 'numeric', minute: '2-digit' });
27
30
  }
28
31
 
29
32
  render() {
@@ -7,7 +7,7 @@ const NOON = 12;
7
7
 
8
8
  export const SECOND_FROM_END = 2;
9
9
 
10
- export const h24 = (date: Date) => date.getHours().toString();
10
+ export const h24 = (date: Date) => date.getUTCHours().toString();
11
11
 
12
12
  export const hh24 = (date: Date) => {
13
13
  const h = h24(date);
@@ -15,7 +15,7 @@ export const hh24 = (date: Date) => {
15
15
  };
16
16
 
17
17
  export const h12 = (date: Date) => {
18
- const h = date.getHours() % NOON;
18
+ const h = date.getUTCHours() % NOON;
19
19
  return h === 0 ? '12' : h.toString();
20
20
  };
21
21
 
@@ -24,14 +24,14 @@ export const hh12 = (date: Date) => {
24
24
  return h.length === 1 ? `0${h}` : h;
25
25
  };
26
26
 
27
- export const m = (date: Date) => date.getMinutes().toString();
27
+ export const m = (date: Date) => date.getUTCMinutes().toString();
28
28
 
29
29
  export const mm = (date: Date) => {
30
30
  const min = m(date);
31
31
  return min.length === 1 ? `0${min}` : min;
32
32
  };
33
33
 
34
- export const s = (date: Date) => date.getSeconds().toString();
34
+ export const s = (date: Date) => date.getUTCSeconds().toString();
35
35
 
36
36
  export const ss = (date: Date) => {
37
37
  const sec = s(date);
@@ -39,7 +39,7 @@ export const ss = (date: Date) => {
39
39
  };
40
40
 
41
41
  export const amOrPm = (date: Date) => (
42
- date.getHours() < NOON ? 'AM' : 'PM'
42
+ date.getUTCHours() < NOON ? 'AM' : 'PM'
43
43
  );
44
44
 
45
45
  export const h24Mm = (date: Date) => `${h24(date)}:${mm(date)}`;
@@ -107,7 +107,7 @@ export const collonSeparatedHour12MinuteSecond = (date: Date, options: DateTimeF
107
107
 
108
108
  export const processYear = (dateStringParts: string[], year: Year | undefined, date: Date) => {
109
109
  if (typeof year === 'undefined') return;
110
- const fullYear = date.getFullYear().toString();
110
+ const fullYear = date.getUTCFullYear().toString();
111
111
  dateStringParts.push(
112
112
  year === '2-digit'
113
113
  ? fullYear.substring(fullYear.length - SECOND_FROM_END)
@@ -52,7 +52,7 @@ await time.init({
52
52
  ```
53
53
 
54
54
  ### `getCurrentTime(): Date`
55
- It returns date object having local time set to server current time.
55
+ It returns date object having UTC time set to local time.
56
56
 
57
57
  ### `getCurrentUnixTime(): number`
58
58
  It returns UNIX time in milliseconds of server UTC time.
@@ -60,6 +60,9 @@ It returns UNIX time in milliseconds of server UTC time.
60
60
  ### `getTimezoneOffset(): number`
61
61
  It returns timezone offset in minutes, for UTC+1 (Germany) is 60.
62
62
 
63
+ ### `getTimezoneOffsetMs(): number`
64
+ It returns timezone offset in milliseconds, for UTC+1 (Germany) is 3600000.
65
+
63
66
  ### `initStatus: InitStatus`
64
67
  To check what time you are using, just check the `initStatus` property.
65
68
 
@@ -1,6 +1,6 @@
1
1
  import { createInterval } from '@24i/bigscreen-sdk/utils/timers';
2
2
  import { parseIsoDate, getDayStart, getDayEnd } from './utils';
3
- import { InitStatus, ErrorCode } from './constants';
3
+ import { InitStatus, ErrorCode, MS_PER_MINUTE } from './constants';
4
4
  import { Config, TimeServiceResp } from './types';
5
5
 
6
6
  /**
@@ -22,6 +22,9 @@ class Time {
22
22
  /** The difference in milliseconds between System Date and Server Date */
23
23
  offsetMs = 0;
24
24
 
25
+ /** The difference Date object internally adds to timestamp if not asking for UTC time. */
26
+ deviceOffset = new Date().getTimezoneOffset() * MS_PER_MINUTE;
27
+
25
28
  /** Timer for periodical time update */
26
29
  syncInterval = createInterval();
27
30
 
@@ -113,7 +116,7 @@ class Time {
113
116
  this.currentTime = currentTime;
114
117
  this.serverTime = date;
115
118
  this.serverUnixTime = unixTime;
116
- this.offsetMs = this.currentTime.getTime() - this.serverTime.getTime();
119
+ this.offsetMs = this.currentTime.getTime() - this.serverTime.getTime() + this.deviceOffset;
117
120
  this.timezoneOffset = timezoneOffset;
118
121
  }
119
122
 
@@ -168,6 +171,15 @@ class Time {
168
171
  return this.timezoneOffset;
169
172
  }
170
173
 
174
+ /**
175
+ * Returns the timezone offset in milliseconds.
176
+ *
177
+ * @returns Timezone offset in milliseconds, e.g. for UTC+1 (Germany) is 3600000.
178
+ */
179
+ getTimezoneOffsetMs() {
180
+ return this.timezoneOffset * MS_PER_MINUTE;
181
+ }
182
+
171
183
  /**
172
184
  * Returns offset (milliseconds) between System and Server Date object.
173
185
  *
@@ -9,5 +9,6 @@ export const ErrorCode = {
9
9
  NO_TIME_SERVICE_PROVIDER: 'NO_TIME_SERVICE_PROVIDER',
10
10
  };
11
11
 
12
+ export const MS_PER_MINUTE = 60000;
12
13
  export const MINUTES_PER_HOUR = 60;
13
14
  export const HOURS_PER_DAY = 24;
@@ -2824,7 +2824,6 @@ declare namespace React {
2824
2824
  button: DetailedHTMLFactory<ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
2825
2825
  canvas: DetailedHTMLFactory<CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
2826
2826
  caption: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2827
- center: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2828
2827
  cite: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2829
2828
  code: DetailedHTMLFactory<HTMLAttributes<HTMLElement>, HTMLElement>;
2830
2829
  col: DetailedHTMLFactory<ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;
@@ -3162,7 +3161,6 @@ declare global {
3162
3161
  button: React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
3163
3162
  canvas: React.DetailedHTMLProps<React.CanvasHTMLAttributes<HTMLCanvasElement>, HTMLCanvasElement>;
3164
3163
  caption: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3165
- center: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3166
3164
  cite: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3167
3165
  code: React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>;
3168
3166
  col: React.DetailedHTMLProps<React.ColHTMLAttributes<HTMLTableColElement>, HTMLTableColElement>;