diff --git a/.gitignore b/.gitignore index 6e87d84..0ee461e 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,10 @@ backend/db/id2igid.db test testfiles +test.py + +# for sljh +utils/sljh +PictureMaker/sljh.py +interface/sljh.py +frontend/sljh \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 11e55a1..de7d008 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,7 +4,15 @@ WORKDIR /app # apt install RUN apt-get update && \ - DEBAIN_FRONTEND=noninteractive apt-get install -qy ffmpeg libpq-dev libmagic1 libmagic-dev + DEBAIN_FRONTEND=noninteractive apt-get install -qy ffmpeg libpq-dev libmagic1 libmagic-dev locales + +# locale +COPY ./env/locale.gen /env/locale.gen +RUN locale-gen +COPY ./env/locale.conf /env/locale.conf + +# timezone +COPY ./env/timezone /etc/timezone # pip3 install COPY ./requirements.txt /app/requirements.txt @@ -13,4 +21,8 @@ COPY ./ffmpeg_python-0.2.0-py3-none-any.whl /app/ffmpeg_python-0.2.0-py3-none-an RUN pip3 install ffmpeg_python-0.2.0-py3-none-any.whl RUN pip3 install -r /app/requirements.txt +# install playwright +RUN playwright install-deps +RUN playwright install + EXPOSE 50051 \ No newline at end of file diff --git a/PictureMaker/default.py b/PictureMaker/default.py new file mode 100644 index 0000000..4fbc6da --- /dev/null +++ b/PictureMaker/default.py @@ -0,0 +1,126 @@ +import datetime +import os +import hashlib +import time + +from playwright.sync_api import sync_playwright +from jinja2 import Template + +from config.config import TMP + +# configuration +TIMEZONE = 8 +IMAGE_WIDTH = 1280 +IMAGE_HEIGHT = 1280 + +def render(text, filename, width=IMAGE_WIDTH, height=IMAGE_HEIGHT, font_size=60, text_color="black", margin=50) -> int: + err = 0 + + browser = None + page = None + context = None + try: + with sync_playwright() as p: + browser = p.chromium.launch(headless=True) + context = browser.new_context() + page = context.new_page() + + # template + template = Template("{{ text }}") + processed_text = template.render(text=text) + html_content = f""" + + + + + +
{processed_text}
+ + +""" + page.set_content(html_content) + + # set window size + page.set_viewport_size({"width": width, "height": height}) + + # screenshot + page.screenshot(path=filename) + except Exception as e: + # exception + print(e) + err = 1 + finally: + if page: + try: page.close() + except: pass + if context: + try: context.close() + except: pass + if browser: + try: browser.close() + except: pass + + return err + + +def gen(context:dict) -> str | None: + """ + Generate a image that has the content of the post in it. + + Args: + context (dict): data of a post + + Returns: + str: filename of the generated image. + None: An error occurred, and nothing was returned. + """ + + # data preparation + content = context["content"]["text"] + + # generate image + filename = TMP + hashlib.sha512( str(time.time()).encode() ).hexdigest() + ".jpg" + filename = os.path.abspath(filename) + err = render(content, filename, width=IMAGE_WIDTH, height=IMAGE_HEIGHT) + if err: + return None + + return filename + + +def gen_caption(context:dict) -> str: + """ + Generate caption of the IG post. + + Args: + context (dict): data of a post + + Returns: + str: caption. + """ + + caption = f"""[TCIVS Niming #{context["id"]}] +{context["content"]["text"]} +""" + + return caption \ No newline at end of file diff --git a/PictureMaker/testing.py b/PictureMaker/old.py similarity index 96% rename from PictureMaker/testing.py rename to PictureMaker/old.py index d4e1eb4..814d112 100644 --- a/PictureMaker/testing.py +++ b/PictureMaker/old.py @@ -41,5 +41,5 @@ def gen(context:dict) -> str | None: # 文案生成 -def gentext(context:dict) -> str: +def gen_caption(context:dict) -> str: return context["content"]["text"] \ No newline at end of file diff --git a/TODO b/TODO index f764e35..d1579f9 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,7 @@ [ ] 改善Traceback的收集 +[ ] GIF Support +[ ] api: ID查IGID,IGID反查ID +[ ] api: 返回錯誤處理紀錄 [V] 本地儲存ID對IGID表 [ ] 測試 \ No newline at end of file diff --git a/app.py b/app.py index 87bcb8e..c226361 100644 --- a/app.py +++ b/app.py @@ -2,6 +2,7 @@ import importlib.util import logging import threading import os +import time from backend import backend from backend.ig import IG @@ -75,6 +76,11 @@ def main(): # end loaderlog.info("Loaded") + + # infinity waiting - prevent main thread from exiting + while True: + time.sleep(60) + if __name__ == "__main__": main() \ No newline at end of file diff --git a/backend/ig/IG.py b/backend/ig/IG.py index fb798be..d600e1d 100644 --- a/backend/ig/IG.py +++ b/backend/ig/IG.py @@ -86,10 +86,10 @@ def upload_media(context:str, paths:List[str]) -> dict | None: if len(paths) == 0: return None elif len(paths) == 1: - content = ld_picturemaker.picture_maker.gentext(context) + content = ld_picturemaker.picture_maker.gen_caption(context) media = cl.photo_upload(path=paths[0], caption=content).dict() else: - content = ld_picturemaker.picture_maker.gentext(context) + content = ld_picturemaker.picture_maker.gen_caption(context) media = cl.album_upload(paths=paths, caption=content).dict() return media diff --git a/backend/processor.py b/backend/processor.py index 68df6d4..34bd3ad 100644 --- a/backend/processor.py +++ b/backend/processor.py @@ -26,38 +26,23 @@ def upload(aid:int) -> Tuple[str, int]: # multimedia -> tmp file tmp_path = [] for m in article["content"]["media"]: + _binary = m.read() # check mime type mime = magic.Magic(mime=True) - tp = mime.from_buffer(m.read()) + tp = mime.from_buffer(_binary) # save file - filename, err = fileProcessor.file_saver(tp, m.read()) + filename, err = fileProcessor.file_saver(tp, _binary) if err: clean(tmp_path) - return "Error while saving file", 1 + return "Error while saving file : %s"%filename, 1 tmp_path.append(filename) article["content"]["media"] = [] - - """ - # 抓取檔案 - files = [] - for k in article["files_hash"]: - f, code = s3helper.solo_file_fetcher(fnhash=k) - if code: - return "File not found", 1 - else: - files.append(f) - # 轉出暫存檔案 - tmp_path:list = [] - for t in files: - filename, err = fileProcessor.file_saver(t.get("mime"), t.get("binary")) - if err: # 如果錯誤 - return filename, 1 - tmp_path.append(filename) - """ - # 合成文字圖 proma_file = ld_picturemaker.picture_maker.gen(article) + if proma_file is None: + clean(tmp_path) + return "Error while generating proma_file", 1 tmp_path = [proma_file] + tmp_path # 送交 IG 上傳 diff --git a/docker-compose.yml b/docker-compose.yml index 0451255..9d7b8cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,7 +9,7 @@ services: volumes: - ".:/app" ports: - - "50051:50051" + - "50050:50050" # frontend.grpc restart: unless-stopped working_dir: /app command: python3 ./app.py \ No newline at end of file diff --git a/env/locale.conf b/env/locale.conf new file mode 100644 index 0000000..dd6eee3 --- /dev/null +++ b/env/locale.conf @@ -0,0 +1 @@ +LANG="en_US.UTF-8" diff --git a/env/locale.gen b/env/locale.gen new file mode 100644 index 0000000..58684de --- /dev/null +++ b/env/locale.gen @@ -0,0 +1,515 @@ +# This file lists locales that you wish to have built. You can find a list +# of valid supported locales at /usr/share/i18n/SUPPORTED, and you can add +# user defined locales to /usr/local/share/i18n/SUPPORTED. If you change +# this file, you need to rerun locale-gen. + + +C.UTF-8 UTF-8 +# aa_DJ ISO-8859-1 +# aa_DJ.UTF-8 UTF-8 +# aa_ER UTF-8 +# aa_ET UTF-8 +# af_ZA ISO-8859-1 +# af_ZA.UTF-8 UTF-8 +# agr_PE UTF-8 +# ak_GH UTF-8 +# am_ET UTF-8 +# an_ES ISO-8859-15 +# an_ES.UTF-8 UTF-8 +# anp_IN UTF-8 +# ar_AE ISO-8859-6 +# ar_AE.UTF-8 UTF-8 +# ar_BH ISO-8859-6 +# ar_BH.UTF-8 UTF-8 +# ar_DZ ISO-8859-6 +# ar_DZ.UTF-8 UTF-8 +# ar_EG ISO-8859-6 +# ar_EG.UTF-8 UTF-8 +# ar_IN UTF-8 +# ar_IQ ISO-8859-6 +# ar_IQ.UTF-8 UTF-8 +# ar_JO ISO-8859-6 +# ar_JO.UTF-8 UTF-8 +# ar_KW ISO-8859-6 +# ar_KW.UTF-8 UTF-8 +# ar_LB ISO-8859-6 +# ar_LB.UTF-8 UTF-8 +# ar_LY ISO-8859-6 +# ar_LY.UTF-8 UTF-8 +# ar_MA ISO-8859-6 +# ar_MA.UTF-8 UTF-8 +# ar_OM ISO-8859-6 +# ar_OM.UTF-8 UTF-8 +# ar_QA ISO-8859-6 +# ar_QA.UTF-8 UTF-8 +# ar_SA ISO-8859-6 +# ar_SA.UTF-8 UTF-8 +# ar_SD ISO-8859-6 +# ar_SD.UTF-8 UTF-8 +# ar_SS UTF-8 +# ar_SY ISO-8859-6 +# ar_SY.UTF-8 UTF-8 +# ar_TN ISO-8859-6 +# ar_TN.UTF-8 UTF-8 +# ar_YE ISO-8859-6 +# ar_YE.UTF-8 UTF-8 +# as_IN UTF-8 +# ast_ES ISO-8859-15 +# ast_ES.UTF-8 UTF-8 +# ayc_PE UTF-8 +# az_AZ UTF-8 +# az_IR UTF-8 +# be_BY CP1251 +# be_BY.UTF-8 UTF-8 +# be_BY@latin UTF-8 +# bem_ZM UTF-8 +# ber_DZ UTF-8 +# ber_MA UTF-8 +# bg_BG CP1251 +# bg_BG.UTF-8 UTF-8 +# bhb_IN.UTF-8 UTF-8 +# bho_IN UTF-8 +# bho_NP UTF-8 +# bi_VU UTF-8 +# bn_BD UTF-8 +# bn_IN UTF-8 +# bo_CN UTF-8 +# bo_IN UTF-8 +# br_FR ISO-8859-1 +# br_FR.UTF-8 UTF-8 +# br_FR@euro ISO-8859-15 +# brx_IN UTF-8 +# bs_BA ISO-8859-2 +# bs_BA.UTF-8 UTF-8 +# byn_ER UTF-8 +# ca_AD ISO-8859-15 +# ca_AD.UTF-8 UTF-8 +# ca_ES ISO-8859-1 +# ca_ES.UTF-8 UTF-8 +# ca_ES@euro ISO-8859-15 +# ca_ES@valencia UTF-8 +# ca_FR ISO-8859-15 +# ca_FR.UTF-8 UTF-8 +# ca_IT ISO-8859-15 +# ca_IT.UTF-8 UTF-8 +# ce_RU UTF-8 +# chr_US UTF-8 +# ckb_IQ UTF-8 +# cmn_TW UTF-8 +# crh_RU UTF-8 +# crh_UA UTF-8 +# cs_CZ ISO-8859-2 +# cs_CZ.UTF-8 UTF-8 +# csb_PL UTF-8 +# cv_RU UTF-8 +# cy_GB ISO-8859-14 +# cy_GB.UTF-8 UTF-8 +# da_DK ISO-8859-1 +# da_DK.UTF-8 UTF-8 +# de_AT ISO-8859-1 +# de_AT.UTF-8 UTF-8 +# de_AT@euro ISO-8859-15 +# de_BE ISO-8859-1 +# de_BE.UTF-8 UTF-8 +# de_BE@euro ISO-8859-15 +# de_CH ISO-8859-1 +# de_CH.UTF-8 UTF-8 +# de_DE ISO-8859-1 +# de_DE.UTF-8 UTF-8 +# de_DE@euro ISO-8859-15 +# de_IT ISO-8859-1 +# de_IT.UTF-8 UTF-8 +# de_LI.UTF-8 UTF-8 +# de_LU ISO-8859-1 +# de_LU.UTF-8 UTF-8 +# de_LU@euro ISO-8859-15 +# doi_IN UTF-8 +# dsb_DE UTF-8 +# dv_MV UTF-8 +# dz_BT UTF-8 +# el_CY ISO-8859-7 +# el_CY.UTF-8 UTF-8 +# el_GR ISO-8859-7 +# el_GR.UTF-8 UTF-8 +# el_GR@euro ISO-8859-7 +# en_AG UTF-8 +# en_AU ISO-8859-1 +# en_AU.UTF-8 UTF-8 +# en_BW ISO-8859-1 +# en_BW.UTF-8 UTF-8 +# en_CA ISO-8859-1 +# en_CA.UTF-8 UTF-8 +# en_DK ISO-8859-1 +# en_DK.ISO-8859-15 ISO-8859-15 +# en_DK.UTF-8 UTF-8 +# en_GB ISO-8859-1 +# en_GB.ISO-8859-15 ISO-8859-15 +# en_GB.UTF-8 UTF-8 +# en_HK ISO-8859-1 +# en_HK.UTF-8 UTF-8 +# en_IE ISO-8859-1 +# en_IE.UTF-8 UTF-8 +# en_IE@euro ISO-8859-15 +# en_IL UTF-8 +# en_IN UTF-8 +# en_NG UTF-8 +# en_NZ ISO-8859-1 +# en_NZ.UTF-8 UTF-8 +# en_PH ISO-8859-1 +# en_PH.UTF-8 UTF-8 +# en_SC.UTF-8 UTF-8 +# en_SG ISO-8859-1 +# en_SG.UTF-8 UTF-8 +# en_US ISO-8859-1 +# en_US.ISO-8859-15 ISO-8859-15 +en_US.UTF-8 UTF-8 +# en_ZA ISO-8859-1 +# en_ZA.UTF-8 UTF-8 +# en_ZM UTF-8 +# en_ZW ISO-8859-1 +# en_ZW.UTF-8 UTF-8 +# eo UTF-8 +# eo_US.UTF-8 UTF-8 +# es_AR ISO-8859-1 +# es_AR.UTF-8 UTF-8 +# es_BO ISO-8859-1 +# es_BO.UTF-8 UTF-8 +# es_CL ISO-8859-1 +# es_CL.UTF-8 UTF-8 +# es_CO ISO-8859-1 +# es_CO.UTF-8 UTF-8 +# es_CR ISO-8859-1 +# es_CR.UTF-8 UTF-8 +# es_CU UTF-8 +# es_DO ISO-8859-1 +# es_DO.UTF-8 UTF-8 +# es_EC ISO-8859-1 +# es_EC.UTF-8 UTF-8 +# es_ES ISO-8859-1 +# es_ES.UTF-8 UTF-8 +# es_ES@euro ISO-8859-15 +# es_GT ISO-8859-1 +# es_GT.UTF-8 UTF-8 +# es_HN ISO-8859-1 +# es_HN.UTF-8 UTF-8 +# es_MX ISO-8859-1 +# es_MX.UTF-8 UTF-8 +# es_NI ISO-8859-1 +# es_NI.UTF-8 UTF-8 +# es_PA ISO-8859-1 +# es_PA.UTF-8 UTF-8 +# es_PE ISO-8859-1 +# es_PE.UTF-8 UTF-8 +# es_PR ISO-8859-1 +# es_PR.UTF-8 UTF-8 +# es_PY ISO-8859-1 +# es_PY.UTF-8 UTF-8 +# es_SV ISO-8859-1 +# es_SV.UTF-8 UTF-8 +# es_US ISO-8859-1 +# es_US.UTF-8 UTF-8 +# es_UY ISO-8859-1 +# es_UY.UTF-8 UTF-8 +# es_VE ISO-8859-1 +# es_VE.UTF-8 UTF-8 +# et_EE ISO-8859-1 +# et_EE.ISO-8859-15 ISO-8859-15 +# et_EE.UTF-8 UTF-8 +# eu_ES ISO-8859-1 +# eu_ES.UTF-8 UTF-8 +# eu_ES@euro ISO-8859-15 +# eu_FR ISO-8859-1 +# eu_FR.UTF-8 UTF-8 +# eu_FR@euro ISO-8859-15 +# fa_IR UTF-8 +# ff_SN UTF-8 +# fi_FI ISO-8859-1 +# fi_FI.UTF-8 UTF-8 +# fi_FI@euro ISO-8859-15 +# fil_PH UTF-8 +# fo_FO ISO-8859-1 +# fo_FO.UTF-8 UTF-8 +# fr_BE ISO-8859-1 +# fr_BE.UTF-8 UTF-8 +# fr_BE@euro ISO-8859-15 +# fr_CA ISO-8859-1 +# fr_CA.UTF-8 UTF-8 +# fr_CH ISO-8859-1 +# fr_CH.UTF-8 UTF-8 +# fr_FR ISO-8859-1 +# fr_FR.UTF-8 UTF-8 +# fr_FR@euro ISO-8859-15 +# fr_LU ISO-8859-1 +# fr_LU.UTF-8 UTF-8 +# fr_LU@euro ISO-8859-15 +# fur_IT UTF-8 +# fy_DE UTF-8 +# fy_NL UTF-8 +# ga_IE ISO-8859-1 +# ga_IE.UTF-8 UTF-8 +# ga_IE@euro ISO-8859-15 +# gbm_IN UTF-8 +# gd_GB ISO-8859-15 +# gd_GB.UTF-8 UTF-8 +# gez_ER UTF-8 +# gez_ER@abegede UTF-8 +# gez_ET UTF-8 +# gez_ET@abegede UTF-8 +# gl_ES ISO-8859-1 +# gl_ES.UTF-8 UTF-8 +# gl_ES@euro ISO-8859-15 +# gu_IN UTF-8 +# gv_GB ISO-8859-1 +# gv_GB.UTF-8 UTF-8 +# ha_NG UTF-8 +# hak_TW UTF-8 +# he_IL ISO-8859-8 +# he_IL.UTF-8 UTF-8 +# hi_IN UTF-8 +# hif_FJ UTF-8 +# hne_IN UTF-8 +# hr_HR ISO-8859-2 +# hr_HR.UTF-8 UTF-8 +# hsb_DE ISO-8859-2 +# hsb_DE.UTF-8 UTF-8 +# ht_HT UTF-8 +# hu_HU ISO-8859-2 +# hu_HU.UTF-8 UTF-8 +# hy_AM UTF-8 +# hy_AM.ARMSCII-8 ARMSCII-8 +# ia_FR UTF-8 +# id_ID ISO-8859-1 +# id_ID.UTF-8 UTF-8 +# ig_NG UTF-8 +# ik_CA UTF-8 +# is_IS ISO-8859-1 +# is_IS.UTF-8 UTF-8 +# it_CH ISO-8859-1 +# it_CH.UTF-8 UTF-8 +# it_IT ISO-8859-1 +# it_IT.UTF-8 UTF-8 +# it_IT@euro ISO-8859-15 +# iu_CA UTF-8 +# ja_JP.EUC-JP EUC-JP +ja_JP.UTF-8 UTF-8 +# ka_GE GEORGIAN-PS +# ka_GE.UTF-8 UTF-8 +# kab_DZ UTF-8 +# kk_KZ PT154 +# kk_KZ.RK1048 RK1048 +# kk_KZ.UTF-8 UTF-8 +# kl_GL ISO-8859-1 +# kl_GL.UTF-8 UTF-8 +# km_KH UTF-8 +# kn_IN UTF-8 +# ko_KR.EUC-KR EUC-KR +ko_KR.UTF-8 UTF-8 +# kok_IN UTF-8 +# ks_IN UTF-8 +# ks_IN@devanagari UTF-8 +# ku_TR ISO-8859-9 +# ku_TR.UTF-8 UTF-8 +# kv_RU UTF-8 +# kw_GB ISO-8859-1 +# kw_GB.UTF-8 UTF-8 +# ky_KG UTF-8 +# lb_LU UTF-8 +# lg_UG ISO-8859-10 +# lg_UG.UTF-8 UTF-8 +# li_BE UTF-8 +# li_NL UTF-8 +# lij_IT UTF-8 +# ln_CD UTF-8 +# lo_LA UTF-8 +# lt_LT ISO-8859-13 +# lt_LT.UTF-8 UTF-8 +# lv_LV ISO-8859-13 +# lv_LV.UTF-8 UTF-8 +# lzh_TW UTF-8 +# mag_IN UTF-8 +# mai_IN UTF-8 +# mai_NP UTF-8 +# mfe_MU UTF-8 +# mg_MG ISO-8859-15 +# mg_MG.UTF-8 UTF-8 +# mhr_RU UTF-8 +# mi_NZ ISO-8859-13 +# mi_NZ.UTF-8 UTF-8 +# miq_NI UTF-8 +# mjw_IN UTF-8 +# mk_MK ISO-8859-5 +# mk_MK.UTF-8 UTF-8 +# ml_IN UTF-8 +# mn_MN UTF-8 +# mni_IN UTF-8 +# mnw_MM UTF-8 +# mr_IN UTF-8 +# ms_MY ISO-8859-1 +# ms_MY.UTF-8 UTF-8 +# mt_MT ISO-8859-3 +# mt_MT.UTF-8 UTF-8 +# my_MM UTF-8 +# nan_TW UTF-8 +# nan_TW@latin UTF-8 +# nb_NO ISO-8859-1 +# nb_NO.UTF-8 UTF-8 +# nds_DE UTF-8 +# nds_NL UTF-8 +# ne_NP UTF-8 +# nhn_MX UTF-8 +# niu_NU UTF-8 +# niu_NZ UTF-8 +# nl_AW UTF-8 +# nl_BE ISO-8859-1 +# nl_BE.UTF-8 UTF-8 +# nl_BE@euro ISO-8859-15 +# nl_NL ISO-8859-1 +# nl_NL.UTF-8 UTF-8 +# nl_NL@euro ISO-8859-15 +# nn_NO ISO-8859-1 +# nn_NO.UTF-8 UTF-8 +# nr_ZA UTF-8 +# nso_ZA UTF-8 +# oc_FR ISO-8859-1 +# oc_FR.UTF-8 UTF-8 +# om_ET UTF-8 +# om_KE ISO-8859-1 +# om_KE.UTF-8 UTF-8 +# or_IN UTF-8 +# os_RU UTF-8 +# pa_IN UTF-8 +# pa_PK UTF-8 +# pap_AW UTF-8 +# pap_CW UTF-8 +# pl_PL ISO-8859-2 +# pl_PL.UTF-8 UTF-8 +# ps_AF UTF-8 +# pt_BR ISO-8859-1 +# pt_BR.UTF-8 UTF-8 +# pt_PT ISO-8859-1 +# pt_PT.UTF-8 UTF-8 +# pt_PT@euro ISO-8859-15 +# quz_PE UTF-8 +# raj_IN UTF-8 +# rif_MA UTF-8 +# ro_RO ISO-8859-2 +# ro_RO.UTF-8 UTF-8 +# ru_RU ISO-8859-5 +# ru_RU.CP1251 CP1251 +# ru_RU.KOI8-R KOI8-R +ru_RU.UTF-8 UTF-8 +# ru_UA KOI8-U +# ru_UA.UTF-8 UTF-8 +# rw_RW UTF-8 +# sa_IN UTF-8 +# sah_RU UTF-8 +# sat_IN UTF-8 +# sc_IT UTF-8 +# sd_IN UTF-8 +# sd_IN@devanagari UTF-8 +# sd_PK UTF-8 +# se_NO UTF-8 +# sgs_LT UTF-8 +# shn_MM UTF-8 +# shs_CA UTF-8 +# si_LK UTF-8 +# sid_ET UTF-8 +# sk_SK ISO-8859-2 +# sk_SK.UTF-8 UTF-8 +# sl_SI ISO-8859-2 +# sl_SI.UTF-8 UTF-8 +# sm_WS UTF-8 +# so_DJ ISO-8859-1 +# so_DJ.UTF-8 UTF-8 +# so_ET UTF-8 +# so_KE ISO-8859-1 +# so_KE.UTF-8 UTF-8 +# so_SO ISO-8859-1 +# so_SO.UTF-8 UTF-8 +# sq_AL ISO-8859-1 +# sq_AL.UTF-8 UTF-8 +# sq_MK UTF-8 +# sr_ME UTF-8 +# sr_RS UTF-8 +# sr_RS@latin UTF-8 +# ss_ZA UTF-8 +# ssy_ER UTF-8 +# st_ZA ISO-8859-1 +# st_ZA.UTF-8 UTF-8 +# su_ID UTF-8 +# sv_FI ISO-8859-1 +# sv_FI.UTF-8 UTF-8 +# sv_FI@euro ISO-8859-15 +# sv_SE ISO-8859-1 +# sv_SE.ISO-8859-15 ISO-8859-15 +# sv_SE.UTF-8 UTF-8 +# sw_KE UTF-8 +# sw_TZ UTF-8 +# syr UTF-8 +# szl_PL UTF-8 +# ta_IN UTF-8 +# ta_LK UTF-8 +# tcy_IN.UTF-8 UTF-8 +# te_IN UTF-8 +# tg_TJ KOI8-T +# tg_TJ.UTF-8 UTF-8 +# th_TH TIS-620 +th_TH.UTF-8 UTF-8 +# the_NP UTF-8 +# ti_ER UTF-8 +# ti_ET UTF-8 +# tig_ER UTF-8 +# tk_TM UTF-8 +# tl_PH ISO-8859-1 +# tl_PH.UTF-8 UTF-8 +# tn_ZA UTF-8 +# to_TO UTF-8 +# tok UTF-8 +# tpi_PG UTF-8 +# tr_CY ISO-8859-9 +# tr_CY.UTF-8 UTF-8 +# tr_TR ISO-8859-9 +# tr_TR.UTF-8 UTF-8 +# ts_ZA UTF-8 +# tt_RU UTF-8 +# tt_RU@iqtelif UTF-8 +# ug_CN UTF-8 +# ug_CN@latin UTF-8 +# uk_UA KOI8-U +# uk_UA.UTF-8 UTF-8 +# unm_US UTF-8 +# ur_IN UTF-8 +# ur_PK UTF-8 +# uz_UZ ISO-8859-1 +# uz_UZ.UTF-8 UTF-8 +# uz_UZ@cyrillic UTF-8 +# ve_ZA UTF-8 +# vi_VN UTF-8 +# wa_BE ISO-8859-1 +# wa_BE.UTF-8 UTF-8 +# wa_BE@euro ISO-8859-15 +# wae_CH UTF-8 +# wal_ET UTF-8 +# wo_SN UTF-8 +# xh_ZA ISO-8859-1 +# xh_ZA.UTF-8 UTF-8 +# yi_US CP1255 +# yi_US.UTF-8 UTF-8 +# yo_NG UTF-8 +# yue_HK UTF-8 +# yuw_PG UTF-8 +# zgh_MA UTF-8 +# zh_CN GB2312 +# zh_CN.GB18030 GB18030 +# zh_CN.GBK GBK +zh_CN.UTF-8 UTF-8 +# zh_HK BIG5-HKSCS +# zh_HK.UTF-8 UTF-8 +# zh_SG GB2312 +# zh_SG.GBK GBK +# zh_SG.UTF-8 UTF-8 +# zh_TW BIG5 +# zh_TW.EUC-TW EUC-TW +zh_TW.UTF-8 UTF-8 +# zu_ZA ISO-8859-1 +# zu_ZA.UTF-8 UTF-8 diff --git a/env/timezone b/env/timezone new file mode 100644 index 0000000..5264d40 --- /dev/null +++ b/env/timezone @@ -0,0 +1 @@ +Asia/Taipei \ No newline at end of file diff --git a/frontend/grpc/server.py b/frontend/grpc/server.py index 4b2f54f..28f2702 100644 --- a/frontend/grpc/server.py +++ b/frontend/grpc/server.py @@ -7,6 +7,9 @@ from backend import api from frontend.grpc.protobuf import igapi_pb2_grpc, igapi_pb2 from frontend.grpc.protobuf.igapi_pb2 import Request, Reply +# configuration +PORT = 50050 + # logging grpclog = logging.getLogger("frontend.grpc") grpclog.setLevel(level=logging.INFO) @@ -77,9 +80,9 @@ async def serve() -> None: igapi_pb2_grpc.add_IGAPIServicer_to_server( IGAPI_Server(), server ) - server.add_insecure_port("[::]:50051") + server.add_insecure_port(f"[::]:{PORT}") await server.start() - grpclog.info("gRPC Server listening on 0.0.0.0:50051") + grpclog.info(f"gRPC Server listening on 0.0.0.0:{PORT}") await server.wait_for_termination() diff --git a/interface/tcivs.py b/interface/example.py similarity index 55% rename from interface/tcivs.py rename to interface/example.py index 5644423..2da3a1c 100644 --- a/interface/tcivs.py +++ b/interface/example.py @@ -1,50 +1,46 @@ -from hashlib import sha512 -import secrets -import time +import datetime import requests import io -from config.config import TMP +""" +Interface -# define -an_example_of_context = { - "id": int, - "metadata": { - "create_time": int, - "author": str, - "tags": list[str], - "category": str - }, - "content": { - "text": str, - "media": [ - io.BytesIO - ] - } -} +The bridge between web application(niming) and igapi. +An interface should have a get() function. +""" def get(index:int, media:bool=True) -> dict | None: + """ + Every interface should have this function. + Backend calls this function to get data of a post. + + Args: + index (int): ID of the post + media (bool): Send media or not + + Returns: + dict: Data of a post. Formatted as shown in Note 1 (an_example_of_context) + None: An error occurred, and nothing was returned. + """ + + # get data + ## fake server in localhost + ### where is the api of web application? res = requests.get("http://localhost:5000/article/%d?media_count=1"%index) if res.status_code != 200: return None rj = res.json() media = [] - bytesio = 0 + # get media if media: for m in rj["media"]: _m = requests.get(m) if _m.status_code == 200: - #if bytesio: # save in memory - media.append(io.BytesIO(_m.content)) - #else: # save in file - # filename = sha512( (str(time.time())+secrets.token_urlsafe(nbytes=16)).encode() ).hexdigest() - # filename = f"./{TMP}/{filename}" - # with open(filename, "wb") as f: - # f.write(_m.content) - # media.append(filename) + media.append(io.BytesIO(_m.content)) + # return result = { "id": rj["id"], "metadata": { @@ -60,3 +56,21 @@ def get(index:int, media:bool=True) -> dict | None: } return result + + +# Note 1 +an_example_of_context = { + "id": int, + "metadata": { + "create_time": int | datetime.datetime, + "author": str, + "tags": list[str], + "category": str + }, + "content": { + "text": str, + "media": [ + io.BytesIO + ] + } +} \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0eccc28..02332cc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,22 @@ +# backend moviepy==1.0.3 instagrapi sqlalchemy sqlalchemy_utils -protobuf==5.28.3 Pillow pillow-heif asyncio -grpcio cachetools -python-magic \ No newline at end of file +python-magic + +# frontend.grpc +grpcio +protobuf==5.28.3 + +# PictureMaker +playwright +jinja2 + +# other +#pymysql +#cryptography \ No newline at end of file