Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
c1a6d15
First commit on gen-api branch
fishkadealer229 Jul 19, 2025
7eddab9
Add functionallity with geniouse api
fenton512 Jul 19, 2025
45f9544
Genius fixing
fishkadealer229 Jul 19, 2025
140dc6f
Genius fixing{
fishkadealer229 Jul 19, 2025
3b49703
Delete api/anki_deck.db
fishkadealer229 Jul 19, 2025
e0f4714
Merged gen-api with master
Iliagap Jul 19, 2025
1e2c76a
First
fishkadealer229 Jul 19, 2025
3845db6
Database features
fishkadealer229 Jul 19, 2025
120f1fc
Database creation in code
fishkadealer229 Jul 19, 2025
55e7d57
Fixed problems with deletion database
fenton512 Jul 19, 2025
7ccbd50
Move database_preparation in the api rep
fenton512 Jul 19, 2025
3e9e939
Reset changes in the input.vue
fenton512 Jul 19, 2025
fb88b69
Update database generation
fishkadealer229 Jul 20, 2025
0b84e91
New endpoint
fishkadealer229 Jul 20, 2025
6eb5bdf
Test commit
fishkadealer229 Jul 20, 2025
edb5071
Test commit 2
fishkadealer229 Jul 20, 2025
980ef4a
Test commit 3
fishkadealer229 Jul 20, 2025
4333305
Test commit
fishkadealer229 Jul 20, 2025
758d1e9
Test commit 3.1
fishkadealer229 Jul 20, 2025
860d4e5
Test commit 3.1
fishkadealer229 Jul 20, 2025
c70ec8f
Test commit 3.2
fishkadealer229 Jul 20, 2025
696519e
Test commit 3.2
fishkadealer229 Jul 20, 2025
e15f11d
Test commit 3.3
fishkadealer229 Jul 20, 2025
1fd8d39
Test commit 3.1
fishkadealer229 Jul 20, 2025
e62f49f
Test commit 3.1
fishkadealer229 Jul 20, 2025
5349b41
Test commit 3.1
fishkadealer229 Jul 20, 2025
8e4570b
Delete api/anki_deck.db
fishkadealer229 Jul 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ jobs:
- name: Integration tests run
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
GENIUS_ACCESS_TOKEN: ${{ secrets.GENIUS_ACCESS_TOKEN }}
run: |
coverage run -m pytest api/integration_tests.py
coverage xml -o coverage.xml
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,5 @@ api/__pycache__/
*.pyc
*.tsbuildinfo
.env
.venv
.venv
api/anki_deck.db
101 changes: 76 additions & 25 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file removed api/anki_deck.db
Binary file not shown.
90 changes: 90 additions & 0 deletions api/database_preparation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
from sqlite3 import connect
import os


def prepare_db():
basedir = os.path.abspath(os.path.dirname(__file__))
data_file = os.path.join(basedir, 'anki_deck.db')

con = connect(data_file)
cur = con.cursor()

cur.execute("""CREATE TABLE user (
user_id INTEGER PRIMARY KEY
NOT NULL
UNIQUE,
login TEXT UNIQUE
NOT NULL,
encrypted_password TEXT NOT NULL
DEFAULT (38029384023840 - 2)
)""")
con.commit()

cur.execute("""CREATE TABLE words (
word_id INTEGER PRIMARY KEY
UNIQUE
NOT NULL,
word TEXT NOT NULL,
context_sentence TEXT,
user_id INTEGER REFERENCES user (user_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
NOT NULL
)""")
con.commit()

cur.execute("""CREATE TABLE cards (
card_id INTEGER PRIMARY KEY
UNIQUE
NOT NULL
REFERENCES words (word_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE,
word_id INTEGER REFERENCES words (word_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
NOT NULL,
sentences BLOB
)""")
con.commit()

cur.execute("""CREATE TABLE decks (
deck_id INTEGER PRIMARY KEY
UNIQUE
NOT NULL,
cards BLOB,
user_id INTEGER REFERENCES user (user_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
NOT NULL
)""")
con.commit()

cur.execute("""CREATE TABLE known_words (
word_id INTEGER NOT NULL
REFERENCES words (word_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
UNIQUE
)""")
con.commit()

cur.execute("""CREATE TABLE unknown_words (
word_id INTEGER REFERENCES words (word_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
NOT NULL
UNIQUE
)""")
con.commit()

cur.execute("""CREATE TABLE unwanted_words (
word_id INTEGER NOT NULL
UNIQUE
REFERENCES words (word_id) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE
)""")
con.commit()

con.close()
99 changes: 46 additions & 53 deletions api/fast_api.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import uvicorn
from fastapi import FastAPI, Query,Request, Response
from fastapi.responses import JSONResponse, PlainTextResponse
from sqlite3 import connect
from fastapi import FastAPI, Query, Response
from fastapi.responses import PlainTextResponse
from gpt import request_sentences, write_cards_to_csv, parse_response_to_dicts
import os
from starlette.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
from decryptors import *
from pydantic import BaseModel
from typing import List
from sqlite3 import connect
from genius import *
from Appearance import *
import json
from io import StringIO
import csv
import spacy
from models import *
from database_preparation import *

if os.path.exists('anki_deck.db'):
pass
else:
prepare_db()

app = FastAPI()
basedir = os.path.abspath(os.path.dirname(__file__))
Expand All @@ -29,6 +30,7 @@
allow_headers=["*"],
)

