From d811fc1b4ebdb54238ecab7c579a64e07bab6647 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 22 Jul 2026 12:41:11 +0300 Subject: [PATCH] FIXED: timeoutError with gif seach and sending --- chat.db | Bin 8192 -> 8192 bytes config/__pycache__/__init__.cpython-314.pyc | Bin 137 -> 144 bytes config/__pycache__/config.cpython-314.pyc | Bin 3429 -> 3436 bytes config/__pycache__/schema.cpython-314.pyc | Bin 3664 -> 3671 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 142 -> 149 bytes controllers/__pycache__/chat.cpython-314.pyc | Bin 7753 -> 7868 bytes controllers/__pycache__/tenor.cpython-314.pyc | Bin 9980 -> 8504 bytes controllers/tenor.py | 80 ++++++++++++------ models/__pycache__/__init__.cpython-314.pyc | Bin 137 -> 144 bytes models/__pycache__/base.cpython-314.pyc | Bin 2469 -> 2638 bytes models/__pycache__/db.cpython-314.pyc | Bin 6116 -> 6280 bytes 11 files changed, 52 insertions(+), 28 deletions(-) diff --git a/chat.db b/chat.db index a21c8846995b3ac1447dec228f10de89de7d59f7..aa8949b08085dd808835492957911aeab53847fd 100644 GIT binary patch delta 491 zcmXw#Pj8xF0LIbAY;9_Z$&w~(`e*kcgO_4h(xg?aQuVDU0&+3D&;f#oAPl^;cBk#M z#lwz0^}b&AP4*@BDaO|9NuE5(@ATw%cYb&N^`KJ1FszvOe~RDU0=$G(zq~5vsDK|~ z_|eni$KK9*Qh2d{cv$#U*|7M}UCa3}i9_#1YO2!aH~xBOtNe)J`rfbdg13Jj4yh!Aj@YlX=m zZASUhP&G58$kFvs^9-J%dot(iindY#^v3GdRBvcglc#)g7|?M#b?dczyQK9z&KIIn4gJ3Z|X^2pb#U!4gG#bsp~ dn@T5Z@Nb*^hF^k>kw1}vKM|r})#OC^`2eC06V?C# diff --git a/config/__pycache__/__init__.cpython-314.pyc b/config/__pycache__/__init__.cpython-314.pyc index ccec7059ad1df48ab0832f07e5dce75ec1a83714..31927a67906cbfe459ac7dc06704f6e54dfcbfc2 100644 GIT binary patch delta 60 zcmeBVoWRJd&Bx2d00ajc60*1^@)|4aI$Onr7N-^!$K+S#=M~4el_qCr=A}DlB$mV^ O=jWwmrpHW-(FFkV5)&E# delta 53 zcmbQh*vZJN&Bx2d00h3$30a&Id5vY%^fU5vQ}s*r-Aa?QGxO4&GZIVmlk@Y^GSl@Z HChGzKMQaYO diff --git a/config/__pycache__/config.cpython-314.pyc b/config/__pycache__/config.cpython-314.pyc index d96fadad21a0cf060d09906157872f3931ebd2b2..cad9f82e7aa16bcb6abe086409d5f7cd518a6d0e 100644 GIT binary patch delta 63 zcmaDV^+t+Un~#@^0SFE@BxGIO$jiv2tnF+S6Iz^FR2-9Em7iA}<5rrSotc;JoRL@( RlboNImYE*2S&PY<8vu3?6vO}k delta 56 zcmaDO^;C*in~#@^0SJ7h6S5X<k)~%MAd!`w)}> diff --git a/controllers/__pycache__/__init__.cpython-314.pyc b/controllers/__pycache__/__init__.cpython-314.pyc index 9ee4e273a2d95dbe307cca2812e22abd9968b6f4..a936839fc598d5d36bf97bece89e9226ea6e7976 100644 GIT binary patch delta 65 zcmeBUoXW_n&Bx2d00ajc60)Qx@)~OxIa|eq7N-^!$K+S#=M~4el_qCr=A}DlB$mV^ R=jW9a<>%ypWG5!-0svw66@>r* delta 58 zcmbQr*vH7L&Bx2d00h3$30YDTd5smd^)vEwQ}s*r-Aa?QGxO4&GZIVmlk@XRit=-E MQj3c9CuZmZ0G{9x82|tP diff --git a/controllers/__pycache__/chat.cpython-314.pyc b/controllers/__pycache__/chat.cpython-314.pyc index 5ad270fa9a3fd7957d9e8547d09585475b63a0c7..e026b8278b54de4fc3164c2fc904a8e5004666f5 100644 GIT binary patch delta 835 zcmYjP&rcIU6rS1bvZcUo3+;9bEhS(n4U~$ajq+P!V~i--)Dp3#R4Ap;cFAlT!5<+W zOpJO!UZNykJ$NzE^rFTKq9mG_XgFYc^A9i~@gH!eP<0O9`{sM^eQ#!GKM%eilDee^ z3!>}QgPFw}w%3w{>*^gp9lva(h!NLs>Ukp`Db6ls^6Bw~WFbDQ=L0QMgcl;#m~BQMgVWfOdDIF4n&QeTTT#C4!}(_s;c@zqYv z1{0DWH$qVYxv8hQT7l5A08ZK4;+yK%>|xV^zFed6nnP1!HJURfz$Mwmi<$~cvM(T3 z9Yb7^^RW5ih}dx$GdP0=cn`|pfD7KrMN3&sXXX<{lD!DM))6s)Nt8~2oYe{UtedKt z9HHB?X)akv5{*)Fj6oER+El?zX&YRyMer>E+YolcciV*hhtm9X;qk)e>aG&lQ~JIs zeJ`TmZhR)JCw3i^@UC%m;yi8KGC9uXEc1o@p>SEP&IX~&Fr36WrFtmz3>7TK}JDMZWWT*@$#>6AgH;FsMse}$@LK9|Xt z`3!x;IIC2dR-aB45`T-YGo5{2GR>fqLcnxzXJ%eD<&3mJ<|#E;RU2KzP6^Rj)(7jV ztKomcY-z)Bo5NEetKE1S257o6qGBwN7$jAPqhcpegU)|`EAUY5!K?5_{aKf;4j?P= z+~vb-@WmC8+lBCN9@T{QIm-6WmAuUohx5?u-t*sOhY=HrIej*fAlF#?RVHz|K~At; zfWaN;@pRxgOnOfG*O=g-K;NEq8|+setz4~a9?a=;#cXPr+=rJQsEuG8CJN2}0bkw2 A6#xJL delta 779 zcmYLH&rcIk5boQzyG3ZXEzqA(Ed{9+$VO7+!0#Z-2}3qmMM#!SyS8g-w|U#99ta^` zj2<{RiP4kcAJCW@z32f6B%C!d*_$_yBwjoj-)lwY@Xa^h%zV3(-A^;8)6$6K?R3#t z>Dzkv*8fiGGZTN7sXvKZ6E@ zV^`5G%)}JmfH3(ByF~enqwGv+K95NpD#Jnl_tYMpb=;bkw{n_BHreKVCUKTcCRmkb zumi8-gJ=Ve;x|*fObAj)BeF-6&3=yg)@4q|blJ++w~bly1QM6w(h@?GBt-jv0o-u4 A#Q*>R diff --git a/controllers/__pycache__/tenor.cpython-314.pyc b/controllers/__pycache__/tenor.cpython-314.pyc index e4c654d3b89a4ae4c815b9266f55638de31f067b..25527c13eafe55e8d0817fa06c256dc9aefcd1e6 100644 GIT binary patch literal 8504 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 p=7TF}_n3$X^M4O2C!Q5W|> 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 Z%~w`Dqf3KfG#ctC_0q=CRF`a@{{jD{YP$dc diff --git a/controllers/tenor.py b/controllers/tenor.py index cf4b3a3..a32b22b 100644 --- a/controllers/tenor.py +++ b/controllers/tenor.py @@ -1,22 +1,20 @@ -""" -controllers/tenor.py — GIPHY API proxy (requests-based). -""" - import json import logging import requests from bottle import route, request, response +import redis + +redis_server = redis.Redis(host="localhost", port=6379, db=0, decode_responses=True) logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) -_giphy_key: str = "GIPHY_API_KEY" +_giphy_key: str = "NR2vkCSTVKnwBx9IavODcsqeSt9Sreze" _session = requests.Session() _session.headers.update({'User-Agent': 'GIPHY-Proxy/1.0'}) GIPHY_BASE = "https://api.giphy.com/v1/gifs" - def init(tenor_cfg): global _giphy_key if hasattr(tenor_cfg, 'api_key') and tenor_cfg.api_key: @@ -25,23 +23,26 @@ def init(tenor_cfg): else: logger.warning("No GIPHY API key configured, using default placeholder") - def _build_params(query_params, extra=None): params = { "api_key": _giphy_key, - "limit": query_params.get("limit", "20"), + "limit": int(query_params.get("limit", "20")), "rating": query_params.get("rating", "g"), "lang": query_params.get("lang", "en"), } - if query_params.get("offset"): - params["offset"] = query_params["offset"] + # Обработка offset + try: + if query_params.get("offset"): + params["offset"] = int(query_params["offset"]) + else: + params["offset"] = 0 + except ValueError: + params["offset"] = 0 if extra: params.update(extra) return params - def _transform_giphy_result(gif): - """Convert GIPHY format -> unified {id, title, file: {hd, md, sm, xs}}.""" images = gif.get("images", {}) return { "id": gif.get("id"), @@ -56,10 +57,9 @@ def _transform_giphy_result(gif): "blur_preview": images.get("preview_gif", {}).get("url", ""), } - def _fetch_giphy(endpoint, params): url = f"{GIPHY_BASE}/{endpoint}" - logger.debug(f"GET {url}") + logger.debug(f"GET {url} with params {params}") try: resp = _session.get(url, params=params, timeout=15) resp.raise_for_status() @@ -68,13 +68,16 @@ def _fetch_giphy(endpoint, params): if isinstance(results, dict): results = [results] transformed = [_transform_giphy_result(g) for g in results] + per_page = int(params.get("limit", 20)) + current_offset = int(params.get("offset", 0)) + total_results = len(transformed) return { "success": True, "results": transformed, "pagination": { - "current_page": (int(params.get("offset", 0)) // max(int(params.get("limit", 20)), 1)) + 1, - "per_page": params.get("limit", 20), - "has_next": len(transformed) >= int(params.get("limit", 20)), + "current_page": (current_offset // per_page) + 1, + "per_page": per_page, + "has_next": total_results >= per_page, }, } except requests.exceptions.RequestException as e: @@ -88,20 +91,41 @@ def _fetch_giphy(endpoint, params): response.status = 502 return {"success": False, "error": error_msg} - def register_routes(app): @app.route("/api/gifs/trending", method="GET") def gifs_trending(): - logger.debug(f"Trending request: {dict(request.query)}") - params = _build_params(request.query) - return _fetch_giphy("trending", params) + try: + logger.debug(f"Trending request: {dict(request.query)}") + params = _build_params(request.query) + answ = _fetch_giphy("trending", params) + serialized_answ = json.dumps(answ) + redis_server.set('trending', serialized_answ, ex=360) + return json.loads(serialized_answ) + except Exception as e: + logger.exception("Error in trending route") + response.status = 500 + return {"success": False, "error": str(e)} @app.route("/api/gifs/search", method="GET") def gifs_search(): - logger.debug(f"Search request: {dict(request.query)}") - q = request.query.get("q", "") - if not q: - response.status = 400 - return {"success": False, "error": "Missing query"} - params = _build_params(request.query, extra={"q": q}) - return _fetch_giphy("search", params) + try: + logger.debug(f"Search request: {dict(request.query)}") + q = request.query.get("q", "") + if not q: + response.status = 400 + return {"success": False, "error": "Missing query parameter 'q'"} + params = _build_params(request.query, extra={"q": q}) + cache_key = f"search:{q.lower().strip()}" + # Проверка кеша + cached = redis_server.get(cache_key) + if cached: + return json.loads(cached) + # Если нет кеша, делаем запрос + answ = _fetch_giphy("search", params) + serialized_answ = json.dumps(answ) + redis_server.set(cache_key, serialized_answ, ex=360) + return answ + except Exception as e: + logger.exception("Error in search route") + response.status = 500 + return {"success": False, "error": str(e)} \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-314.pyc b/models/__pycache__/__init__.cpython-314.pyc index 2066285f2b4ba4d9e79a0c2859903ed30f247f1f..0c07724ff6e17890d3631d14a9695a2d6d4afae7 100644 GIT binary patch delta 60 zcmeBVoWRJd&Bx2d00ajc60*c5@)|4aI$Onr7N-^!$K+S#=M~4el_qCr=A}DlB$mYF O=BK3Q6vs@A(FFkXaT7EE delta 53 zcmbQh*vZJN&Bx2d00h3$30a~Od5vY%^fU5vQ}s*r-Aa?QGxO4&GZIVmbMsSDbBgsR HChGzKM|KX# diff --git a/models/__pycache__/base.cpython-314.pyc b/models/__pycache__/base.cpython-314.pyc index 82b1e12843c11e1ba0de1f0ea7b9ff648b5cb0a1..8afc256c4d24e5916c31f5fc9ca9e4958a6e0031 100644 GIT binary patch delta 902 zcmZ8fO=uHA6rS1LY&JieCTUDbwKn~4R6N*1Z5ygJRa>QvY)vmFUDtF|W0Osooq*AU z0YQ545EnrYf)~M~;KieYXR)>-u82213D!n>bzY)Hd@$e6y!Xx9@4b0X+TVoa!#>%K zn7yi9zP3}BBlvoKXnbZFDg2yg)=RzJXdmi9iqL@+N5(nI0~aAGH@zbBIy3T~*QZDw zh_)%NJ`{7;A3XNPuq`FaG+#2bf^{4ZV7Il5R~BWKVh8frvBX3=W$MICmu{2{GkvC# zUCSG*iK`k-7fUO8!AxJ#O#NuNO1zBU1kh_b7~Dah1c|ga{g#i51YfhQhH5B-C{_^V zmVMSZSDo}IoFXaW*q-=|qX%U~MNph$9J|7d`j*fLR$LvZAh816)W3viK#{Bu+_?jt zjIfZ!3}Jx@Y(ci2cUGLgcbZ?sm$)N9`(yv^CppD2$oz~03;!1rA;$XUw7&7t^Ul?L zPOXrF?V|ajZc?pSjtRucC^nxrsLh*{5NJS*v&CGA6g6tgs+uimrn!>OQdKpfqTU(_ zSu?`0=wk=7Y!M+j?F-dsA1>aXe=qlL2&wHhgz>f?`NQ?>-J2Ui;%9(4TFr##i3JJV zC2atHfPnQ~=!zeNEtF5X0ipo#7NiHD7od-U9Z*%xFiKRTx|*vPSyd%LYuXX%9%4}w z`goFrfF1q|O{qDn>X;oKIQDGxW&hg?7qNH+WQs*1)+y}p67p26$1f#BN+dvK7ngWTUp4!}+T delta 722 zcmX|9-)qxQ6uvh})1+zobG6h`*UfbrMT<X|~lR>A1NSh7T(U zvKNJVeHDCA@yQo`@P7~l!KdtPe}XIc>OCoX;eNU2eCM2e=iK{a>O)aKo6%EYiyK&F zPjUBlnr9tBYBby2>iceU(7Z8lwtK;5d&{Oxzu$Geu(@uB?)jZvqVd2ORDK8(9A2OU zNg;*U&&~;z!e@T8(GYbI#U`S{Bb_}Eb{n!OnaP&GNxrDQh8D1?l#!>8lpKf z#nR%fYJ~?lm;-EB65r6@(MLwa*X)g$Qxo&t=FP}#S*l-AY0q~dNw~sQBg6L8m4(SY$Nz)? z0{u^FgP2HJ&H$i3CV(CdVL8G-96BSLQMuSa!knltzMu`vdzytoo=4#(GCd9-7h7w=&oY{h4Na}3%o4IFZ z&YU^lIcI)}pKbTFc-#&G?W^fyFJ5!Zda8uev&~!gTKa7XyKaw?Q6dZd4&4F0)bC8V zbQj13+1l?;cyv#qLa&IDAX!IbTbRi9%_h`Ei0+kz1`>13p6|BX_D||+v5?Nq{+O=( z3?|cLnv4)#kcn;@^|F1!kwMuvL^=f75hgjC>;&}Y1l=xIa;b|;-78WDmwC9X0%f{W z_Uf)7qPt}~oatw`gx4CHd$$cguPIa;E}kwHwBbFa%n7wH-aC=jhx5g(lGBFStZAd* zV_%pSJXWyEkd(r>T2QFOJ`y(t+#sSJ0L={01dUd*TVg%zaGRes2SLc(o~}bg77qzW zg}4Yuo2d(TJ=|(YRMAVc5HryVoDczE?8UJUKtpfUPt!^i_z?mCVYXmy5rWKY`L!Ai zFdV9`&@}o`i&?1!*O{3~io3Z!^U8T_hZL5$rU*MK)d(T>lC&GtT$T20N3#rTUeUDl zxI)*#*Suhenod`@rk3rrHiDY0^>ypKkc2zdu>00%Wi6T!2jG|B-ig`jg<3XfYkTxm zyHd!|sYzYQ@^fh$Y+3!(DEr%nr#9Me?5u$uhBd2jHFOJ}+leCk?o%0shZgAL=4=D; zLvwJ6EtOSRyUlM~*&SsAj^V0gMu18DW5ei2N8U}aw0XlBBAby<_>+whoG&-o0uoc) z0xV0MWy6}8NEZr9&M>Ky@KG%2N+3kXL>q6nT*+JHOg%W&mio^6=qyvi0N$BkTS)5Ue&>cS%_@T;gfV)HHcgY ze?!b`;~FL_q@&c-R96Q%Ip$t3ai`_jo9^Z#3supdBWvEzexROL-#hV1-w$iszKgW~ z>6HAQv%O0m;ttFVoEvyY{N7c&;PTHT&n0o>553(v+qoPhp4yqwnbFrq|I*NJ@AkxZ z`7PJ{&Rvbn<=JD{us;U%jHz=L=}LF0XX4F^wPaBk&O8`v4-VjNug7mUqd>s=AcaR zO@^&VvkFa(O>sqrIjd+HdXT;9s~P0svIEsWj2W)T!Gu4eLzK2gk4EMDcTRSP1s zhZ_YmYYoQ_TTuUcT;tJB=F+*$gp!|XEz&%dP-q@Y!)uMHT`m`B$vi2agkf*kw!^bs t$|*bODfmRgwN`d19H_5ZBu$H?eUWtkMBIy{`8U$MEbSDk?-Bs6;2(%`=q~^O delta 2059 zcma)7O>7%Q6rS<^c>V9#P8{3K4{_Sa4a7;)(xL`Pnxsvd)T*{pgi7P!*h{jlf0Eg? zL@p$ps8pd6&4mIItq?y&9FWSTM-T{lKpYSfT8IP^Rga_%Y7ks_Zycb?C5*M-%)WX1 z-kbT}d%isIYc|*$40s8QGpQFY-t(*nTWNK@=h$&Nso7ed=*pyL!fSgwNS^BIq;JA+ z`zHc+po27%$B6EZ6J0y(!tV*OgE~!7)pS&5*mYLTxL6Q3@Yt{p;W`Xpp`dGxHK8Da5Cv%A zf62XIuSdC?K!1+cv<+6U&05vUxEXq965p?81HzuXtaWM0< zdU6QEa@-ZevI+|Z>x8$P)R8Qk?Hx^u&%3+9%&YF#+!>n7$SlcIT1O;>Ve|orLx{_m z*1Bkl*R=jey?Tslk*zG*MoIW(S@>jcukF0cgI-U0zB!tNFC2Ht5N6mQ`aO&y&-hD4 zV+pSX?1^xWf%w00ro3IWomagV;zbG@_~6jsk>J@n#IHxYn~5%+qt6pv2BcXT5=CJ? zKHy8Nig>|vKPWqrS+(~LyBk!k48R|2WSe-E-7S;}QJ){1gB!V!cMs3D_fPsz5oOYfL(nr~hDaP0f`{_m0l zzk8Hu@bc)UpC1dhr=ldd?`r;P{!0E&3k&MnNZ*Nw@_EE}BF&eBr&mR#VGNE^HX*bI zTasXFC;YN${SVHNUaJd0a27?*0B!(TFx_rUcVa@=APbX+V721FT1K|EaxQ)*cI4J8 zp%zN#_#5F*IR@R3jX+7Q||>OO^!=##H4Vo6JTo>OKc2exlCB_ z<0#8@gRKaf9Q8%B3~fQ^J6esE3^q5vB5XKv$*_tn$NiDisbMragn+CId(cEgxd;Yx zD4hgw=rZ;zt6sL*X?V9V8w7<&BDW$3RdH2!_`8w!j;61l`(XCQ?50m`Zh0taO_BQ& zY0YfLNG!R%e>Zib*|DhdMbtOe%`ZpCMnpGKAx-AYMpJ;oY9!oztybQ<%Eoyh2F>Bt zp;#{+!o+o?1;gIC7U<*#+{-BtL$4C&oQ1VGV&hy`Mvctm*P8q2IRCo29uoPForc8$ za{O$|#1n0>a{N#twppwg_F}EX5~v|6L|o|7#_2q7Md zj|@T+5VgPE3aRw~^K1K{TS+`503x@9ZYJco=jKYa;@lh?=dZ^T)WtuFcTQYDVWbNy9k)IXK!7{M*&b#xu-@SB%x_ s1=y4*rT1MfDsO3o`Zvgd4KlDnhJPf14bpRu^lYn7)5I3h0EM-`0e{P=U;qFB