Merge branch 'dev' of vincent/chainetv_web into master

This commit is contained in:
vincent 2019-05-08 18:13:05 +02:00 committed by Gitea
commit a3011d700f
18 changed files with 177 additions and 98 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
__* __pycache__
env env
venv venv
dist dist

View File

@ -1,2 +0,0 @@
# chainetv_web

0
backend/__init__.py Normal file
View File

View File

34
backend/chainetv/api.py Normal file
View File

@ -0,0 +1,34 @@
from flask import Blueprint, jsonify, request,make_response,redirect,url_for,render_template
from chainetv.Jsonfile import JSONfile
from chainetv import emission
data= JSONfile("chaine.json")
api = Blueprint("api", __name__)
@api.route('/ping', methods=['GET'])
def ping_pong():
return jsonify('pong!')
@api.route('/chaine/<num>', methods=['GET'])
def get_chaine(num):
chaine=data.get_chaine(num)
if (chaine == "numero de chaine inconnue"):
return make_response("",204)
else:
return jsonify(chaine)
@api.route('/chaine/', methods=['put'])
def update_list():
status=data.parsechaine()
if(status=='ok'):
return jsonify("OK")
else:
return make_response('Error during Chaine Update',500)
@api.route('/chaine/<num>/emission', methods=['GET'])
def get_emmission(num):
chaine=data.get_chaine(num)
if (chaine == "numero de chaine inconnue"):
return make_response("",204)
else:
return jsonify(emission.parse_emmission(chaine))

21
backend/chainetv/app.py Normal file
View File

@ -0,0 +1,21 @@
from flask import Flask,render_template
from flask_cors import CORS
#from ReverseProxied import ReverseProxied
def create_app(app_name=__name__):
app=Flask(__name__, static_folder= "../dist/static",template_folder="../dist")
app.config.from_object('chainetv.config.BaseConfig')
#app.wsgi_app = ReverseProxied(app.wsgi_app)
CORS(app)
from chainetv.api import api
app.register_blueprint(api, url_prefix="/api/v1")
@app.route('/')
@app.route('/<path:path>')
def index(path="/"):
return render_template('index.html')
return app
##@app.errorhandler(404)
##def ma_page_404(error):
## return redirect("https://www.ducamps.win/404/404.html", 307)

View File

@ -0,0 +1,3 @@
class BaseConfig(object):
DEBUG = True
SECRET_KEY = 'mysecretkeyg'

View File

@ -24,14 +24,22 @@ def parse_emmission(strsearch):
html = response.read() html = response.read()
parse=BeautifulSoup(html,"html.parser") parse=BeautifulSoup(html,"html.parser")
divcasting=parse.select_one(".descriptif") divcasting=parse.select_one(".descriptif")
if (divcasting):
casting=divcasting.find_all(href=re.compile("biographie")) casting=divcasting.find_all(href=re.compile("biographie"))
count=0 count=0
for actor in casting: for actor in casting:
casting[count]=actor.text casting[count]=actor.text
count+=1 count+=1
else:
casting= None
divsynopsis=parse.select_one(".episode-synopsis") divsynopsis=parse.select_one(".episode-synopsis")
if (divsynopsis):
img=divsynopsis.find_next('img')['data-src'] img=divsynopsis.find_next('img')['data-src']
synopsis=divsynopsis.select_one(".d-b").text synopsis=divsynopsis.select_one(".d-b").text
else:
img=None
synopsis=""
return {'title':link['title'],'href':href,'casting':casting,'synopsis':remove_first_space(synopsis),'img':img} return {'title':link['title'],'href':href,'casting':casting,'synopsis':remove_first_space(synopsis),'img':img}

View File

@ -1,52 +1,5 @@
from flask import Flask,request,make_response,redirect,url_for,render_template,jsonify
from flask_cors import CORS
from Jsonfile import JSONfile
#from ReverseProxied import ReverseProxied
import emission
data= JSONfile("chaine.json")
app=Flask(__name__,static_folder = "./dist/static",template_folder="./dist")
#app.wsgi_app = ReverseProxied(app.wsgi_app)
CORS(app)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def index(path):
return render_template('index.html')
@app.route('/api/v1/ping', methods=['GET'])
def ping_pong():
return jsonify('pong!')
@app.route('/api/v1/chaine/<num>', methods=['GET'])
def get_chaine(num):
chaine=data.get_chaine(num)
if (chaine == "numero de chaine inconnue"):
return make_response("",204)
else:
return jsonify(chaine)
@app.route('/api/v1/chaine/', methods=['put'])
def update_list():
status=data.parsechaine()
if(status=='ok'):
return jsonify("OK")
else:
return make_response('Error during Chaine Update',500)
@app.route('/api/v1/chaine/<num>/emission', methods=['GET'])
def get_emmission(num):
chaine=data.get_chaine(num)
if (chaine == "numero de chaine inconnue"):
return make_response("",204)
else:
return jsonify(emission.parse_emmission(chaine))
##@app.errorhandler(404)
##def ma_page_404(error):
## return redirect("https://www.ducamps.win/404/404.html", 307)
from chainetv.app import create_app
app= create_app()
if __name__ == '__main__': if __name__ == '__main__':
app.run(debug=True) app.run()

View File

