
    8h9                     ^   S r SSKJrJrJr  SSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJrJr  SSKJr  SSKJr  SSKJrJrJrJrJr  SSK J!r!J"r"J#r#  SSK$J%r%J&r&J'r'   " S S\\5      r( " S S\\5      r) " S S\\5      r* " S S\\5      r+ " S S\\5      r, " S S\\5      r-\\\
" S/5      S 5       5       5       r.\\\
" S/5      S 5       5       5       r/\\\
" S/5      S 5       5       5       r0 " S  S!\\5      r1 " S" S#\\5      r2 " S$ S%\\5      r3S& r4S' r5g())z
Stream Management Views

This module contains views for managing streaming channels, sessions,
configurations, and real-time stream control operations.
    )renderget_object_or_404redirect)LoginRequiredMixin)login_required)require_http_methods)csrf_protect)messages)JsonResponse)reverse_lazy)ListView
DetailView
CreateView
UpdateView)method_decorator   )ChannelStreamSession
HLSSegmentVideoConfigurationAudioConfiguration)start_stream_capturestop_stream_capturecreate_playlist_for_channel)ChannelFormVideoConfigurationFormAudioConfigurationFormc                   B   ^  \ rS rSrSr\rSrSrSr	S r
U 4S jrSrU =r$ )	ChannelListView   zJ
List view for streaming channels with filtering and search capabilities.
zstreams/channel_list.htmlchannels   c                    [         R                  R                  S5      R                  S5      nU R                  R
                  R                  S5      nU(       a/  UR                  US9UR                  US9-  UR                  US9-  nU R                  R
                  R                  S5      nUS:X  a  UR                  S	S
9nU$ US:X  a  UR                  SS
9nU$ )z6Filter channels based on search and status parameters.
created_byz-created_atsearch)name__icontains)slug__icontains)description__icontainsstatusactiveT	is_activeinactiveF)r   objectsselect_relatedorder_byrequestGETgetfilter)selfquerysetr%   r)   s       >C:\Users\brahi\OneDrive\Desktop\Code\src\apps\streams\views.pyget_querysetChannelListView.get_queryset#   s    ??11,?HHW !!%%h/ & '  &    '-   	H !!%%h/X6H  z!7H    c                   > [         TU ]  " S0 UD6nU R                  R                  R	                  SS5      US'   U R                  R                  R	                  SS5      US'   US    H  nUR                  5       Ul        M     U$ )z(Add additional context for the template.r%    r)   status_filterr!    )superget_context_datar1   r2   r3   get_active_sessionactive_session)r5   kwargscontextchannel	__class__s       r7   r@    ChannelListView.get_context_data;   s    '*4V4 LL,,002>#'<<#3#3#7#7"#E  z*G%,%?%?%AG" + r:   r>   )__name__
__module____qualname____firstlineno____doc__r   modeltemplate_namecontext_object_namepaginate_byr8   r@   __static_attributes____classcell__rF   s   @r7   r   r      s.     E/M$K0
 
r:   r   c                   8   ^  \ rS rSrSr\rSrSrU 4S jr	Sr
U =r$ )ChannelDetailViewH   zH
Detail view for individual channels with session history and controls.
zstreams/channel_detail.htmlrE   c                 \  > [         TU ]  " S
0 UD6nU R                  R                  R	                  SS5      R                  S5      SS US'   U R                  R                  5       US'   [        R                  R                  5       US'   [        R                  R                  5       US	'   U$ )z2Add session history and configuration information.video_configaudio_config-started_atN
   recent_sessionsrB   video_configsaudio_configsr>   )r?   r@   objectsessionsr/   r0   rA   r   r.   allr   r5   rC   rD   rF   s      r7   r@   "ChannelDetailView.get_context_dataQ   s    '*4V4 &*[[%9%9%H%HN&

(=
!#2&'!"
 %)KK$B$B$D ! $6#=#=#A#A#C #5#=#=#A#A#C r:   r>   )rH   rI   rJ   rK   rL   r   rM   rN   rO   r@   rQ   rR   rS   s   @r7   rU   rU   H   s$     E1M# r:   rU   c                   H   ^  \ rS rSrSr\r\rSr	\
