Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
46 changes: 46 additions & 0 deletions bigfastapi/contact_secure.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
from uuid import uuid4
import fastapi as fastapi
import passlib.hash as _hash
from bigfastapi.models import contact_secure_model as model
from .utils import utils
from fastapi import APIRouter, HTTPException, status
import sqlalchemy.orm as orm
from bigfastapi.db.database import get_db
from .schemas import contact_secure_schemas as schemas

app = APIRouter(tags=["contact us security"])


@app.post("/contact/secure", status_code=201)
def create_pin(secure: schemas.ContactSecureCreate, db: orm.Session = fastapi.Depends(get_db)):
c_secure = db.query(model.ContactSecure).filter(model.ContactSecure.email == secure.email).first()
print(c_secure)
if c_secure is not None:
raise fastapi.HTTPException(status_code=403, detail="Email already exist")

cont = model.ContactSecure(id=uuid4().hex,
email=secure.email,
code=secure.code)
db.add(cont)
db.commit()
db.refresh(cont)
return {"message": f"pin created for {cont.email}"}


@app.post("/contact/secure/login", status_code=200)
async def login(secure: schemas.ContactSecureLogin, db: orm.Session = fastapi.Depends(get_db)):
secure_info = db.query(model.ContactSecure).filter(model.ContactSecure.email == secure.email).first()
if secure_info.code == secure.code:
return {"message": "Welcome back"}
raise fastapi.HTTPException(status_code=403, detail="pin Incorrect")


@app.put("/contact/secure/{email}")
def ForgotSecurePin(secure: schemas.CodeUpdate, email: str, db: orm.Session = fastapi.Depends(get_db)):
secure_code = db.query(model.ContactSecure).filter(model.ContactSecure.email == email).first()
if secure_code:
secure_code.code = secure.code
db.commit()
db.refresh(secure_code)
return {"message": "Code changed, kindly log in"}
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Email not registered")
17 changes: 17 additions & 0 deletions bigfastapi/models/contact_secure_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import passlib.hash as _hash
import datetime as dt
from sqlalchemy.schema import Column
from sqlalchemy.types import String, DateTime
from uuid import uuid4
import bigfastapi.db.database as database


class ContactSecure(database.Base):
__tablename__ = "contact secure"
id = Column(String(255), primary_key=True, index=True, default=uuid4().hex)
email = Column(String(255), index=True)
code = Column(String(255), nullable=False)
date_created = Column(DateTime, default=dt.datetime.utcnow)

def verify_code(self, code: str):
return (code, self.code)
37 changes: 37 additions & 0 deletions bigfastapi/models/video_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import sqlalchemy.orm as orm
from sqlalchemy.schema import Column
from sqlalchemy.types import String, Integer, DateTime
from sqlalchemy.ext.hybrid import hybrid_method
from sqlalchemy import ForeignKey
from sqlalchemy.sql import func
from uuid import uuid4
from bigfastapi.db import database
import bigfastapi.schemas.users_schemas as schema


class videos(database.Base):
__tablename__ = "videos"
id = Column(String(255), primary_key=True, index=True, default=uuid4().hex)
title = Column(String(255), index=True)
url = Column(String(255), index=True)
thumbnail = Column(String(255), index=True)
duration = Column(String(255), index=True)
added_by = Column(String(255), ForeignKey("users.id"))
likes = Column(Integer, default=0, nullable=False)
time_added = Column(DateTime(timezone=True), server_default=func.now())

@hybrid_method
def like(self):
self.likes += 1
return self.likes

@hybrid_method
def unlike(self):
self.likes -= 1
return self.likes


def video_picker(user: schema.User,
id: str, db: orm.Session):
video = db.query(videos).filter_by(added_by=user.id).filter(videos.id == id).first()
return video
29 changes: 29 additions & 0 deletions bigfastapi/schemas/contact_secure_schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import datetime as dt
import pydantic


class SecureBase(pydantic.BaseModel):
email: str


class ContactSecureCreate(SecureBase):
code: str

class Config:
orm_mode = True


class CodeUpdate(pydantic.BaseModel):
code: str


class ContactSecureLogin(SecureBase):
code: str


class ContactSecure(SecureBase):
id: str
date_created: dt.datetime

class Config:
orm_mode = True
31 changes: 31 additions & 0 deletions bigfastapi/schemas/video_schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import datetime as dt
from typing import Optional
from pydantic import BaseModel, HttpUrl


class videoSearch(BaseModel):
url: HttpUrl


class videoBase(BaseModel):
id: str
title: str
url: str
thumbnail: str
duration: str
added_by: str
time_added: dt.datetime

class Config:
orm_mode = True
validate_all = True
validate_assignment = True


class videos(videoBase):
likes = int

class Config:
orm_mode = True
validate_all = True
validate_assignment = True
121 changes: 121 additions & 0 deletions bigfastapi/video.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
from __future__ import unicode_literals
import requests
import youtube_dl
from uuid import uuid4
from bs4 import BeautifulSoup
from fastapi import APIRouter, status, HTTPException, BackgroundTasks
from isodate import parse_duration
from typing import List
import fastapi
import sqlalchemy.orm as orm
from .auth_api import is_authenticated
from .schemas import users_schemas
from .schemas import video_schemas as schema
from .models import video_model as model

