= ({ onClick, isDark }) => (
10 |
11 | );
12 |
13 | export default SunButton;
14 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/ChannelGroups/useChannelGroupNameColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import ChannelGroupNameEditor from '@components/channelGroups/ChannelGroupNameEditor';
2 | import createChannelGroupMultiSelectColumnConfigHook from './createChannelGroupMultiSelectColumnConfigHook';
3 |
4 | export const useChannelGroupNameColumnConfig = createChannelGroupMultiSelectColumnConfigHook({
5 | dataField: 'Name',
6 | EditorComponent: ChannelGroupNameEditor,
7 | headerTitle: 'Name',
8 | sortable: true,
9 | width: '11rem'
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useChannelNameColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import ChannelNameEditor from '../ChannelNameEditor';
2 | import createMultiSelectColumnConfigHook from './createVideoStreamMultiSelectColumnConfigHook';
3 |
4 | export const useChannelNameColumnConfig = createMultiSelectColumnConfigHook({
5 | EditorComponent: ChannelNameEditor,
6 | dataField: 'user_Tvg_name',
7 | headerTitle: 'Name'
8 | });
9 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useChannelNumberColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import ChannelNumberEditor from '../ChannelNumberEditor';
2 | import createMultiSelectColumnConfigHook from './createVideoStreamMultiSelectColumnConfigHook';
3 |
4 | export const useChannelNumberColumnConfig = createMultiSelectColumnConfigHook({
5 | EditorComponent: ChannelNumberEditor,
6 | dataField: 'user_Tvg_chno',
7 | headerTitle: 'Ch.',
8 | useFilter: false,
9 | width: 4
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useEPGColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import EPGEditor from '../epg/EPGEditor';
2 | import createMultiSelectColumnConfigHook from './createVideoStreamMultiSelectColumnConfigHook';
3 |
4 | export const useEPGColumnConfig = createMultiSelectColumnConfigHook({
5 | dataField: 'EPGId',
6 | EditorComponent: EPGEditor,
7 | headerTitle: 'EPG',
8 | maxWidth: 4,
9 | width: 4
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useLineUpColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import createVideoStreamMultiSelectColumnConfigHook from './createMultiSelectLineUpColumnConfigHook';
2 |
3 | export const useLineUpColumnConfig = createVideoStreamMultiSelectColumnConfigHook({
4 | headerTitle: 'Line Up',
5 | width: 80
6 | });
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useM3UFileNameColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import createVideoStreamMultiSelectColumnConfigHook from './createVideoStreamMultiSelectColumnConfigHook';
2 |
3 | export const useM3UFileNameColumnConfig = createVideoStreamMultiSelectColumnConfigHook({
4 | dataField: 'm3UFileName',
5 | headerTitle: 'File',
6 | width: 6,
7 | queryHook: useM3UFilesGetM3UFileNamesQuery
8 | });
9 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useM3UFilesMaxStreamsColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import M3UFilesMaxStreamsEditor from '@components/m3u/M3UFilesMaxStreamsEditor';
2 | import createM3UFileMultiSelectColumnConfigHook from './createM3UFileMultiSelectColumnConfigHook';
3 |
4 | export const useM3UFilesMaxStreamsColumnConfig = createM3UFileMultiSelectColumnConfigHook({
5 | dataField: 'maxStreamCount',
6 | EditorComponent: M3UFilesMaxStreamsEditor,
7 | headerTitle: 'Max Streams',
8 | useFilter: false,
9 | width: 4
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/columns/useVideoStreamLogoColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import VideoStreamLogoEditor from '../videoStream/VideoStreamLogoEditor';
2 | import createVideoStreamMultiSelectColumnConfigHook from './createVideoStreamMultiSelectColumnConfigHook';
3 |
4 | export const useVideoStreamLogoColumnConfig = createVideoStreamMultiSelectColumnConfigHook({
5 | EditorComponent: VideoStreamLogoEditor,
6 | dataField: 'user_Tvg_logo',
7 | fieldType: 'image',
8 | headerTitle: '',
9 | useFilter: false
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/icons/iconUtil.ts:
--------------------------------------------------------------------------------
1 | import { baseHostURL, isDev } from "@lib/settings";
2 |
3 | function devUrl(url: string): string {
4 | return isDev ? `${baseHostURL}${url}` : url;
5 | }
6 |
7 | export const SMLogo = "/images/streammaster_logo.png";
8 |
9 | export function getIconUrl(source?: string): string {
10 | if (!source) {
11 | return SMLogo;
12 | }
13 |
14 | return source.startsWith("http") ? source : devUrl(source);
15 | }
16 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useCommandProfileCommandColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { CommandProfileColumnConfigProps, useCommandProfileColumnConfig } from './useCommandProfileColumnConfig';
2 |
3 | export const useCommandProfileCommandColumnConfig = (props?: CommandProfileColumnConfigProps) => {
4 | const test = useCommandProfileColumnConfig({ ...props, field: 'Command', header: 'Command' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useCommandProfileParametersColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { CommandProfileColumnConfigProps, useCommandProfileColumnConfig } from './useCommandProfileColumnConfig';
2 |
3 | export const useCommandProfileParametersColumnConfig = (props?: CommandProfileColumnConfigProps) => {
4 | const test = useCommandProfileColumnConfig({ ...props, field: 'Parameters', header: 'Parameters' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useOutputProfileChannelIdColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { OutputProfileColumnConfigProps, useOutputProfileColumnConfig } from './useOutputProfileColumnConfig';
2 |
3 | export const useOutputProfileChannelIdColumnConfig = (props?: OutputProfileColumnConfigProps) => {
4 | const test = useOutputProfileColumnConfig({ ...props, field: 'ChannelId', header: 'Channel Id' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useOutputProfileEPGIdColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { OutputProfileColumnConfigProps, useOutputProfileColumnConfig } from './useOutputProfileColumnConfig';
2 |
3 | export const useOutputProfileEPGIdColumnConfig = (props?: OutputProfileColumnConfigProps) => {
4 | const test = useOutputProfileColumnConfig({ ...props, field: 'EPGId', header: 'EPGId' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useOutputProfileGroupColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { OutputProfileColumnConfigProps, useOutputProfileColumnConfig } from './useOutputProfileColumnConfig';
2 |
3 | export const useOutputProfileGroupColumnConfig = (props?: OutputProfileColumnConfigProps) => {
4 | const test = useOutputProfileColumnConfig({ ...props, field: 'Group', header: 'Group' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useOutputProfileIdColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { OutputProfileColumnConfigProps, useOutputProfileColumnConfig } from './useOutputProfileColumnConfig';
2 |
3 | export const useOutputProfileIdColumnConfig = (props?: OutputProfileColumnConfigProps) => {
4 | const test = useOutputProfileColumnConfig({ ...props, field: 'Id', header: 'Id' });
5 | return test;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useOutputProfileNameColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { OutputProfileColumnConfigProps, useOutputProfileColumnConfig } from './useOutputProfileColumnConfig';
2 |
3 | export const useOutputProfileNameColumnConfig = (props?: OutputProfileColumnConfigProps) => {
4 | const columnConfig = useOutputProfileColumnConfig({ ...props, field: 'Name', header: 'Name' });
5 | return columnConfig;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/profiles/columns/useStreamGroupProfileFileProfileColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import { CommandProfileColumnConfigProps, useStreamGroupProfileColumnConfig } from './useStreamGroupProfileColumnConfig';
2 |
3 | export const useStreamGroupProfileFileProfileColumnConfig = (props?: CommandProfileColumnConfigProps) => {
4 | const columnConfig = useStreamGroupProfileColumnConfig({ ...props, field: 'OutputProfileName', header: 'Output Profile' });
5 | return columnConfig;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SMDropDownProperties.ts:
--------------------------------------------------------------------------------
1 | import { SMOverlayProperties } from './SMOverlayProperties';
2 | import { SMScrollerProperties } from './SMScrollerProperties';
3 |
4 | export interface SMDropDownProperties extends SMOverlayProperties, SMScrollerProperties {
5 | readonly closeOnSelection?: boolean;
6 | readonly footerTemplate?: React.ReactNode;
7 | readonly labelInline?: boolean;
8 | readonly children?: React.ReactNode;
9 | }
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SMModalProperties.ts:
--------------------------------------------------------------------------------
1 | export interface SMModalProperties {
2 | readonly modal?: boolean;
3 | readonly modalCentered?: boolean;
4 | readonly modalClosable?: boolean;
5 | }
6 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SMPopUpProperties.ts:
--------------------------------------------------------------------------------
1 | import { SMOverlayProperties } from './SMOverlayProperties';
2 |
3 | export interface SMPopUpProperties extends SMOverlayProperties {
4 | readonly children?: React.ReactNode;
5 | readonly disabled?: boolean;
6 | readonly isPopupLoading?: boolean;
7 | // readonly rememberKey?: string;
8 | // readonly noFullScreen?: boolean;
9 | }
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SMProperties.ts:
--------------------------------------------------------------------------------
1 | import { SMButtonProperties } from "./SMButtonProperties";
2 | import { SMCardProperties } from "./SMCardProperties";
3 | import { SMModalProperties } from "./SMModalProperties";
4 |
5 | export interface SMOverlayProperties extends SMButtonProperties, SMCardProperties, SMModalProperties { }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SMSpeedDialTypes.ts:
--------------------------------------------------------------------------------
1 | export type Shape = 'line' | 'circle' | 'quarter-circle' | 'semicircle';
2 | export type Direction = 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
3 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/Interfaces/SourceOrFileDialogProperties.ts:
--------------------------------------------------------------------------------
1 | export interface SourceOrFileDialogProperties {
2 | isM3U: boolean;
3 | onSaveEnabled: (enabled: boolean) => void;
4 | progress?: number;
5 | }
6 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/SMTextColor.tsx:
--------------------------------------------------------------------------------
1 | interface SMTextColorProperties {
2 | readonly italicized?: boolean;
3 | readonly text: string | undefined; // Use a boolean to determine if text should be italicized
4 | }
5 | export const SMTextColor = ({ italicized, text }: SMTextColorProperties) => (
6 | {text}
7 | );
8 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/sm/SMTextDefaults.tsx:
--------------------------------------------------------------------------------
1 | interface SMTextColorProperties {
2 | readonly italicized?: boolean;
3 | readonly text: string | undefined; // Use a boolean to determine if text should be italicized
4 | }
5 | export const SMTextDefaults = ({ italicized, text }: SMTextColorProperties) => (
6 | {text}
7 | );
8 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/helpers/getRecordString.tsx:
--------------------------------------------------------------------------------
1 | import { removeQuotes } from '@lib/common/common';
2 |
3 | function getRecordString(data: object, fieldName: string): string {
4 | const record = data[fieldName as keyof typeof data];
5 |
6 | return record ? removeQuotes(JSON.stringify(record)) : '';
7 | }
8 |
9 | export default getRecordString;
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/hooks/m3uLinkTemplate.tsx:
--------------------------------------------------------------------------------
1 | import { StreamGroupDto } from '@lib/smAPI/smapiTypes';
2 | import { LinkButton } from '../../buttons/LinkButton';
3 | import getRecordString from '../helpers/getRecordString';
4 |
5 | export function m3uLinkTemplate(data: StreamGroupDto) {
6 | return (
7 |
8 |
9 |
10 |
11 | );
12 | }
13 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/hooks/urlTemplate.tsx:
--------------------------------------------------------------------------------
1 | import { LinkButton } from '../../buttons/LinkButton';
2 | import getRecordString from '../helpers/getRecordString';
3 |
4 | export function urlTemplate(data: object) {
5 | return (
6 |
7 |
8 |
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/templates/blankTemplate.tsx:
--------------------------------------------------------------------------------
1 | export function blankTemplate() {
2 | return ;
3 | }
4 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/templates/epgSourceTemplate.tsx:
--------------------------------------------------------------------------------
1 | export function epgSourceTemplate(tvgid: string) {
2 | return (
3 |
6 | );
7 | }
8 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/templates/isHiddenTemplate.tsx:
--------------------------------------------------------------------------------
1 | import getRecord from '../helpers/getRecord';
2 |
3 | export function isHiddenTemplate(data: object, fieldName: string, dataKey?: string) {
4 | const record = getRecord({ data, dataKey, fieldName });
5 |
6 | return record ? : ;
7 | }
8 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/templates/streamsBodyTemplate.tsx:
--------------------------------------------------------------------------------
1 | export function streamsBodyTemplate(activeCount: string, totalCount: string) {
2 | if (activeCount === null || totalCount === undefined) {
3 | return null;
4 | }
5 |
6 | return (
7 |
8 | {activeCount}/{totalCount}
9 |
10 | );
11 | }
12 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smDataTable/types/smDataTableTypes.ts:
--------------------------------------------------------------------------------
1 | export type DataSelectorSelectionMode = 'checkbox' | 'multiple' | 'multipleNoCheckBox' | 'multipleNoRowCheckBox' | 'selectable' | 'single' | undefined;
2 | export type ColumnFieldType =
3 | | 'blank'
4 | | 'custom'
5 | | 'deleted'
6 | | 'epg'
7 | | 'epglink'
8 | | 'image'
9 | | 'isHidden'
10 | | 'm3ulink'
11 | | 'sg'
12 | | 'streams'
13 | | 'url'
14 | | 'filterOnly'
15 | | 'actions'
16 | | undefined;
17 | export type ColumnAlign = 'center' | 'left' | 'right' | null | undefined;
18 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smchannels/columns/useSMChannelLogoColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import SMChannelLogoEditor from '@components/smchannels/SMChannelLogoEditor';
2 | import createSMChannelMultiSelectColumnConfigHook from './createSMChannelMultiSelectColumnConfigHook';
3 |
4 | export const useSMChannelLogoColumnConfig = createSMChannelMultiSelectColumnConfigHook({
5 | dataField: 'Logo',
6 | EditorComponent: SMChannelLogoEditor,
7 | fieldType: 'image',
8 | headerTitle: 'Logo',
9 | sortable: false,
10 | useFilter: false,
11 | width: 44
12 | });
13 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smchannels/columns/useSMChannelNumberColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import SMChannelNumberEditor from '@components/smchannels/SMChannelNumberEditor';
2 | import createSMChannelMultiSelectColumnConfigHook from './createSMChannelMultiSelectColumnConfigHook';
3 |
4 | export const useSMChannelNumberColumnConfig = createSMChannelMultiSelectColumnConfigHook({
5 | dataField: 'ChannelNumber',
6 | EditorComponent: SMChannelNumberEditor,
7 | headerTitle: '#',
8 | sortable: true,
9 | width: 40
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smchannels/columns/useSMVideoOutputProfileNameColumnConfig.tsx:
--------------------------------------------------------------------------------
1 | import CommandProfileNameSelector from '../CommandProfileNameSelector';
2 | import createSMChannelMultiSelectColumnConfigHook from './createSMChannelMultiSelectColumnConfigHook';
3 |
4 | export const useSMCommandProfileNameColumnConfig = createSMChannelMultiSelectColumnConfigHook({
5 | dataField: 'CommandProfileName',
6 | EditorComponent: CommandProfileNameSelector,
7 | headerTitle: 'Profile Name',
8 | sortable: true,
9 | width: 125
10 | });
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/components/smstreams/StreamCopyLinkDialog.tsx:
--------------------------------------------------------------------------------
1 | import { LinkButton } from '@components/buttons/LinkButton';
2 | import { memo } from 'react';
3 |
4 | interface StreamCopyLinkDialogProperties {
5 | readonly realUrl?: string | undefined;
6 | readonly toolTip?: string | undefined;
7 | }
8 |
9 | const StreamCopyLinkDialog = ({ realUrl, toolTip = 'Stream Link' }: StreamCopyLinkDialogProperties) => {
10 | return ;
11 | };
12 |
13 | StreamCopyLinkDialog.displayName = 'StreamCopyLinkDialog';
14 |
15 | export default memo(StreamCopyLinkDialog);
16 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/features/settings/SettingsInterface.ts:
--------------------------------------------------------------------------------
1 | export interface SettingsInterface {
2 | field: string;
3 | warning?: string | null;
4 | }
5 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/Cache/cacheUtils.ts:
--------------------------------------------------------------------------------
1 | export const getAllSessionStorageKeys = (): string[] => {
2 | const keys: string[] = [];
3 | for (let i = 0; i < sessionStorage.length; i++) {
4 | const key = sessionStorage.key(i);
5 | if (key !== null) {
6 | keys.push(key);
7 | }
8 | }
9 | return keys;
10 | };
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/Cache/utils/getCacheItem.ts:
--------------------------------------------------------------------------------
1 | import { CacheItem } from '@lib/apiDefs';
2 |
3 | export function getCacheItem(key: string): T | null {
4 | const item = sessionStorage.getItem(key);
5 | if (!item) {
6 | return null;
7 | }
8 | try {
9 | const parsedItem: CacheItem = JSON.parse(item);
10 | return parsedItem.data;
11 | } catch {
12 | console.error('Failed to parse the stored item.');
13 | return null;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/Cache/utils/removeCacheItem.ts:
--------------------------------------------------------------------------------
1 | export function removeCacheItem(key: string): void {
2 | sessionStorage.removeItem(key);
3 | }
4 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/Cache/utils/setCacheItem.ts:
--------------------------------------------------------------------------------
1 | import { CacheItem } from '@lib/apiDefs';
2 |
3 | export function setCacheItem(key: string, data: T): void {
4 | const cacheItem: CacheItem = {
5 | data,
6 | timestamp: Date.now()
7 | };
8 | sessionStorage.setItem(key, JSON.stringify(cacheItem));
9 | }
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/axios.ts:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { baseHostURL } from './settings';
3 |
4 | export default axios.create({
5 | baseURL: baseHostURL,
6 | headers: {
7 | 'Content-type': 'application/json'
8 | }
9 | });
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/SDLogoIcon.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import sdLogoImage from '../../public/images/sd_logo.png'; // Adjust the path as necessary
3 |
4 | interface SDLogoIconProps {
5 | size?: number;
6 | [x: string]: any; // Additional props
7 | }
8 |
9 | const SDLogoIcon: React.FC = ({ size = 24, ...props }) => (
10 |
11 | );
12 |
13 | export default SDLogoIcon;
14 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/crypto.ts:
--------------------------------------------------------------------------------
1 | import CryptoJS from 'crypto-js';
2 |
3 | /**
4 | * Generates a cryptographically secure random key of the specified length.
5 | * @param keySize The size of the key in bits. Default is 128 bits.
6 | * @returns A Base64-encoded string representing the generated key.
7 | */
8 | export function generateKey(keySize: number = 128): string {
9 | const keyBytesSize = keySize / 8;
10 | const key = CryptoJS.lib.WordArray.random(keyBytesSize);
11 | return CryptoJS.enc.Base64.stringify(key);
12 | }
13 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/dataTypes.ts:
--------------------------------------------------------------------------------
1 | // export interface PagedResponseDto {
2 | // data: T[];
3 | // first: number;
4 | // pageNumber: number;
5 | // pageSize: number;
6 | // totalItemCount: number;
7 | // totalPageCount: number;
8 | // }
9 |
10 | export interface StringArgument {
11 | value: string;
12 | }
13 | // export interface PagedResponseDtoData {
14 | // data?: PagedResponseDto;
15 | // }
16 |
17 | export interface SimpleQueryResponse {
18 | data?: T[];
19 | }
20 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/getParameters.ts:
--------------------------------------------------------------------------------
1 | import { isSkipToken } from './isSkipToken';
2 |
3 | export function getParameters(param: any): any {
4 | return isSkipToken(param) ? undefined : param ? JSON.stringify(param) : undefined;
5 | }
6 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/isSkipToken.ts:
--------------------------------------------------------------------------------
1 | import { skipToken, SkipToken } from '@reduxjs/toolkit/query';
2 |
3 | export function isSkipToken(param: any): param is SkipToken {
4 | return param === skipToken;
5 | }
6 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/propertyExists.ts:
--------------------------------------------------------------------------------
1 | export const propertyExists = (obj: T, key: keyof any): key is keyof T => {
2 | if (obj === undefined) {
3 | return false;
4 | }
5 | return key in obj;
6 | };
7 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/common/stringUtils.ts:
--------------------------------------------------------------------------------
1 | export function removeExtension(filename: string): string {
2 | return filename.replace(/\.[^.]+/g, '');
3 | }
4 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/i18n/en/translation.json:
--------------------------------------------------------------------------------
1 | {
2 | "title": "Welcome {{name}}, to react using react-i18next fully type-safe",
3 | "description": {
4 | "part1": "This is a simple example.",
5 | "part2": "😉"
6 | },
7 | "userMessagesUnread_one": "You have {{count}} unread message.",
8 | "userMessagesUnread_other": "You have {{count}} unread messages."
9 | }
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/redux/emptyApi.ts:
--------------------------------------------------------------------------------
1 | import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
2 | import { baseHostURL } from '../settings';
3 |
4 | const rawBaseQuery = fetchBaseQuery({
5 | baseUrl: baseHostURL
6 | });
7 |
8 | export const emptySplitApi = createApi({
9 | baseQuery: rawBaseQuery,
10 | endpoints: () => ({})
11 | });
12 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/redux/hooks.ts:
--------------------------------------------------------------------------------
1 | import { useDispatch, useSelector, type TypedUseSelectorHook } from 'react-redux';
2 | import { AppDispatch, type RootState } from './store';
3 |
4 | interface DispatchFunction {
5 | (): AppDispatch;
6 | }
7 | export const useAppDispatch: DispatchFunction = useDispatch;
8 | export const useAppSelector: TypedUseSelectorHook = useSelector;
9 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/signalr/SignalRAuthLogOut.tsx:
--------------------------------------------------------------------------------
1 | export const authLogOut = (): void => {
2 | const currentUrl = window.location.pathname + window.location.search + window.location.hash;
3 | const returnUrl = encodeURIComponent(currentUrl);
4 | const loginUrl = `/login?ReturnUrl=${returnUrl}`;
5 |
6 | // Prevent redirecting if the current URL already matches the intended login URL
7 | if (window.location.href !== window.location.origin + loginUrl) {
8 | window.location.href = loginUrl;
9 | }
10 | };
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/smAPI/General/GeneralCommands.ts:
--------------------------------------------------------------------------------
1 | import { isSkipToken } from '@lib/common/isSkipToken';
2 | import SignalRService from '@lib/signalr/SignalRService';
3 | import { APIResponse,SetTestTaskRequest } from '@lib/smAPI/smapiTypes';
4 |
5 | export const SetTestTask = async (request: SetTestTaskRequest): Promise => {
6 | const signalRService = SignalRService.getInstance();
7 | return await signalRService.invokeHubCommand('SetTestTask', request);
8 | };
9 |
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/smAPI/Vs/VsCommands.ts:
--------------------------------------------------------------------------------
1 | import { isSkipToken } from '@lib/common/isSkipToken';
2 | import SignalRService from '@lib/signalr/SignalRService';
3 | import { V,GetVsRequest } from '@lib/smAPI/smapiTypes';
4 |
5 | export const GetVs = async (request: GetVsRequest): Promise => {
6 | if ( request === undefined ) {
7 | return undefined;
8 | }
9 | const signalRService = SignalRService.getInstance();
10 | return await signalRService.invokeHubCommand('GetVs', request);
11 | };
12 |
13 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/smAPI/WebSocket/WebSocketCommands.ts:
--------------------------------------------------------------------------------
1 | import { isSkipToken } from '@lib/common/isSkipToken';
2 | import SignalRService from '@lib/signalr/SignalRService';
3 | import { APIResponse,TriggerReloadRequest } from '@lib/smAPI/smapiTypes';
4 |
5 | export const TriggerReload = async (): Promise => {
6 | const signalRService = SignalRService.getInstance();
7 | return await signalRService.invokeHubCommand('TriggerReload');
8 | };
9 |
10 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/lib/styles/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | background: var(--surface-ground);
3 | color: var(--text-color);
4 | -webkit-font-smoothing: antialiased;
5 | -moz-osx-font-smoothing: grayscale;
6 | margin: 0.5rem;
7 | height: 98vh;
8 | }
9 |
10 | .card {
11 | background: var(--surface-card);
12 | margin-bottom: 1rem;
13 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.ttf
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Light.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.ttf
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/Roboto-Regular.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.eot
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.ttf
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/UbuntuMono-Regular.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/text-security-disc.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/text-security-disc.ttf
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/Fonts/text-security-disc.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/Fonts/text-security-disc.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/StreamMasterx32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/Content/StreamMasterx32.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/Content/styles.css:
--------------------------------------------------------------------------------
1 | .logo {
2 | margin: auto;
3 | padding: 9px;
4 | }
5 |
6 | .logoContainer {
7 | display: inline-block;
8 | margin: 0.5em;
9 | width: 50px;
10 | height: 50px;
11 | outline: none;
12 | border: solid 1px #e6e6e6;
13 | border-radius: 0.5em;
14 | background: #442211;
15 | box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
16 | cursor: pointer;
17 | }
18 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/StreamMasterx32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/StreamMasterx32.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultPort": 7095,
3 | "defaultBaseUrl": ""
4 | }
5 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/favicon.ico
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/default.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/default.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/mrmonday_logo_sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/mrmonday_logo_sm.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/senex_logo_sm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/senex_logo_sm.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/streammaster_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/streammaster_logo.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/streammaster_logo_small.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/streammaster_logo_small.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/images/transparent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/images/transparent.png
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-300.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-300.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-300.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-300.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-600.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-600.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-600.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-600.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-700.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-700.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-700.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-regular.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-dark/fonts/poppins-v15-latin-ext_latin-regular.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-300.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-300.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-300.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-300.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-600.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-600.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-600.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-600.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-700.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-700.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-700.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-regular.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/public/themes/streammaster-light/fonts/poppins-v15-latin-ext_latin-regular.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/_base.scss:
--------------------------------------------------------------------------------
1 | @import './_fonts';
2 | @import './_variables';
3 | @import './_borders';
4 | @import './_icons';
5 | @import './_text';
6 | @import './_standard';
7 | @import './_index';
8 | @import './_common';
9 | @import './_sm';
10 | @import './_components';
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/_index.scss:
--------------------------------------------------------------------------------
1 | .sidebar-sm-icon {
2 | border-right-color: #263238;
3 | border-right-style: solid;
4 | border-right-width: 1px;
5 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-channelgroup-selector.scss:
--------------------------------------------------------------------------------
1 | .sm-channelgroup-selector {
2 | // display: flex;
3 | // align-items: center;
4 | // justify-content: flex-start;
5 | // width: calc(100% - $input-height-with-no-borders-lg );
6 | // padding-left: $input-padding;
7 | // height: $input-height-with-no-borders;
8 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-dropdown.scss:
--------------------------------------------------------------------------------
1 | .sm-dropdown {
2 | cursor: pointer;
3 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-epg-selector.scss:
--------------------------------------------------------------------------------
1 | .sm-epg-selector {
2 | display: flex;
3 | align-items: center;
4 | justify-content: flex-start;
5 | width: calc(100% - $input-height-with-no-borders);
6 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-loader.scss:
--------------------------------------------------------------------------------
1 | .sm-loader {
2 | @extend .sm-dialog-overlay;
3 | position: absolute;
4 | display: flex;
5 | justify-content: center;
6 | align-items: center;
7 | align-content: center;
8 | z-index: 9999;
9 | height: 100%;
10 | width: 100%;
11 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-popover.scss:
--------------------------------------------------------------------------------
1 | .sm-popover {
2 | @extend .sm-box-shadow;
3 | @include sm-border;
4 | z-index: 2;
5 | width: 100%;
6 | padding: 0.5rem;
7 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-settings.scss:
--------------------------------------------------------------------------------
1 | .settings-lines {
2 | @include sm-border();
3 |
4 | .settings-line:nth-child(odd) {
5 | background: $tableBodyRowEvenBg;
6 | padding-top: 0.25rem;
7 | padding-bottom: 0.25rem;
8 | }
9 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm-streamingproxy-selector.scss:
--------------------------------------------------------------------------------
1 | .sm-streamingproxy-selector {
2 | @include datatable-text-style();
3 | @extend .sm-input-border;
4 | color: $textColor;
5 | padding: 0 !important;
6 | min-width: 100%;
7 |
8 | display: flex;
9 | align-items: center;
10 |
11 | min-height: $input-height-with-no-borders;
12 | height: $input-height-with-no-borders;
13 | max-height: $input-height-with-no-borders;
14 |
15 | .p-dropdown-label {
16 | padding: 0;
17 | color: $textColor;
18 | }
19 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/_sm_page.scss:
--------------------------------------------------------------------------------
1 | .p-paginator-bottom {
2 | .p-dropdown {
3 | align-items: center;
4 | }
5 | }
6 |
7 | .p-paginator-page-input {
8 | width: unset !important;
9 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/data/_filter.scss:
--------------------------------------------------------------------------------
1 | .p-column-filter-row {
2 | height: $input-height-with-no-borders;
3 |
4 | .p-inputtext {
5 | border-width: 0.1rem;
6 | border-color: $inputHoverBorderColor;
7 | }
8 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/components/input/_inputnumber.scss:
--------------------------------------------------------------------------------
1 | .p-inputnumber {
2 | &.p-invalid.p-component>.p-inputtext {
3 | @include invalid-input();
4 | }
5 |
6 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-300.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-300.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-300.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-300.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-600.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-600.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-600.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-600.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-700.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-700.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-700.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-700.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-regular.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-regular.woff
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-regular.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/streammaster-base/fonts/poppins-v15-latin-ext_latin-regular.woff2
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-dark/theme.scss:
--------------------------------------------------------------------------------
1 | @import './_variables';
2 | @import '../theme-base/_mixins';
3 | @import '../streammaster-base/_variables';
4 | @import '../streammaster-base/_sizes';
5 | @import '../streammaster-base/_headers';
6 | @import '../streammaster-base/_standard';
7 | @import '../theme-base/_components';
8 | @import '../streammaster-base/_base';
9 | @import '../extensions';
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/streammaster-light/theme.scss:
--------------------------------------------------------------------------------
1 | @import './_variables';
2 | @import '../theme-base/_mixins';
3 | @import '../streammaster-base/_variables';
4 | @import '../streammaster-base/_sizes';
5 | @import '../streammaster-base/_headers';
6 | @import '../streammaster-base/_standard';
7 | @import '../theme-base/_components';
8 | @import '../streammaster-base/_base';
9 | @import '../extensions';
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/input/_colorpicker.scss:
--------------------------------------------------------------------------------
1 | .p-colorpicker-preview {
2 | width: $colorPickerPreviewWidth;
3 | height: $colorPickerPreviewHeight;
4 | }
5 |
6 | .p-colorpicker-panel {
7 | background: $colorPickerBg;
8 | border: $colorPickerBorder;
9 |
10 | .p-colorpicker-color-handle,
11 | .p-colorpicker-hue-handle {
12 | border-color: $colorPickerHandleColor;
13 | }
14 | }
15 |
16 | .p-colorpicker-overlay-panel {
17 | box-shadow: $inputOverlayShadow;
18 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/input/_inputnumber.scss:
--------------------------------------------------------------------------------
1 | .p-inputnumber {
2 | &.p-invalid.p-component > .p-inputtext {
3 | @include invalid-input();
4 | }
5 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_blockui.scss:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/carlreid/StreamMaster/a8f8f6cda65138226ea2cfe73c5dd0db3a040c88/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_blockui.scss
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_inplace.scss:
--------------------------------------------------------------------------------
1 | .p-inplace {
2 | .p-inplace-display {
3 | padding: $inplacePadding;
4 | border-radius: $borderRadius;
5 | transition: $formElementTransition;
6 |
7 | &:not(.p-disabled):hover {
8 | background: $inplaceHoverBg;
9 | color: $inplaceTextHoverColor;
10 | }
11 |
12 | &:focus {
13 | @include focused();
14 | }
15 | }
16 | }
17 |
18 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_progressbar.scss:
--------------------------------------------------------------------------------
1 | .p-progressbar {
2 | border: $progressBarBorder;
3 | height: $progressBarHeight;
4 | background: $progressBarBg;
5 | border-radius: $borderRadius;
6 |
7 | .p-progressbar-value {
8 | border: 0 none;
9 | margin: 0;
10 | background: $progressBarValueBg;
11 | }
12 |
13 | .p-progressbar-label {
14 | color: $progressBarValueTextColor;
15 | line-height: $progressBarHeight;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_skeleton.scss:
--------------------------------------------------------------------------------
1 | .p-skeleton {
2 | background-color: $skeletonBg;
3 | border-radius: $borderRadius;
4 |
5 | &:after {
6 | background: linear-gradient(90deg, rgba(255, 255, 255, 0), $skeletonAnimationBg, rgba(255, 255, 255, 0));
7 | }
8 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/misc/_terminal.scss:
--------------------------------------------------------------------------------
1 | .p-terminal {
2 | background: $panelContentBg;
3 | color: $panelContentTextColor;
4 | border: $panelContentBorder;
5 | padding: $panelContentPadding;
6 |
7 | .p-terminal-input {
8 | font-family: var(--font-family);
9 | font-feature-settings: var(--font-feature-settings, normal);
10 | font-size: $common-font-size;
11 | }
12 | }
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/panel/_scrollpanel.scss:
--------------------------------------------------------------------------------
1 | .p-scrollpanel {
2 | .p-scrollpanel-bar {
3 | background: $scrollPanelTrackBg;
4 | border: $scrollPanelTrackBorder;
5 |
6 | &:focus-visible {
7 | @include focused();
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/panel/_splitter.scss:
--------------------------------------------------------------------------------
1 | .p-splitter {
2 | border: $panelContentBorder;
3 | background: $panelContentBg;
4 | border-radius: $borderRadius;
5 | color: $panelContentTextColor;
6 |
7 | .p-splitter-gutter {
8 | transition: $actionIconTransition;
9 | background: $splitterGutterBg;
10 |
11 | .p-splitter-gutter-handle {
12 | background: $splitterGutterHandleBg;
13 |
14 | &:focus-visible {
15 | @include focused();
16 | }
17 | }
18 | }
19 |
20 | .p-splitter-gutter-resizing {
21 | background: $splitterGutterHandleBg;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/themes/streammaster/theme-base/components/panel/_toolbar.scss:
--------------------------------------------------------------------------------
1 | .p-toolbar {
2 | background: $panelHeaderBg;
3 | border: $panelHeaderBorder;
4 | padding: $panelHeaderPadding;
5 | border-radius: $borderRadius;
6 | gap: $inlineSpacing;
7 |
8 | .p-toolbar-separator {
9 | margin: 0 $inlineSpacing;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/vite-environment.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/src/StreamMaster.WebUI/vite.polling.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite';
2 | import type { UserConfig } from 'vite';
3 | import baseConfig from './vite.config';
4 |
5 | const baseViteConfig = baseConfig as UserConfig;
6 |
7 | export default defineConfig({
8 | ...baseViteConfig,
9 | server: {
10 | ...baseViteConfig.server,
11 | watch: {
12 | usePolling: true,
13 | interval: 1000
14 | }
15 | }
16 | });
17 |
--------------------------------------------------------------------------------
/src/scripts/yt.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Enable debugging mode and log to a file
4 | exec >/path/to/your/logfile.log 2>&1
5 | set -x
6 |
7 | # Get the URL parameter
8 | url="$1"
9 |
10 | # Log the provided URL to verify it is correct
11 | echo "Provided URL: $url"
12 |
13 | # Use yt-dlp to download the video and pass it to ffmpeg
14 | /usr/local/bin/yt-dlp -q --no-warnings --ffmpeg-location /usr/local/bin/ffmpeg -f bestvideo+bestaudio -o - "$url" | /usr/local/bin/ffmpeg -i pipe:0 -c:v libx264 -c:a aac -f mpegts pipe:1
15 |
--------------------------------------------------------------------------------