mirror of
				https://github.com/tiyn/beaker-blog.git
				synced 2025-10-31 10:51:16 +01:00 
			
		
		
		
	added tts functionality
This commit is contained in:
		
							
								
								
									
										18
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								Dockerfile
									
									
									
									
									
								
							| @@ -2,11 +2,9 @@ FROM python:3 | ||||
|  | ||||
| MAINTAINER tiyn tiyn@mail-mk.eu | ||||
|  | ||||
| COPY src /blog | ||||
|  | ||||
| WORKDIR /blog | ||||
|  | ||||
| RUN pip3 install -r requirements.txt | ||||
| ENV LANG en_US.UTF-8 | ||||
| ENV LANGUAGE en_US:en | ||||
| ENV LC_ALL en_US.UTF-8 | ||||
|  | ||||
| RUN apt-get update && \ | ||||
|     apt-get install -y locales && \ | ||||
| @@ -14,9 +12,13 @@ RUN apt-get update && \ | ||||
|     sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ | ||||
|     dpkg-reconfigure --frontend=noninteractive locales | ||||
|  | ||||
| ENV LANG en_US.UTF-8 | ||||
| ENV LANGUAGE en_US:en | ||||
| ENV LC_ALL en_US.UTF-8 | ||||
| RUN apt-get install -y espeak | ||||
|  | ||||
| COPY src /blog | ||||
|  | ||||
| WORKDIR /blog | ||||
|  | ||||
| RUN pip3 install -r requirements.txt | ||||
|  | ||||
| VOLUME /blog/templates/entry | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ via plain text files. | ||||
|   - [x] Links to standalone article | ||||
| - [x] Standalone article page | ||||
|   - [x] Links to scrolling blog page | ||||
|   - [x] TTS Functionality | ||||
| - [x] RSS feed | ||||
| - [x] Navigation | ||||
|   - [x] Header | ||||
|   | ||||
| @@ -137,4 +137,5 @@ def feed(): | ||||
|  | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|   con_gen.prepare_tts() | ||||
|   app.run(host="0.0.0.0") | ||||
|   | ||||
| @@ -1,3 +1,4 @@ | ||||
| import glob | ||||
| import locale | ||||
| import os | ||||
| import pathlib | ||||
| @@ -7,6 +8,7 @@ from os import path | ||||
|  | ||||
| import markdown | ||||
| from bs4 import BeautifulSoup | ||||
| from gtts import gTTS | ||||
|  | ||||
| import config | ||||
| import search | ||||
| @@ -144,6 +146,11 @@ def gen_stand_string(path_ex): | ||||
|     content_string += "<a href=\"" + "/index.html#" + \ | ||||
|         filename_no_end + "\">" + curr_date + "</a>" | ||||
|     content_string += "<br><br>\n" | ||||
|     if os.path.isfile("static/tmp/" + filename_no_end + ".mp3"): | ||||
|       content_string += "<audio controls>\n" | ||||
|       content_string += '<source src="/static/tmp/' + filename_no_end + '.mp3" type="audio/mp3">\n' | ||||
|       content_string += "</audio>\n" | ||||
|     content_string += "<br><br>\n" | ||||
|     if filename.endswith(".html"): | ||||
|       for line in text: | ||||
|         content_string += line | ||||
| @@ -270,3 +277,50 @@ def create_preview(path, is_markdown): | ||||
|     preview = "\n<p>" + first_p.text + "</p>\n" | ||||
|   preview += "...<br>" | ||||
|   return preview | ||||
|  | ||||
|  | ||||
| def get_text_only(filename): | ||||
|   """ | ||||
|   Convert a file to text only to use in tts | ||||
|  | ||||
|   Parameters: | ||||
|   path (string): path to the article | ||||
|  | ||||
|   Returns: | ||||
|   string: unformatted string containing the contents of the file | ||||
|   """ | ||||
|   # filename = os.path.join(ENTRY_DIR, path) | ||||
|   clean_text = "" | ||||
|   if path.exists(filename): | ||||
|     title = open(filename).readline().rstrip("\n") | ||||
|     text = open(filename).readlines()[1:] | ||||
|     filename_no_end = filename.split(".", 1)[0] | ||||
|     filename_no_end = filename_no_end.split("/")[-1] | ||||
|     content_string = "" | ||||
|     if filename.endswith(".html"): | ||||
|       for line in text: | ||||
|         content_string += line | ||||
|     if filename.endswith(".md"): | ||||
|       content_string += gen_md_content(filename, 1) | ||||
|     content_string = absolutize_html(content_string) | ||||
|     soup = BeautifulSoup(content_string, "html.parser") | ||||
|     tag_to_remove = soup.find("figure") | ||||
|     if tag_to_remove: | ||||
|       tag_to_remove.decompose() | ||||
|     clean_text = soup.get_text(separator=" ") | ||||
|     clean_text = title + "\n\n" + clean_text | ||||
|   return clean_text | ||||
|  | ||||
|  | ||||
| def prepare_tts(): | ||||
|   files = glob.glob('static/tmp/*') | ||||
|   for f in files: | ||||
|     os.remove(f) | ||||
|   files = glob.glob('templates/entry/*') | ||||
|   clean_text = "" | ||||
|   for f in files: | ||||
|     clean_text = get_text_only(f) | ||||
|     tts = gTTS(clean_text, lang=LANGUAGE.split("-")[0]) | ||||
|     _, tail = os.path.split(f) | ||||
|     new_filename = "static/tmp/" + os.path.splitext(tail)[0] + ".mp3" | ||||
|     tts.save(new_filename) | ||||
|   | ||||
| @@ -5,3 +5,4 @@ WTForms | ||||
| Flask_WTF | ||||
| Font-Awesome-Flask | ||||
| BeautifulSoup4 | ||||
| gTTS | ||||
|   | ||||
| @@ -269,6 +269,12 @@ form.search::after { | ||||
| .standalone img { | ||||
|   width: 50%; | ||||
| } | ||||
|  | ||||
| .entry img { | ||||
|   width: 50%; | ||||
| } | ||||
|  | ||||
| audio { | ||||
|     width: 50%; | ||||
|     height: 5vh; | ||||
| } | ||||
|   | ||||
							
								
								
									
										0
									
								
								src/static/tmp/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/static/tmp/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
		Reference in New Issue
	
	Block a user