@ -11773,6 +11773,11 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true "dev": true
}, },
"vuex": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/vuex/-/vuex-3.1.0.tgz",
"integrity": "sha512-mdHeHT/7u4BncpUZMlxNaIdcN/HIt1GsGG5LKByArvYG/v6DvHcOxvDCts+7SRdCoIRGllK8IMZvQtQXLppDYg=="
},
"watchpack": { "watchpack": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz",

View File

@ -14,7 +14,8 @@
"axios": "^0.18.0", "axios": "^0.18.0",
"bulma": "^0.7.4", "bulma": "^0.7.4",
"vue": "^2.5.2", "vue": "^2.5.2",
"vue-router": "^3.0.1" "vue-router": "^3.0.1",
"vuex": "^3.1.0"
}, },
"devDependencies": { "devDependencies": {
"autoprefixer": "^7.1.2", "autoprefixer": "^7.1.2",

20
client/src/api/index.js Normal file
View File

@ -0,0 +1,20 @@
import axios from "axios";
const API_PATH=`${process.env.ROOT_API}/api/v1`;
export function fetchchaine(num){
return axios.get(`${API_PATH}/chaine/${num}`)
}
export function fetchemission(num){
return axios.get(`${API_PATH}/chaine/${num}/emission`)
}
export function putparsechaine(){
return axios.put(`${API_PATH}/chaine/`);
}

View File

@ -29,8 +29,8 @@
</div> </div>
<div class="section"> <div class="section">
<div class="container"> <div class="container">
<ul class v-if="arrayresultchaines"> <ul class v-if="this.$store.state.arrayresultchaines">
<li class="box" v-for="result in arrayresultchaines" v-bind:key="result.chaine"> <li class="box" v-for="result in this.$store.state.arrayresultchaines" v-bind:key="result.chaine">
<h3 class="title is-5">{{result.chaine}} : {{result.name}}</h3> <h3 class="title is-5">{{result.chaine}} : {{result.name}}</h3>
<ul v-if="(result.emission!='can\'t find channel' && result.emission)"> <ul v-if="(result.emission!='can\'t find channel' && result.emission)">
<li> <li>
@ -74,63 +74,34 @@
</template> </template>
<script> <script>
import axios from "axios"; import {putparsechaine} from "../api";
export default { export default {
name: "chainetv", name: "chainetv",
data() { data() {
return { return {
arrayresultchaines: [],
chaine: "" chaine: ""
}; };
}, },
methods: { methods: {
getchaine(num) {
let path = process.env.ROOT_API + "/api/v1/chaine/";
axios
.get(path + num)
.then(res => {
if (res.status === 200) {
axios
.get(path + num + "/emission")
.then(res_emission => {
this.arrayresultchaines.push({
chaine: num,
name: res.data,
emission: res_emission.data
});
console.log(this.arrayresultchaines);
})
.catch(error => {
this.arrayresultchaines.push({ chaine: num, name: res.data });
});
} else if (res.status === 204) {
this.arrayresultchaines.push({ chaine: num, name: "inconnue" });
}
})
.catch(error => {
// eslint-disable-next-line
console.error(error);
});
},
checkchaine() { checkchaine() {
if (this.chaine === "") { if (this.chaine === "") {
alert("rentrer un numéro"); alert("rentrer un numéro");
return; return;
} }
this.arrayresultchaines = []; this.$store.state.arrayresultchaines = [];
const arraychaine = [...new Set(this.chaine.split(" "))]; const arraychaine = [...new Set(this.chaine.split(" "))];
arraychaine.forEach(element => { arraychaine.forEach(element => {
if (element != "") { if (element != "") {
this.getchaine(element); this.$store.dispatch('getchaine',{num:element});
} }
}); });
}, },
parsechaine() { parsechaine() {
const path = process.env.ROOT_API + "/api/v1/chaine/";
axios return putparsechaine()
.put(path)
.then(res => { .then(res => {
if (res.data == "OK") { if (res.data == "OK") {
alert("update database OK"); alert("update database OK");

View File

@ -3,6 +3,7 @@
import Vue from 'vue'; import Vue from 'vue';
import App from './App'; import App from './App';
import router from './router'; import router from './router';
import store from './store'
import './../node_modules/bulma/css/bulma.css' import './../node_modules/bulma/css/bulma.css'
Vue.config.productionTip = false; Vue.config.productionTip = false;
@ -10,6 +11,7 @@ Vue.config.productionTip = false;
new Vue({ new Vue({
el: '#app', el: '#app',
router, router,
store,
components: { App }, components: { App },
template: '<App/>', template: '<App/>',
}); });

63
client/src/store/index.js Normal file
View File

@ -0,0 +1,63 @@
// src/store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
import { fetchchaine, fetchemission } from '../api';
Vue.use(Vuex)
const state = {
// single source of data
arrayresultchaines: [],
}
const API_PATH=`${process.env.ROOT_API}/api/v1`;
const actions = {
// asynchronous operations
getchaine(context,{num}) {
return fetchchaine(num)
.then( res => {
if (res.status === 200){
context.dispatch('getemission',{chaine:num,name:res.data})
}else{
context.commit('push_chaine',{chaine:num,name:res.data})
}
})
.catch(error => {
// eslint-disable-next-line
console.error(error);
});
},
getemission(context,{chaine,name}){
return fetchemission (chaine)
.then(res_emission => {
context.commit('push_chaine',{chaine:chaine,name:name,emission:res_emission.data})
})
.catch(error => {
console.error(error);
});
},
}
const mutations = {
// isolated data mutations
push_chaine(state,payload){
if(!payload.name){
state.arrayresultchaines.push({ chaine: payload.chaine, name: "inconnue" });
}else{
state.arrayresultchaines.push({chaine: payload.chaine,name: payload.name,emission: payload.emission});
}
}
}
const getters = {
// reusable data accessors
}
const store = new Vuex.Store({
state,
actions,
mutations,
getters
})
export default store