You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
9.9 KiB
Python

from flask import Flask, request, session, redirect, url_for, render_template, flash, jsonify, send_from_directory
from . models import Posts, db
from flask_cors import CORS, cross_origin
from app.forms import UploadForm
from app import app
from sqlalchemy.sql.expression import func, select
from sqlalchemy.sql import except_
import re,string
import os
from werkzeug.utils import secure_filename
import json
from bs4 import BeautifulSoup
import subprocess
from subprocess import Popen, PIPE
from subprocess import check_output
basedir = os.path.abspath(os.path.dirname(__file__))
UPLOAD_FOLDER = os.path.join(basedir, 'img')
ALLOWED_EXTENSIONS = set([ 'png', 'jpg', 'jpeg', 'gif'])
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
def cleanhtml(raw_html):
cleanr = re.compile('<.*?>')
cleantext = re.sub(cleanr, '', raw_html)
return cleantext
@app.route('/')
@cross_origin(origin='*')
def index():
posts = db.session.query(Posts).all()
return render_template('index.html', posts=posts)
@app.route('/overview')
@cross_origin(origin='*')
def overview():
posts = db.session.query(Posts).all()
return render_template('home.html', posts=posts)
@app.route('/index')
def all():
posts = db.session.query(Posts).all()
return render_template('all.html', posts=posts)
@app.route('/<int:pid>')
@cross_origin(origin='*')
def post(pid):
post = Posts.query.filter_by(pid=pid).first()
return render_template('singlepost.html', post=post)
@app.route('/min/<int:pid>')
@cross_origin(origin='*')
def post_min(pid):
post = Posts.query.filter_by(pid=pid).first()
return render_template('singlepost_minimal.html', post=post)
@app.route('/<int:pid>/edit', methods=['GET', 'POST'])
@cross_origin(origin='*')
def edit_post(pid):
post = Posts.query.filter_by(pid=pid).first()
user_form = UploadForm(title = post.title, writingfield=post.writingfield, category=post.category)
if request.method == 'POST':
if user_form.validate_on_submit():
# on submit, check fields
post.title = user_form.title.data
post.writingfield = user_form.writingfield.data
post.category = user_form.category.data
db.session.commit()
return redirect(url_for('post', pid=pid))
return render_template('writer.html', form=user_form, post=post)
@app.route('/<int:pid>/delete', methods=['GET', 'POST'])
@cross_origin(origin='*')
def delete_post(pid):
post = Posts.query.filter_by(pid=pid).first()
db.session.delete(post)
db.session.commit()
return redirect(url_for('index'))
@app.route('/writer', methods=['GET', 'POST'])
@cross_origin(origin='*')
def writer():
post = Posts("unknown", "", "")
user_form = UploadForm()
if request.method == 'POST':
if user_form.validate_on_submit():
# on submit, check fields
title = user_form.title.data
writingfield = user_form.writingfield.data
category = user_form.category.data
post = Posts(title, writingfield, category)
db.session.add(post)
db.session.commit()
return redirect(url_for('post', pid=post.pid))
return render_template('writer.html',form=user_form, post=post )
@app.route('/uploadajax', methods=['POST'])
def uploadfile():
if request.method == 'POST':
files = request.files['file']
if files and allowed_file(files.filename):
filename = secure_filename(files.filename)
app.logger.info('FileName: ' + filename)
updir = os.path.join(basedir, 'img/')
files.save(os.path.join(updir, filename))
file_size = os.path.getsize(os.path.join(updir, filename))
return jsonify(name=filename, size=file_size)
@app.route('/turninbinary', methods=['POST', 'GET'])
def truninbinary():
if request.method == 'POST':
files = request.files['file']
filename = secure_filename(files.filename)
app.logger.info('FileName: ' + filename)
updir = os.path.join(basedir, 'binary/')
files.save(os.path.join(updir, filename))
p = subprocess.Popen(['cp', os.path.join(updir, filename), os.path.join(basedir, 'binary/input.raw')])
p_status = p.wait()
p = subprocess.Popen(['sox', '-r','22050', '-b','8', '-c','1', '-e','signed', os.path.join(basedir, 'binary/input.raw'),os.path.join(basedir, 'binary/audio.wav')])
p_status = p.wait()
p = subprocess.Popen(['ffmpeg','-y','-i',os.path.join(basedir, 'binary/audio.wav'),'-vn','-ar','44100','-ac','2','-f','mp3',os.path.join(basedir, 'binary/output.mp3')])
p_status = p.wait()
p = subprocess.Popen(['ffmpeg','-y','-f','rawvideo','-s','32x18','-i', os.path.join(basedir, 'binary/input.raw'), os.path.join(basedir, 'binary/video.mp4')])
p_status = p.wait()
p = subprocess.Popen(['ffmpeg','-y','-i', os.path.join(basedir, 'binary/video.mp4'),'-vf','scale=320:240', os.path.join(basedir, 'binary/output.mp4')])
p_status = p.wait()
p = subprocess.Popen(['ffmpeg','-y','-i',os.path.join(basedir, 'binary/output.mp4'),'-i',os.path.join(basedir, 'binary/output.mp3'),'-c','copy','-map','0:v:0','-map','1:a:0',os.path.join(basedir, 'binary/output_both.mp4')])
p_status = p.wait()
return send_from_directory(os.path.join(basedir, 'binary'), 'output_both.mp4')
#subprocess.call(['cp', os.path.join(basedir, 'binary/file'), 'input.raw'])
return render_template('turnfilein.html', )
@app.route('/img/<filename>')
def send_file(filename):
return send_from_directory(UPLOAD_FOLDER, filename)
@app.route('/database')
def send_database():
return send_from_directory(basedir, 'data.db')
###
# The API
###
@app.route('/api/beginwith=<query>', methods=['GET'])
def get_words(query):
posts = Posts.query.all()
data = []
for post in posts:
text = post.writingfield
#text = cleanhtml(text)
regex = re.compile('[%s]' % re.escape(string.punctuation))
#text = regex.sub('', text)
soup = BeautifulSoup(text)
for id, word in enumerate(soup.prettify().split()):
if "<" not in word or ">" not in word or "=" not in word:
word = regex.sub('', word)
query = regex.sub('', query)
if word.lower().startswith(query.lower()):
a = {}
a['word'] = word
a['intext'] = post.pid
a['intextname'] = post.title
a['wordnumber'] = id
try:
context = [
soup.prettify().split()[id-2],
soup.prettify().split()[id-1],
soup.prettify().split()[id],
soup.prettify().split()[id+1],
soup.prettify().split()[id+2]
]
except:
context = [
"no", "context"
]
a['context'] = ' '.join(context)
data.append(a)
text = post.title
#text = cleanhtml(text)
#regex = re.compile('[%s]' % re.escape(string.punctuation))
#text = regex.sub('', text)
soup = BeautifulSoup(text)
for id, word in enumerate(soup.prettify().split()):
if word.startswith(query) and ("<" not in word or ">" not in word or "=" not in word):
a = {}
a['word'] = word
a['intext'] = post.pid
a['intextname'] = post.title
a['wordnumber'] = id
context = [
soup.prettify().split()[id-2],
soup.prettify().split()[id-1],
soup.prettify().split()[id],
soup.prettify().split()[id+1],
soup.prettify().split()[id+2]
]
a['context'] = ' '.join(context)
data.append(a)
#print(errors)
return jsonify(data)
@app.route('/api/link=<int:link>+wordnum=<int:n>+document=<int:pid>', methods=['GET'])
def replace_with(link, n, pid):
post = Posts.query.filter_by(pid=pid).first()
frompost = Posts.query.filter_by(pid=link).first()
html = post.writingfield
soup = BeautifulSoup(html)
words = soup.prettify().split()
words[n] = words[n]+" <a class='linkTo' href='"+str(link)+"'>→ "+frompost.title+"</a>"
print(words)
post.writingfield = ' '.join(words)
db.session.commit()
return redirect(url_for('post', pid=pid))
@app.route('/api/getcontent', methods=['GET'])
def get_text():
posts = Posts.query.all()
data = {}
for post in posts:
content = post.writingfield
soup = BeautifulSoup(content)
removedLinks = []
removedImg = []
imgsub = []
for a in soup.find_all("a", {'class':'linkTo'}):
removedLinks.append(a.extract()['href'])
for span in soup.find_all("span", {'class':'references'}):
span.replace_with("&&ref"+span.get_text()+" &&endref ")
for span in soup.find_all("u"):
span.replace_with(" &&uline"+span.get_text()+" &&enduline ")
for img in soup.find_all("img"):
removedImg.append(img['src'])
for subtitle in soup.find_all("span", {'class':'imgsub'}):
imgsub.append(subtitle.extract().get_text())
content = str(soup)
soup = BeautifulSoup(content)
content = str(soup.get_text(separator='\n'))
content = re.sub(' +', ' ', content).strip()
#content=re.sub("\s\s+" , " ", content)
#content = str(soup)
images = []
for i,img in enumerate(removedImg):
if i < len(imgsub):
images.append({"url":img, "sub":imgsub[i]})
else:
images.append({"url":img, "sub":""})
data[post.pid] = {"title":post.title, "category":post.category, "content":content, "removedLinks":removedLinks, "images":images}
#print(errors)
return jsonify(data)
if __name__ == '__main__':
app.run()