U
    ÿci5                  
   @   s  d dl mZmZmZmZmZm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mZ d dlmZ d dlZeeZeejddddde_de_d	d
 ZejdkrdZdZdZndZdZdZejedZejedZdd Z e   eefD ]bZ!ej"e!se#e!ddd0Z$e!%dr6e
&g g de$ n
e$'d W 5 Q R X e(de!  qd dl)Z)ee)j)_*ee)j)_+g a,dd Z-dd  Z.d!d" Z/dUd#d$Z0e1d%d&d' Z2e1d(d)d* Z3ej1d+d,gd-d.d/ Z4e1d0d1d2 Z5e1d3e1d4d5d6 Z6ej1d7d8d,gd-d9d: Z7ej1d;d,gd-d<d= Z8ej1d>d,gd-d?d@ Z9ej1dAd,gd-dBdC Z:d dl)Z)e1dDdEdF Z;ej1dGd,gd-dHdI Z<ej1dJd,gd-dKdL Z=e1dMdNdO Z>edPkre(dQ ej?dRdSdT dS )V    )Flaskrender_templateredirecturl_forrequestjsonifyN)BeautifulSoup)ProxyFix)build   )Zx_forZx_protoZx_hostZx_prefixZsuper_secret_key_musicac                  C   s   t  } tdd| dS )NyoutubeZv3)credentials)auth_helperZget_authenticated_servicer
   )Zcreds r   /var/www/home/musica/app.pyget_youtube_client   s    r   posixz/var/www/home/musicaz/srv/musica/tempz/srv/musica/mp3.Z	cancioneszcanciones mp3zenlaces_descarga.txtzhistory.jsonc                  C   s<   t ttg} | D ](}tj|st| td|  qdS )z"Ensure required directories exist.zDirectorio creado: N)DOWNLOAD_TEMPDOWNLOAD_MP3BASE_DATA_DIRospathexistsmakedirsprint)ZfoldersZfolderr   r   r   create_folders"   s
    

r   wutf-8encodingz.json	discarded
downloaded zArchivo creado: c                 C   sD   d| ksd| kr4d| kr0|  dd  dd S | S d| kr@| S | S )uB   Extrae un ID único de la URL para usar como clave en el historialzyoutube.comzyoutu.bezv=r   &r   Zspotify)split)urlr   r   r   valid_url_id>   s    r(   c               
   C   sd   t jtsg g dS z2ttddd} t| W  5 Q R  W S Q R X W n   g g d Y S X dS )z9Carga el historial de canciones descartadas y descargadasr!   rr   r   N)r   r   r   HISTORY_FILEopenjsonload)fr   r   r   load_historyI   s    
"r/   c              	   C   s.   t tddd}tj| |dd W 5 Q R X dS )zGuarda el historial en discor   r   r      )indentN)r+   r*   r,   dump)historyr.   r   r   r   save_historyS   s    r4   c                 C   sJ   |dkrt  }t| }|dg |dg  }||kr:dS | |krFdS dS )uC   Verifica si una URL está en el historial (descartada o descargada)Nr"   r#   TF)r/   r(   get)r'   r3   vid_idZblocked_idsr   r   r   
is_blockedX   s    r7   /c                   C   s   t dtj  ttdS )NzDEBUG: Index hit. Script Root: search)r   r   script_rootr   r   r   r   r   r   indexl   s    r;   z/spotifyc                   C   s   t dddS )Nzspotify_manual.htmlzImportar Spotify)titler   r   r   r   r   spotify_indexq   s    r>   z/spotify/scanPOST)methodsc                  C   s  t dttj  t dtj  t dtj  tjd} | sPtt	dS t
d| }tt|}t dt| d g ad	d	d	d
}|D ]<}zt d|  t|}|j|dd}|sW 5 Q R  W q|d|dd}|d|dd}|dd}|r|dkr"|dd}| d| }	t d|	  t|sft|||||d|	 d W 5 Q R X W q tk
r }
 z:t d| d|
  t|st|ddd||d W 5 d }
~
X Y qX qtdtdtt dd d!S )"NzDEBUG: Headers: zDEBUG: Script Root: zDEBUG: Path: Zspotify_linksr>   z-https://open\.spotify\.com/track/[a-zA-Z0-9]+zEncontrados z" enlaces de Spotify. Escaneando...T)quietextract_flatZskip_downloadz%DEBUG: Scanning Spotify with yt-dlp: FZdownloadZtrackr<   DesconocidoZartistuploader	thumbnailr$   ZSpotifyz - zDEBUG: Found z
ytsearch1:idr<   ZchannelrF   r'   Zdownload_refzError escaneando z: zLink de Spotify
index.htmlzEscaneados ()spotify_scanvideosr<   mode)r   dictr   headersr:   r   formr5   r   r   refindalllistsetlenVIDEOS_CACHEyt_dlp	YoutubeDLextract_infor7   append	Exceptionr   )textZlinksydl_optslinkydlinfoZ
track_nameZartist_nameZimg_urlZ
full_titleer   r   r   rK   u   sb    


	rK   z
/favoritesc                  C   s   zt  } |  jdddd}| }g at }|dg D ]l}d|d  }t||s:t|d |d d	 |d d
 |d d d|d d dd||d q:t	dtdddW S  t