" S5      rU 4S jrSrU =r$ )ChannelCreateViewd   z)
Create view for new streaming channels.
streams/channel_form.htmlzstreams:channel_listc                    > U R                   R                  UR                  l        [        R
                  " U R                   S5        [        TU ]  U5      $ )z,Set the current user as the channel creator.zChannel created successfully!)r1   userinstancer$   r
   successr?   
form_validr5   formrF   s     r7   rl   ChannelCreateView.form_validn   s>    #'<<#4#4 'FGw!$''r:   r>   )rH   rI   rJ   rK   rL   r   rM   r   
form_classrN   r   success_urlrl   rQ   rR   rS   s   @r7   re   re   d   s.     EJ/M56K( (r:   re   c                   >   ^  \ rS rSrSr\r\rSr	S r
U 4S jrSrU =r$ )ChannelUpdateViewu   z.
Update view for existing streaming channels.
rg   c                 B    [        SSU R                  R                  0S9$ )z3Redirect to channel detail after successful update.streams:channel_detailpk)rC   )r   r_   rw   r5   s    r7   get_success_url!ChannelUpdateView.get_success_url~   s    4dDKKNN=STTr:   c                 d   > [         R                  " U R                  S5        [        TU ]  U5      $ )z!Add success message after update.zChannel updated successfully!r
   rk   r1   r?   rl   rm   s     r7   rl   ChannelUpdateView.form_valid   s(    'FGw!$''r:   r>   )rH   rI   rJ   rK   rL   r   rM   r   rp   rN   ry   rl   rQ   rR   rS   s   @r7   rs   rs   u   s)     EJ/MU( (r:   rs   c                   B   ^  \ rS rSrSr\rSrSrSr	S r
U 4S jrSrU =r$ )	StreamSessionListView   z>
List view for stream sessions with filtering and pagination.
zstreams/session_list.htmlr`   r"   c                 R   [         R                  R                  SSS5      R                  S5      nU R                  R
                  R                  S5      nU(       a  UR                  US9nU R                  R
                  R                  S5      nU(       a  UR                  US9nU$ )z,Filter sessions based on channel and status.rE   rX   rY   rZ   )
channel_idr)   )r)   )r   r.   r/   r0   r1   r2   r3   r4   )r5   r6   r   r)   s       r7   r8   "StreamSessionListView.get_queryset   s     ((77~~

(=
! 	
 \\%%)))4
*=H !!%%h/f5Hr:   c                 2  > [         TU ]  " S
0 UD6n[        R                  R	                  SS9US'   U R
                  R                  R                  SS5      US'   U R
                  R                  R                  SS5      US'   [        R                  US	'   U$ )zAdd filter options to context.Tr+   r!   rE   r<   channel_filterr)   r=   status_choicesr>   )
r?   r@   r   r.   r4   r1   r2   r3   r   STATUS_CHOICESrb   s      r7   r@   &StreamSessionListView.get_context_data   s    '*4V4%oo44t4D
$(LL$4$4$8$8B$G !#'<<#3#3#7#7"#E $1$@$@ !r:   r>   )rH   rI   rJ   rK   rL   r   rM   rN   rO   rP   r8   r@   rQ   rR   rS   s   @r7   r   r      s.     E/M$K$ r:   r   c                   8   ^  \ rS rSrSr\rSrSrU 4S jr	Sr
U =r$ )StreamSessionDetailView   zF
Detail view for individual stream sessions with segment information.
zstreams/session_detail.htmlsessionc                   > [         TU ]  " S0 UD6nU R                  R                  R	                  S5      SS US'   U R                  R                  R                  5       nUR                  5       US'   UR                  SS9R                  5       US'   UR                  5       (       a,  [        S	 U 5       5      nXBS
'   [        S U 5       5      nXRS'   U$ )z'Add segment information and statistics.-processed_atNr"   recent_segmentstotal_segmentsT)is_availableavailable_segmentsc              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7fN)duration.0segs     r7   	<genexpr>;StreamSessionDetailView.get_context_data.<locals>.<genexpr>   s      R#\\   --total_durationc              3   ^   #    U  H#  oR                   (       d  M  UR                   v   M%     g 7fr   )	file_sizer   s     r7   r   r      s     Phs--]S]]hr   
total_sizer>   )
r?   r@   r_   segmentsr0   ra   countr4   existssum)r5   rC   rD   r   r   r   rF   s         r7   r@   (StreamSessionDetailView.get_context_data   s    '*4V4 &*[[%9%9%B%B?%STWUW%X!" ;;''++-$,NN$4 !(0T(J(P(P(R$%??  R RRN(6$%PhPPJ$.L!r:   r>   )rH   rI   rJ   rK   rL   r   rM   rN   rO   r@   rQ   rR   rS   s   @r7   r   r      s$     E1M# r:   r   POSTc                 
   [        [        US9nUR                  5       (       a+  [        R                  " U S5        [        SUR                  S9$  U R                  R                  S5      nU R                  R                  S5      n[        R                  " [        UR                  5      UUS9n[        R                  " U SUR                   35        U R                  R                  S	5      (       a0  UR!                  5         UR                  5       n[#        U S
UUS.5      $ [        SUR                  S9$ ! [$         aA  n[        R                  " U S[        U5       35        [        SUR                  S9s SnA$ SnAff = f)z
HTMX endpoint to start stream capture for a channel.

Args:
    request: HTTP request object
    channel_id: ID of the channel to start streaming
    
Returns:
    HttpResponse: HTML content for HTMX swap
idz,Channel already has an active stream sessionrv   rw   rX   rY   )r   video_config_idaudio_config_idzStream capture started for 
HX-Request#streams/partials/stream_status.htmlrE   rB   zFailed to start stream: N)r   r   rA   r
   errorr   rw   r   r3   r   delaystrr   rk   nameheadersrefresh_from_dbr   	Exception)r1   r   rE   r   r   taskrB   es           r7   start_streamr      sR     J7G !!##w NO0WZZ@@A!,,**>:!,,**>: $))7::++
 	$?~"NO ??|,,##%$779N'#H""0K  
 0WZZ@@ Aw":3q6( CD0WZZ@@As%   CD7 #D7 7
F6E=7F=Fc                    [        [        US9nUR                  5       (       d5  [        R                  " U S5        [        SUR                  R                  S9$  [        R                  " [        UR                  5      5      n[        R                  " U SUR                  R                   35        U R                  R                  S5      (       a<  UR                  nUR!                  5         UR#                  5       n[%        U SUUS.5      $ [        SUR                  R                  S9$ ! [&         aK  n[        R                  " U S	[        U5       35        [        SUR                  R                  S9s S
nA$ S
nAff = f)z
HTMX endpoint to stop an active stream session.

Args:
    request: HTTP request object
    session_id: ID of the session to stop
    
Returns:
    HttpResponse: HTML content for HTMX swap
r   z Session is not currently runningrv   r   zStream stopped for r   r   r   zFailed to stop stream: N)r   r   
is_runningr
   r   r   rE   rw   r   r   r   r   rk   r   r   r3   r   rA   r   r   )r1   
session_idr   r   rE   rB   r   s          r7   stop_streamr     s?     *=G w BC0W__5G5GHHI"((WZZ9$78L8L7M"NO ??|,,ooG##%$779N'#H""0K  
 0W__5G5GHH Iw"9#a& BC0W__5G5GHHIs&   B2D+ D+ +
F 5A E;5F ;F c                    [        [        US9nUR                  5       (       a+  [        R                  " U S5        [        SUR                  S9$  UR                  R                  nUR                  5         [        R                  " U SU S35        [        S5      $ ! [         aA  n[        R                  " U S[        U5       35        [        SUR                  S9s S	nA$ S	nAff = f)
z
Delete a stream session and all associated segments.

Args:
    request: HTTP request object
    session_id: ID of the session to delete
    
Returns:
    HttpResponse: Redirect to session list
r   z/Cannot delete a running session. Stop it first.zstreams:session_detailr   zSession for z has been deletedzstreams:session_listzFailed to delete session: N)r   r   r   r
   r   r   r   rE   r   deleterk   r   r   )r1   r   r   channel_namer   s        r7   delete_sessionr   0  s      *=G w QR0WZZ@@	A++L>O"PQ.// Aw"<SVH EF0WZZ@@As   AB 
C'&6C"C'"C'c                   >   ^  \ rS rSrSr\rSrSrS r	U 4S jr
SrU =r$ )ConfigurationListViewiQ  z8
Combined list view for video and audio configurations.
zstreams/config_list.htmlconfigurationsc                 >    [         R                  R                  5       $ )z?Return empty queryset since we handle data in get_context_data.)r   r.   nonerx   s    r7   r8   "ConfigurationListView.get_querysetZ  s    !))..00r:   c                    > [         TU ]  " S0 UD6n[        R                  R	                  5       R                  S5      US'   [        R                  R	                  5       R                  S5      US'   U$ )z(Get both video and audio configurations.r   r]   r^   r>   )r?   r@   r   r.   ra   r0   r   rb   s      r7   r@   &ConfigurationListView.get_context_data^  sb    '*4V4#5#=#=#A#A#C#L#LV#T #5#=#=#A#A#C#L#LV#T r:   r>   )rH   rI   rJ   rK   rL   r   rM   rN   rO   r8   r@   rQ   rR   rS   s   @r7   r   r   Q  s)     E.M*1 r:   r   c                   H   ^  \ rS rSrSr\r\rSr	\
" S5      rU 4S jrSrU =r$ )VideoConfigurationCreateViewif  z'
Create view for video configurations.
zstreams/video_config_form.htmlstreams:config_listc                 d   > [         R                  " U R                  S5        [        TU ]  U5      $ )Add success message.z)Video configuration created successfully!r|   rm   s     r7   rl   'VideoConfigurationCreateView.form_validp  (    'RSw!$''r:   r>   )rH   rI   rJ   rK   rL   r   rM   r   rp   rN   r   rq   rl   rQ   rR   rS   s   @r7   r   r   f  .     E'J4M45K( (r:   r   c                   H   ^  \ rS rSrSr\r\rSr	\
" S5      rU 4S jrSrU =r$ )AudioConfigurationCreateViewiv  z'
Create view for audio configurations.
zstreams/audio_config_form.htmlr   c                 d   > [         R                  " U R                  S5        [        TU ]  U5      $ )r   z)Audio configuration created successfully!r|   rm   s     r7   rl   'AudioConfigurationCreateView.form_valid  r   r:   r>   )rH   rI   rJ   rK   rL   r   rM   r   rp   rN   r   rq   rl   rQ   rR   rS   s   @r7   r   r   v  r   r:   r   c                      [        [        US9nUUR                  5       UR                  5       S.n[	        U SU5      $ ! [
         a  n[        SU S35      s SnA$ SnAff = f)z
HTMX endpoint for real-time stream status updates.

Args:
    request: HTTP request object
    session_id: ID of the session to check
    
Returns:
    HttpResponse: HTML fragment with session status
r   )r   r   r   z$streams/partials/session_status.htmlz!<div class="text-red-500">Error: z</div>N)r   r   r   r   r   r   HttpResponse)r1   r   r   rD   r   s        r7   stream_statusr     sq    K#MjA ((*!,,.
 gEwOO K?s&IJJKs   <? 
A"	AA"A"c                     [        [        US9nUR                  R                  S5      nU R                  R                  SS5      n[        US5      nUR                  U5      nUUS.n[        U SU5      $ )z
HTMX endpoint for paginated segment list.

Args:
    request: HTTP request object
    session_id: ID of the session
    
Returns:
    HttpResponse: HTML fragment with segment list
r   r   pager   r[   )r   r   z"streams/partials/segment_list.html)	r   r   r   r0   r2   r3   	Paginatorget_pager   )r1   r   r   r   r   	paginatorsegments_pagerD   s           r7   segment_listr     sy      *=G((9H ;;??61%D(B'I&&t,M !G
 '?IIr:   N)6rL   django.shortcutsr   r   r   django.contrib.auth.mixinsr   django.contrib.auth.decoratorsr   django.views.decorators.httpr   django.views.decorators.csrfr	   django.contribr
   django.httpr   django.urlsr   django.views.genericr   r   r   r   django.utils.decoratorsr   modelsr   r   r   r   r   tasksr   r   r   formsr   r   r   r   rU   re   rs   r   r   r   r   r   r   r   r   r   r   r>   r:   r7   <module>r      sd   A @ 9 9 = 5 # $ $ M M 9 4 ^ ^ Y Y N N,(( ,^*J 8(*J ("(*J (&#. #L0* > vh/A    /Ad vh(I    (IV vhA    A<. *(#5z ( (#5z ( K4Jr:   