from bigfastapi.db.database import get_db

app = APIRouter(tags=["video streaming and download"])


@app.post("/video/stream")
def stream_videos(video: schema.videoSearch,
db: orm.Session = fastapi.Depends(get_db),
user: users_schemas.User = fastapi.Depends(is_authenticated)
):
videos = get_video(url=video.url)
vid = model.videos(id=uuid4().hex, title=videos["title"], url=videos["track_url"],
thumbnail=videos["thumbnail_url"], duration=videos["duration"], added_by=user.id)
db.add(vid)
db.commit()
db.refresh(vid)
return {"message": "video saved successfully", "video": schema.videos.from_orm(vid)}


@app.get("/video/stream", response_model=List[schema.videos])
def user_stream_list(db: orm.Session = fastapi.Depends(get_db),
user: users_schemas.User = fastapi.Depends(is_authenticated)
):
videos = db.query(model.videos).filter(model.videos.added_by == user.id).all()
return list(map(schema.videos.from_orm, videos))


@app.get("/video/stream/{video_id}")
def get_stream(video_id: str, db: orm.Session = fastapi.Depends(get_db),
user: users_schemas.User = fastapi.Depends(is_authenticated)
):
videos = db.query(model.videos).filter(model.videos.id == video_id).first()
if videos:
return {"message": "successful", "video": schema.videos.from_orm(videos)}
return {"message": "not found"}


@app.put("/video/stream/{video_id}/likes")
def like_videos(action: str, video_id: str, db: orm.Session = fastapi.Depends(get_db),
user: users_schemas.User = fastapi.Depends(is_authenticated)
):
if action not in ["like", "unlike"]:
return {"status": False, "message": {f"{action} not supported. Consider using 'like' or 'unlike'."}}
video = db.query(model.videos).filter(model.videos.id == video_id).first()
if not video:
return {"message": "video not found"}
if action == "like":
video.like()
elif action == "unlike":
video.unlike(),

db.commit()
db.refresh(video)
return {"status": True, "data": video}


@app.delete("/video/stream/{video_id}")
def delete_video(video_id: str, db: orm.Session = fastapi.Depends(get_db),
user: users_schemas.User = fastapi.Depends(is_authenticated)
):
video = model.video_picker(user=user, id=video_id, db=db)
if video:
db.delete(video)
db.commit()
return video
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="video never existed")


@app.post("/video/download")
def download_videos(video_id: str, background_tasks: BackgroundTasks,
user: users_schemas.User = fastapi.Depends(is_authenticated),
db: orm.Session = fastapi.Depends(get_db)):
video = db.query(model.videos).filter(model.videos.id == video_id).first()
if not video:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND, detail="video doesn't exist")
background_tasks.add_task(download, url=video.url)
return {"message": "downloading in background............."}


# **************************************video services**************************************************#


def get_video(url):
res = requests.get(url)
content = res.content
soup = BeautifulSoup(content, "html.parser")

return {
"title": soup.select_one('meta[itemprop="name"][content]')["content"],
"track_url": soup.select_one('link[itemprop="url"]')["href"],
"thumbnail_url": soup.select_one('link[itemprop="thumbnailUrl"]')["href"],
"duration": str(
parse_duration(
soup.select_one('meta[itemprop="duration"][content]')["content"]
)
),
}


def download(url):
ydl_opts = {'outtmpl': 'C:/Users/D E L E/CODE/bigfastapi/download/%(title)s.%(ext)s'}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
load = ydl.download([url])
return {"message": "downloaded successfully", "video": load}
8 changes: 5 additions & 3 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@


# Import all the functionality that BFA provides
from bigfastapi.faq import app as faq
from bigfastapi.contact import app as contact
from bigfastapi.blog import app as blog
from bigfastapi.pages import app as pages
from bigfastapi.contact_secure import app as contact_secure
from bigfastapi.files import app as files
from bigfastapi.users import app as accounts
from bigfastapi.comments import app as comments
Expand All @@ -30,6 +28,7 @@
from fastapi.testclient import TestClient
from bigfastapi.banks import router as banks
from bigfastapi.email import app as email
from bigfastapi.video import app as video
from bigfastapi.organization import app as organization
from bigfastapi.qrcode import app as qrcode
from bigfastapi.settings import app as settings
Expand All @@ -40,6 +39,7 @@
from bigfastapi.sms import app as sms



# Create the application
app = FastAPI()

Expand All @@ -63,6 +63,8 @@
app.include_router(countries, tags=["Countries"])
app.include_router(faq)
app.include_router(contact)
app.include_router(video)
app.include_router(contact_secure)
app.include_router(blog, tags=["Blog"])
app.include_router(pages, tags=["Pages"])
app.include_router(plans, tags=['Plans'])
Expand Down
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ alembic
asgiref
async-timeout
blinker
bs4
certifi
cffi
charset-normalizer
Expand All @@ -19,6 +20,7 @@ fastapi-utils
greenlet
h11
idna
isodate
Jinja2
MarkupSafe
packaging
Expand Down Expand Up @@ -47,5 +49,6 @@ uvicorn
watchgod
websockets
validators
youtube-dl
pytest
fastapi-pagination
Loading