a
    viU                      @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
Z
dZdZG dd dejejZG dd dejjZd	d
 Zejedd  dd Zdd Zdd Zdd Zd#ddZdd Zdd Zdd Zdd  Zd!d" ZdS )$    N)Imagei  z https://graph.facebook.com/v18.0c                   @   s   e Zd ZdZdS )ThreadingSimpleServerTN)__name__
__module____qualname__Zallow_reuse_address r   r   /home/ec2-user/insta_handler.pyr      s   r   c                       s$   e Zd Z fddZdd Z  ZS )CustomHandlerc              
      s  | j ds| j dr0| d | dd n2| j drT| d | dd nt   d S zztj t | j 	d}tj 
|}| d	t| |   t|d
}| || j W d    n1 s0    Y  W n& ty } zW Y d }~n
d }~0 0 d S )Nz.jpgz.jpeg   zContent-typez
image/jpeg.mp4z	video/mp4/zContent-Lengthrb)pathendswithZsend_responseZsend_headersuperdo_GETosjoingetcwdlstripgetsizestrZend_headersopencopyfileZwfile	Exception)self	file_path	file_sizefe	__class__r   r   r      s"    


0zCustomHandler.do_GETc                 G   s   d S )Nr   )r   formatargsr   r   r   log_message/   s    zCustomHandler.log_message)r   r   r   r   r$   __classcell__r   r   r    r   r	      s   r	   c               
   C   sT   z*t dtft} tdt d |   W n$ tyN } zW Y d}~n
d}~0 0 dS )zStarts the robust server. u'   🌍 Robust Web Server running on port z...N)r   PORTr	   printserve_foreverOSError)serverr   r   r   r   start_server2   s    r,   T)targetdaemonc                 C   sl   zVt j| }t j| d }t jd d  | }t j||}t | | |W S    |  Y S 0 d S )N      )	r   r   dirnamesplitextuuidZuuid4hexr   rename)r   folderextnew_namenew_pathr   r   r   clean_filename?   s    r:   c              
   C   s   zt | }|jdkr |d}|j\}}|| }d|  krFdkrPn n| W S td|dd || }}|dk rt|d }n|dkrt|d }t d||fd}|| d }|| d }	||||	f |j	| d	d
 | W S  t
y }
 ztd|
  | W  Y d }
~
S d }
~
0 0 d S )NRGBg?g(\?u(      ⚠️ Fixing Image Ratio! (Current: z.2f))r   r   r      _   )qualityu      ❌ Image Check Failed: )r   r   modeconvertsizer(   intnewpastesaver   )Z
image_pathZimgwidthheightZratioZ	new_widthZ
new_heightZnew_imgZx_offsetZy_offsetr   r   r   r   validate_and_resize_imageK   s.    




rI   c                 C   s$   t j| d  }|dv r dS dS )Nr/   )r   z.movz.aviz.mkvz.webmVIDEOIMAGE)r   r   r2   lower)r   r7   r   r   r   get_file_typek   s    rM   c                 C   s8   t j| }tjd}| d| }td|  |S )z)Returns the Secure HTTPS URL using Ngrok.r   u      🔗 Serving (HTTPS): )r   r   basenameconfig	NGROK_URLrstripr(   )r   filenameZ
clean_base
public_urlr   r   r   get_public_urlq   s
    rT   r&   Fc              
   C   s   t  d| d}d|i}|dkr2| |d< d|d< n| |d< |sH||d	< nd
|d< z<tj||dd}| }	d|	v r||	d W S td|	  W n2 ty }
 ztd|
  W Y d }
~
n
d }
~
0 0 d S )Nr   /mediaaccess_tokenrJ   Z	video_urlZREELS
media_typeZ	image_urlcaptionTZis_carousel_item<   datatimeoutidu      ❌ Container Error: u      ❌ Container Exception: )BASE_FB_URLrequestspostjsonr(   r   )Zfile_urlrW   tokenuser_idrX   is_carouselurlpayloadrr[   r   r   r   r   create_media_container|   s"    

$rh   c                 C   sx   t  d| d}| |d}zJtj||dd}| }d|v rTtd|d   W dS td	|  W n   Y d
S 0 d S )Nr   z/media_publish)creation_idrV   rY   rZ   r]   u      🎉 SUCCESS! Post ID: Tu      ❌ Publish Error: F)r^   r_   r`   ra   r(   )ri   rb   rc   re   rf   rg   r[   r   r   r   publish_container   s    
rj   c                 C   s   t  d|  }d|d}tddd tdD ]~}zTtj||dd	}| dd
}|dkrjtd W  dS |dkrtd W  dS W n   Y n0 tdddd td q,dS )Nr   Zstatus_code)fieldsrV   u      ⏳ Processingr&   )end(   
   )paramsr\   ZUNKNOWNFINISHEDu
    Done! ✅TERRORu    Failed! ❌F.)rl   flush   )r^   r(   ranger_   getra   timesleep)container_idrb   re   ro   _rg   statusr   r   r   wait_for_processing   s$    
r|   c                 C   st   t | } t| }|dkr t|  t| }t|||||d}|rpt||rpt||| zt|  W n   Y n0 d S )NrK   )rX   )	r:   rM   rI   rT   rh   r|   rj   r   remove)r   rX   rb   rc   rW   rS   ry   r   r   r   upload_single_media   s    r~   c                 C   sJ  t dt|  d dd | D }g }|D ]D}t|}|dkrFt| t|}t||||dd}	|	r*||	 q*|sxd S t d g }
|D ]}t||r|
| q|
sd S t d	| d
}d|d	|
|d}t
j||d}| }d|v r8t|d |rFt|d || |D ]"}zt| W n   Y n0 qnt d|  d S )Nu      📚 Uploading Album (z
 items)...c                 S   s   g | ]}t |qS r   )r:   ).0pr   r   r   
<listcomp>       z upload_album.<locals>.<listcomp>rK   T)rd   u2      🛑 Waiting for Instagram to download items...r   rU   ZCAROUSEL,)rW   rX   childrenrV   )r[   r]   u      ❌ Album Creation Error: )r(   lenrM   rI   rT   rh   appendr|   r^   r   r_   r`   ra   rj   r   r}   )pathsrX   rb   rc   Zclean_pathsZcontainer_idsr   Zm_typerS   Zc_idZvalid_childrenZcidre   rf   rg   r[   r   r   r   r   upload_album   sB    

r   c                 C   s4   t d t| tr"t| ||| nt| ||| d S )Nu&   
🚀 [InstaHandler] Request received.)r(   
isinstancelistr   r~   )mediarX   rb   rc   r   r   r   upload_to_instagram   s    
r   )r&   F) r_   rw   r   	threadingZhttp.serverhttpZsocketserverr3   PILr   rO   r'   r^   ZThreadingMixInZ	TCPServerr   r+   ZSimpleHTTPRequestHandlerr	   r,   Threadstartr:   rI   rM   rT   rh   rj   r|   r~   r   r   r   r   r   r   <module>   s0   
 
.