k
r } zt	ddt| d W Y S d }~X Y nX d S )Nzsnippet,contentDetailsZlike2   )partZmyRatingZ
maxResultsitems https://www.youtube.com/watch?v=rH   Zsnippetr<   ZchannelTitle
thumbnailshighdefaultr'   rG   rI   zYouTube FavoritesZlikesrL   
error.htmlzError obteniendo favoritos: error)r   rM   rT   ZexecuterW   r/   r5   r7   r[   r   r\   str)r   Zrequest_likesZresponser3   item	video_urlrb   r   r   r   fetch_favorites   s0    


&
	rp   z	/selectorz
/playlistsc                   C   s   t tdS )Nr9   )r   r   r   r   r   r   legacy_redirects   s    rq   z/searchGETc                  C   sB  t jdkr2t jd} | s(ttdS g aztd|  d ddd}t	|}|j
d	|  d
d}d|kr|d D ]X}d|d  }t|sxt|d |d |dd|di gd dd||d qxW 5 Q R X tdtd|  ddW S  tk
r0 } ztddt| d W Y S d }~X Y nX tdg dddS )Nr?   queryr9   zBuscando con yt-dlp: z...TZin_playlist)rA   rB   zytsearch20:FrC   entriesrf   rH   r<   rE   rD   rg   r'   r$   rG   rI   zResultados: rL   rj   u   Error en búsqueda: rk   ZBuscadorZsearch_input)r   methodrQ   r5   r   r   rW   r   rX   rY   rZ   r7   r[   r   r\   rm   )rs   r^   r`   resultrb   ro   r   r   r   r9      s8    
	,r9   z/savec               	   C   s   t j} | dg }|s$tdddS ttddd}|D ]}||d  q8W 5 Q R X t }|D ]&}t|}||d	 kr`|d	 	| q`t
| td
t|dS )Nurlsrl   zNo hay URLs para guardarstatusmessagear   r   
r#   success)rz   count)r   r,   r5   r   r+   ENLACES_FILEwriter/   r(   r[   r4   rV   )dataZselected_urlsr.   r'   r3   r6   r   r   r   save_selection  s    r   z/api/discardc                  C   s\   t j} | d}|s tddiS t }t|}||d krP|d | t| tddiS )Nr'   rz   rl   r"   r~   )r   r,   r5   r   r/   r(   r[   r4   )r   r'   r3   r6   r   r   r   discard_video%  s    
r   z/api/reset_historyc                  C   s    g g d} t |  tdddS )Nr!   r~   uA   Historial reiniciado. Las canciones ocultas volverán a aparecer.ry   )r4   r   )r3   r   r   r   reset_history5  s    
r   z
/downloadsc                   C   s   t dS )Nzdownloader.htmlr=   r   r   r   r   downloads_page=  s    r   z/api/start_downloadc               
   C   s   zt jtstdddW S ttddd} dd | D }W 5 Q R X |sZtdd	dW S tj|rvtd
ddW S tdddW S W n8 tk
r } ztdt	|d W Y S d }~X Y nX d S )Nrl   z'No hay lista de enlaces para descargar.ry   r)   r   r   c                 S   s   g | ]}|  r|  qS r   strip.0liner   r   r   
<listcomp>I  s      z"start_download.<locals>.<listcomp>u!   La lista de enlaces está vacía.r~   zDescarga iniciadazYa hay una descarga en curso)
r   r   r   r   r   r+   
downloaderstart_downloadr\   rm   )r.   rx   rb   r   r   r   r   A  s    r   z
/api/clearc               
   C   sr   z4t tddd} | d W 5 Q R X tdddW S  tk
rl } ztdt|d W Y S d }~X Y nX d S )	Nr   r   r   r$   r~   zLista vaciada.ry   rl   )r+   r   r   r   r\   rm   )r.   rb   r   r   r   
clear_listV  s    r   z/api/statusc               	   C   sf   d} t jtr<ttddd}tdd |D } W 5 Q R X ttjjtjj	tjj
tjjtjj| dS )Nr   r)   r   r   c                 S   s   g | ]}|  r|qS r   r   r   r   r   r   r   d  s      z#download_status.<locals>.<listcomp>)is_downloadingZlogsZprogressfinishedtotalZpending_in_file)r   r   r   r   r+   rV   r   r   r   Zlog_messagesZcurrent_progressZfinished_filesZtotal_files)Zpending_countr.   r   r   r   download_status_  s    r   __main__z0Iniciando servidor... Abre http://127.0.0.1:5000Fi  )debugport)N)@Zflaskr   r   r   r   r   r   r   rR   Zrequestsr,   rX   Zbs4r   Zwerkzeug.middleware.proxy_fixr	   Zgoogleapiclient.discoveryr
   r   __name__appwsgi_appZ
secret_keyr   namer   r   r   r   joinr   r*   r   Z	file_pathr   r+   r.   endswithr2   r   r   r   Zinput_folderZoutput_folderrW   r(   r/   r4   r7   Zrouter;   r>   rK   rp   rq   r9   r   r   r   r   r   r   r   runr   r   r   r   <module>   s    
	




C
%
'







