2017-07-12 18:08:49 +00:00
'''
https : / / gist . github . com / blacktwin / 4 ccb79c7d01a95176b8e88bf4890cd2b
'''
from plexapi . server import PlexServer
import random
import re
baseurl = ' http://localhost:32400 '
2018-02-14 14:33:52 +00:00
token = ' xxxxx '
2017-07-12 18:08:49 +00:00
plex = PlexServer ( baseurl , token )
2018-02-14 14:33:52 +00:00
LIBRARIES_LST = [ ' Movies ' , ' TV Shows ' ]
2017-07-12 18:08:49 +00:00
def sylco ( word ) :
# pulled from https://github.com/eaydin/sylco/blob/master/sylco.py
word = word . lower ( )
# exception_add are words that need extra syllables
# exception_del are words that need less syllables
exception_add = [ ' serious ' , ' crucial ' ]
exception_del = [ ' fortunately ' , ' unfortunately ' ]
co_one = [ ' cool ' , ' coach ' , ' coat ' , ' coal ' , ' count ' , ' coin ' , ' coarse ' , ' coup ' , ' coif ' , ' cook ' , ' coign ' , ' coiffe ' ,
' coof ' , ' court ' ]
co_two = [ ' coapt ' , ' coed ' , ' coinci ' ]
pre_one = [ ' preach ' ]
syls = 0 # added syllable number
disc = 0 # discarded syllable number
# 1) if letters < 3 : return 1
if len ( word ) < = 3 :
syls = 1
return syls
# 2) if doesn't end with "ted" or "tes" or "ses" or "ied" or "ies", discard "es" and "ed" at the end.
# if it has only 1 vowel or 1 set of consecutive vowels, discard. (like "speed", "fled" etc.)
if word [ - 2 : ] == " es " or word [ - 2 : ] == " ed " :
doubleAndtripple_1 = len ( re . findall ( r ' [eaoui][eaoui] ' , word ) )
if doubleAndtripple_1 > 1 or len ( re . findall ( r ' [eaoui][^eaoui] ' , word ) ) > 1 :
if word [ - 3 : ] == " ted " or word [ - 3 : ] == " tes " or word [ - 3 : ] == " ses " or word [ - 3 : ] == " ied " or word [
- 3 : ] == " ies " :
pass
else :
disc + = 1
# 3) discard trailing "e", except where ending is "le"
le_except = [ ' whole ' , ' mobile ' , ' pole ' , ' male ' , ' female ' , ' hale ' , ' pale ' , ' tale ' , ' sale ' , ' aisle ' , ' whale ' , ' while ' ]
if word [ - 1 : ] == " e " :
if word [ - 2 : ] == " le " and word not in le_except :
pass
else :
disc + = 1
# 4) check if consecutive vowels exists, triplets or pairs, count them as one.
doubleAndtripple = len ( re . findall ( r ' [eaoui][eaoui] ' , word ) )
tripple = len ( re . findall ( r ' [eaoui][eaoui][eaoui] ' , word ) )
disc + = doubleAndtripple + tripple
# 5) count remaining vowels in word.
numVowels = len ( re . findall ( r ' [eaoui] ' , word ) )
# 6) add one if starts with "mc"
if word [ : 2 ] == " mc " :
syls + = 1
# 7) add one if ends with "y" but is not surrouned by vowel
if word [ - 1 : ] == " y " and word [ - 2 ] not in " aeoui " :
syls + = 1
# 8) add one if "y" is surrounded by non-vowels and is not in the last word.
for i , j in enumerate ( word ) :
if j == " y " :
if ( i != 0 ) and ( i != len ( word ) - 1 ) :
if word [ i - 1 ] not in " aeoui " and word [ i + 1 ] not in " aeoui " :
syls + = 1
# 9) if starts with "tri-" or "bi-" and is followed by a vowel, add one.
if word [ : 3 ] == " tri " and word [ 3 ] in " aeoui " :
syls + = 1
if word [ : 2 ] == " bi " and word [ 2 ] in " aeoui " :
syls + = 1
# 10) if ends with "-ian", should be counted as two syllables, except for "-tian" and "-cian"
if word [ - 3 : ] == " ian " :
# and (word[-4:] != "cian" or word[-4:] != "tian") :
if word [ - 4 : ] == " cian " or word [ - 4 : ] == " tian " :
pass
else :
syls + = 1
# 11) if starts with "co-" and is followed by a vowel, check if exists in the double syllable dictionary, if not, check if in single dictionary and act accordingly.
if word [ : 2 ] == " co " and word [ 2 ] in ' eaoui ' :
if word [ : 4 ] in co_two or word [ : 5 ] in co_two or word [ : 6 ] in co_two :
syls + = 1
elif word [ : 4 ] in co_one or word [ : 5 ] in co_one or word [ : 6 ] in co_one :
pass
else :
syls + = 1
# 12) if starts with "pre-" and is followed by a vowel, check if exists in the double syllable dictionary, if not, check if in single dictionary and act accordingly.
if word [ : 3 ] == " pre " and word [ 3 ] in ' eaoui ' :
if word [ : 6 ] in pre_one :
pass
else :
syls + = 1
# 13) check for "-n't" and cross match with dictionary to add syllable.
negative = [ " doesn ' t " , " isn ' t " , " shouldn ' t " , " couldn ' t " , " wouldn ' t " ]
if word [ - 3 : ] == " n ' t " :
if word in negative :
syls + = 1
else :
pass
# 14) Handling the exceptional words.
if word in exception_del :
disc + = 1
if word in exception_add :
syls + = 1
# calculate the output
return numVowels - disc + syls
2018-02-14 14:33:52 +00:00
def check_roman ( word ) :
roman_pattern = r " ^M { 0,3}(CM|CD|D?C { 0,3})(XC|XL|L?X { 0,3})(IX|IV|V?I { 0,3})$ "
if ( re . search ( roman_pattern , word . strip ( ) , re . I ) ) :
# print(word)
return True
else :
# print(word)
return False
def ran_words ( sections_lst ) :
word_site = [ line . split ( ) for line in sections_lst ]
WORDS = [ item for sublist in word_site for item in sublist ]
ran_word = random . choice ( WORDS )
ran_word = ' ' . join ( e for e in ran_word if e . isalpha ( ) and not check_roman ( ran_word ) )
sy_cnt = sylco ( ran_word )
word_cnt = { ran_word : sy_cnt }
return word_cnt
def hi_build ( sections_lst , cnt ) :
dd = ran_words ( sections_lst )
2017-07-12 18:08:49 +00:00
while sum ( dd . values ( ) ) < cnt :
try :
2018-02-14 14:33:52 +00:00
up = ran_words ( sections_lst )
2017-07-12 18:08:49 +00:00
dd . update ( up )
if sum ( dd . values ( ) ) == cnt :
return [ dd ]
else :
if sum ( dd . values ( ) ) > cnt :
dd = { }
except Exception :
pass
return [ dd ]
2018-02-14 14:33:52 +00:00
sections_lst = [ ]
for x in LIBRARIES_LST :
sections = plex . library . section ( x ) . all ( )
sections_lst + = [ section . title for section in sections ]
m_lst = hi_build ( sections_lst , 5 ) + hi_build ( sections_lst , 7 ) + hi_build ( sections_lst , 5 )
# to see word and syllable count uncomment below print.
#print(m_lst)
2017-07-12 18:08:49 +00:00
stanz1 = ' ' . join ( m_lst [ 0 ] . keys ( ) )
stanz2 = ' ' . join ( m_lst [ 1 ] . keys ( ) )
stanz3 = ' ' . join ( m_lst [ 2 ] . keys ( ) )
lines = stanz1 , stanz2 , stanz3
lines = ' \n ' . join ( lines )
print ( ' ' )
print ( lines . lower ( ) )
print ( ' ' )