@@ -1694,21 +1694,44 @@ app.post('/api/streams', isAuthenticated, [
16941694 use_advanced_settings : req . body . useAdvancedSettings === 'true' || req . body . useAdvancedSettings === true ,
16951695 user_id : req . session . userId
16961696 } ;
1697- if ( req . body . scheduleTime ) {
1698- const scheduleDate = new Date ( req . body . scheduleTime ) ;
1697+ const serverTimezone = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ;
1698+
1699+ function parseLocalDateTime ( dateTimeString ) {
1700+ const [ datePart , timePart ] = dateTimeString . split ( 'T' ) ;
1701+ const [ year , month , day ] = datePart . split ( '-' ) . map ( Number ) ;
1702+ const [ hours , minutes ] = timePart . split ( ':' ) . map ( Number ) ;
16991703
1700- const serverTimezone = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ;
1701- console . log ( `[CREATE STREAM] Server timezone: ${ serverTimezone } ` ) ;
1702- console . log ( `[CREATE STREAM] Input time: ${ req . body . scheduleTime } ` ) ;
1703- console . log ( `[CREATE STREAM] Parsed time: ${ scheduleDate . toISOString ( ) } ` ) ;
1704- console . log ( `[CREATE STREAM] Local display: ${ scheduleDate . toLocaleString ( 'en-US' , { timeZone : serverTimezone } ) } ` ) ;
1704+ return new Date ( year , month - 1 , day , hours , minutes ) ;
1705+ }
1706+
1707+ if ( req . body . scheduleStartTime ) {
1708+ const scheduleStartDate = parseLocalDateTime ( req . body . scheduleStartTime ) ;
1709+ streamData . schedule_time = scheduleStartDate . toISOString ( ) ;
1710+ streamData . status = 'scheduled' ;
17051711
1706- streamData . schedule_time = scheduleDate . toISOString ( ) ;
1712+ if ( req . body . scheduleEndTime ) {
1713+ const scheduleEndDate = parseLocalDateTime ( req . body . scheduleEndTime ) ;
1714+
1715+ if ( scheduleEndDate <= scheduleStartDate ) {
1716+ return res . status ( 400 ) . json ( {
1717+ success : false ,
1718+ error : 'End time must be after start time'
1719+ } ) ;
1720+ }
1721+
1722+ streamData . end_time = scheduleEndDate . toISOString ( ) ;
1723+ const durationMs = scheduleEndDate - scheduleStartDate ;
1724+ const durationMinutes = Math . round ( durationMs / ( 1000 * 60 ) ) ;
1725+ streamData . duration = durationMinutes > 0 ? durationMinutes : null ;
1726+ }
1727+ } else if ( req . body . scheduleEndTime ) {
1728+ const scheduleEndDate = parseLocalDateTime ( req . body . scheduleEndTime ) ;
1729+ streamData . end_time = scheduleEndDate . toISOString ( ) ;
17071730 }
1708- if ( req . body . duration ) {
1709- streamData . duration = parseInt ( req . body . duration ) ;
1731+
1732+ if ( ! streamData . status ) {
1733+ streamData . status = 'offline' ;
17101734 }
1711- streamData . status = req . body . scheduleTime ? 'scheduled' : 'offline' ;
17121735 const stream = await Stream . create ( streamData ) ;
17131736 res . json ( { success : true , stream } ) ;
17141737 } catch ( error ) {
@@ -1786,26 +1809,56 @@ app.put('/api/streams/:id', isAuthenticated, async (req, res) => {
17861809 if ( req . body . useAdvancedSettings !== undefined ) {
17871810 updateData . use_advanced_settings = req . body . useAdvancedSettings === 'true' || req . body . useAdvancedSettings === true ;
17881811 }
1789- if ( req . body . duration !== undefined && req . body . duration !== null && req . body . duration !== '' ) {
1790- updateData . duration = parseInt ( req . body . duration ) ;
1791- } else if ( 'duration' in req . body && ! req . body . duration ) {
1792- updateData . duration = null ;
1793- }
1812+ const serverTimezone = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ;
17941813
1795- if ( req . body . scheduleTime ) {
1796- const scheduleDate = new Date ( req . body . scheduleTime ) ;
1797-
1798- const serverTimezone = Intl . DateTimeFormat ( ) . resolvedOptions ( ) . timeZone ;
1799- console . log ( `[UPDATE STREAM] Server timezone: ${ serverTimezone } ` ) ;
1800- console . log ( `[UPDATE STREAM] Input time: ${ req . body . scheduleTime } ` ) ;
1801- console . log ( `[UPDATE STREAM] Parsed time: ${ scheduleDate . toISOString ( ) } ` ) ;
1802- console . log ( `[UPDATE STREAM] Local display: ${ scheduleDate . toLocaleString ( 'en-US' , { timeZone : serverTimezone } ) } ` ) ;
1814+ function parseLocalDateTime ( dateTimeString ) {
1815+ const [ datePart , timePart ] = dateTimeString . split ( 'T' ) ;
1816+ const [ year , month , day ] = datePart . split ( '-' ) . map ( Number ) ;
1817+ const [ hours , minutes ] = timePart . split ( ':' ) . map ( Number ) ;
18031818
1804- updateData . schedule_time = scheduleDate . toISOString ( ) ;
1819+ return new Date ( year , month - 1 , day , hours , minutes ) ;
1820+ }
1821+
1822+ if ( req . body . scheduleStartTime ) {
1823+ const scheduleStartDate = parseLocalDateTime ( req . body . scheduleStartTime ) ;
1824+ updateData . schedule_time = scheduleStartDate . toISOString ( ) ;
18051825 updateData . status = 'scheduled' ;
1806- } else if ( 'scheduleTime' in req . body && ! req . body . scheduleTime ) {
1826+
1827+ if ( req . body . scheduleEndTime ) {
1828+ const scheduleEndDate = parseLocalDateTime ( req . body . scheduleEndTime ) ;
1829+
1830+ if ( scheduleEndDate <= scheduleStartDate ) {
1831+ return res . status ( 400 ) . json ( {
1832+ success : false ,
1833+ error : 'End time must be after start time'
1834+ } ) ;
1835+ }
1836+
1837+ updateData . end_time = scheduleEndDate . toISOString ( ) ;
1838+ const durationMs = scheduleEndDate - scheduleStartDate ;
1839+ const durationMinutes = Math . round ( durationMs / ( 1000 * 60 ) ) ;
1840+ updateData . duration = durationMinutes > 0 ? durationMinutes : null ;
1841+ } else if ( 'scheduleEndTime' in req . body && req . body . scheduleEndTime === '' ) {
1842+ updateData . end_time = null ;
1843+ updateData . duration = null ;
1844+ }
1845+ } else if ( 'scheduleStartTime' in req . body && ! req . body . scheduleStartTime ) {
18071846 updateData . schedule_time = null ;
18081847 updateData . status = 'offline' ;
1848+
1849+ if ( req . body . scheduleEndTime ) {
1850+ const scheduleEndDate = parseLocalDateTime ( req . body . scheduleEndTime ) ;
1851+ updateData . end_time = scheduleEndDate . toISOString ( ) ;
1852+ } else if ( 'scheduleEndTime' in req . body && req . body . scheduleEndTime === '' ) {
1853+ updateData . end_time = null ;
1854+ updateData . duration = null ;
1855+ }
1856+ } else if ( req . body . scheduleEndTime ) {
1857+ const scheduleEndDate = parseLocalDateTime ( req . body . scheduleEndTime ) ;
1858+ updateData . end_time = scheduleEndDate . toISOString ( ) ;
1859+ } else if ( 'scheduleEndTime' in req . body && req . body . scheduleEndTime === '' ) {
1860+ updateData . end_time = null ;
1861+ updateData . duration = null ;
18091862 }
18101863
18111864 const updatedStream = await Stream . update ( req . params . id , updateData ) ;
0 commit comments