correct_rows = []

@app.get("/")
def root():
Expand Down Expand Up @@ -185,38 +187,28 @@ async def post_word(word: str, context_sentence: str, user_id: int, mode: str):
return {"status": 'ok'}


@app.get("/wordlist/get")
async def get_wordlist():
@app.get("/wordlist/get", response_model=WordListGet)
async def get_wordlist(payload: WordListGet):
con = connect(data_file)
cur = con.cursor()
ids = cur.execute("SELECT word_id FROM known_words").fetchall()
words = []
for word_id in ids:
word = cur.execute("SELECT word FROM words WHERE word_id = ?", (word_id[0],)).fetchall()
if word:
words.append(word[0])
words = payload.wordlist
ans = {}
for word in words:
word_id = cur.execute("SELECT word_id FROM words WHERE word = ?", (word,)).fetchone()
if word_id:
word_id = word_id[0]
known_id = cur.execute("SELECT word_id FROM known_words WHERE word_id = ?", (word_id,)).fetchone()
if known_id:
ans[word] = "known"

unknown_id = cur.execute("SELECT word_id FROM unknown_words WHERE word_id = ?", (word_id,)).fetchone()
if unknown_id:
ans[word] = "unknown"
else:
ans[word] = "none"
con.close()
return {"words": words}


def csv_generation(unknown_words, known_words, count, context_sentences):
words_to_generate = unknown_words.copy()
local_correct_rows = []

while words_to_generate:
response_text = request_sentences(words_to_generate, known_words, count, context_sentences)
rows = parse_response_to_dicts(response_text)
still_incorrect = []
for row in rows:
word = row["word"]
sentences = [row["sentence1"]]
if is_word_in_generated_sentences(word, sentences):
local_correct_rows.append(row)
else:
still_incorrect.append(word)
words_to_generate = still_incorrect
return ans

return local_correct_rows

@app.post("/wordlist/post", response_model=WordListRequest)
async def post_text(payload: WordListRequest):
Expand Down Expand Up @@ -246,18 +238,22 @@ async def post_text(payload: WordListRequest):
con.commit()
ids += 1
con.close()
global correct_rows
correct_rows = csv_generation(unknown_words, known_words, count, context_sentences)
words_to_generate = unknown_words.copy()
while words_to_generate:
response_text = request_sentences(words_to_generate, known_words, count, context_sentences)
rows = parse_response_to_dicts(response_text)
still_incorrect = []
for row in rows:
word = row["word"]
sentences = [row["sentence1"]]
if is_word_in_generated_sentences(word, sentences):
correct_rows.append(row)
else:
still_incorrect.append(word)
words_to_generate = still_incorrect
return write_cards_to_csv(correct_rows)


class RegenerationPatchRequest(BaseModel):
csv_text: str
marked_words: List[str]
known_words: List[str]
count: int
context_sentences: List[str]

@app.post("/regenerate_patch")
async def regenerate_patch(payload: RegenerationPatchRequest):
reader = csv.DictReader(StringIO(payload.csv_text), delimiter=";")
Expand Down Expand Up @@ -318,10 +314,7 @@ async def generate_cards_apkg():
headers={"Content-Disposition": "attachment; filename=cards.apkg"}
)

#@app.post("/fetch-music/post", response_model=GeniusRequest)
#async def fetch_music(payload: GeniusRequest):
# artist, song = payload.artist_song.split(' - ')
# return JSONResponse({"lyrics": get_genius_text(artist, song)})

#if __name__ == "__main__":
# uvicorn.run(app, host="127.0.0.1", port=8000)
@app.post("/fetch-music/post", response_model=GeniusRequest)
async def fetch_music(payload: GeniusRequest):
artist, song = payload.query.split(' - ')
return PlainTextResponse(get_genius_text(artist, song))
Loading
Loading