@ -9,10 +9,31 @@ from urllib.parse import urlparse
# remote_url
# description
output_dir = " loooooops "
year = " 2022 "
output_dir = os . path . join ( " loooooops " , year )
bitrate = " 128k "
def transcode_media ( path , media_item , metadata ) :
infile = os . path . join ( path , media_item )
outfile = os . path . join ( path , media_item + " .opus " )
if not os . path . exists ( outfile ) :
print ( " transcodeing to {} " . format ( outfile ) )
pid = os . fork ( )
if pid == 0 :
artist = metadata [ " creator " ]
title = metadata [ " url " ]
comment = metadata [ " description " ]
date = metadata [ " date " ]
os . execlp ( " ffmpeg " , " ffmpeg " , " -hide_banner " , " -loglevel " , " error " , " -i " , infile , " -map_metadata " , " -1 " , " -metadata " , " artist= {} " . format ( artist ) , " -metadata " , " title= {} " . format ( title ) , " -metadata " , " creation_time= {} " . format ( date ) , " -map_chapters " , " -1 " , " -ac " , " 2 " , " -af " , " loudnorm=dual_mono=true " , " -b:a " , bitrate , " -y " , outfile )
# never reached
else :
os . wait ( )
def grab_media ( path , url ) :
try :
media_item = urlparse ( url ) . path . split ( ' / ' ) [ - 1 ]
headers = {
@ -20,13 +41,19 @@ def grab_media(path, url):
' From ' : ' post.lurk.org/@lurk ' # This is another valid field
}
if not os . path . exists ( os . path . join ( path , media_item ) ) :
if os . path . exists ( os . path . join ( path , media_item ) ) :
return media_item
else :
response = requests . get ( url , headers = headers , stream = True )
if response . ok :
with open ( os . path . join ( path , media_item ) , ' wb ' ) as media_file :
shutil . copyfileobj ( response . raw , media_file )
print ( ' Downloaded media {} from {} ' . format ( media_item , urlparse ( url ) . netloc ) )
return media_item
except requests . exceptions . ConnectionError as e :
# maybe transient network issues
print ( e )
sleep ( 60 )
#This pages through all the looptober tag and collects the json in 'data'
there_is_more = True
@ -63,7 +90,7 @@ for collection in data:
i [ ' created_at ' ] [ : - 1 ] ) . astimezone (
datetime . timezone . utc )
if creation_date . strftime ( ' % Y ' ) == " 2022 " : #we only take entries from this year
if creation_date . strftime ( ' % Y ' ) == year : #we only take entries from this year
stuff = { }
stuff [ " url " ] = i [ " url " ]
stuff [ " description " ] = i [ " content " ]
@ -76,13 +103,9 @@ for collection in data:
i [ " account " ] [ " username " ] ,
len ( i [ " media_attachments " ] ) ) )
if not os . path . exists ( output_dir ) :
os . mkdir ( output_dir )
for l in looooops :
path = os . path . join ( output_dir , " {} _ {} " . format ( l [ ' creator ' ] , l [ ' id ' ] ) )
if not os . path . exists ( path ) :
os . mkdir ( path )
os . makedirs ( path , exist_ok = True )
print ( " \n " )
print ( " Downloading looops by *** {} *** " . format ( l [ ' creator ' ] ) )
@ -92,10 +115,13 @@ for l in looooops:
else :
url = a [ ' url ' ]
grab_media ( path , url )
media_item = grab_media ( path , url )
if media_item :
transcode_media ( path , media_item , l )
# Once we've done everythin we generate a playlist and ask ezstream
# to reload it
os . system ( ' find . -iname " *mp3 " > playlist_loooooops.m3u ' \
' && kill -s HUP `pidof ezstream` ' )
# this is not an injection vulnerability as output_dir is under
# our control
os . system ( ' find {} -iname " *opus " > playlist_loooooops.m3u ' \
' && kill -s HUP `pidof ezstream` ' . format ( output_dir ) )