Skip to content
Merged
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
15 changes: 15 additions & 0 deletions .env
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@

TEAMS_TENANT_ID = "40ad34a2-4df4-499f-a628-c865a29a7782"
TEAMS_CLIENT_ID = "4aa51599-98de-4a0a-8006-6939d24a18f4"
TEAMS_CLIENT_SECRET = "T5l8Q~_mmVp_.qHDlRkUKenBCELcceLYPFnDUcGF"
TEAMS_REDIRECT_URI = "https://login.microsoftonline.com/common/oauth2/nativeclient"

ZOOM_CLIENT_ID="FA1BsrIaTHyB5zmz2hukmg"
ZOOM_CLIENT_SECRET="dpQeeLxZBAqFFaEpevt2WmAv1J81jtmJ"
ZOOM_REDIRECT_URI="http://localhost:5000/zoom/callback"

# dane do maila
SMTP_SERVER=smtp.gmail.com
SMTP_PORT=587
EMAIL_USERNAME=jfurtak03@gmail.com
EMAIL_PASSWORD=blmr hpes ktzy wnti
1 change: 1 addition & 0 deletions .idea/.name

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

138 changes: 69 additions & 69 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,69 +1,69 @@
# Aplikacja do Sporządzania Notatek ze Spotkań

Aplikacja umożliwia nagrywanie spotkań, tworzenie z nich notatek oraz informowanie nieobecnych uczestników o ich przebiegu.

## Wymagania

Przed uruchomieniem aplikacji należy zainstalować wymagane zależności oraz skonfigurować środowisko. Szczegóły poniżej.

### Instalacja zależności

1. **Z katalogu projekt_2025/apka i projekt_2025/apka/app**, uruchom następujące polecenia w terminalu:

```bash
pip install -r requirements.txt
```

2. **Zainstaluj FFmpeg (Essentials Build):**

Przejdź do katalogu `/app` i wykonaj polecenie:

```bash
winget install "FFmpeg (Essentials Build)"
```

Po zakończeniu instalacji zamknij i ponownie otwórz terminal. Przejdź do katalogu `/app` i wpisz:

```bash
ffmpeg
```

Jeśli pojawią się informacje o rozszerzeniu FFmpeg, oznacza to, że instalacja przebiegła pomyślnie.

### Możliwy błąd z FFmpeg

W niektórych przypadkach ścieżka do FFmpeg może wymagać ręcznej modyfikacji. Jeśli napotkasz problemy z uruchomieniem, otwórz plik `recording.py` znajdujący się w folderze `backend` i zmodyfikuj linię 67:

Z:

```python
'ffmpeg'
```

Na:

```python
'ffmpeg/bin/ffmpeg'
```

## Uruchamianie aplikacji

1. Z katalogu proejkt_2025/apka/app uruchom aplikację poleceniem:

```bash
python -m main
```

2. Aplikacja powinna uruchomić się i być gotowa do użycia.

## Funkcjonalności aplikacji

- **Nagrywanie spotkań:** Możliwość rejestrowania audio.
- **Tworzenie notatek:** Generowanie notatek na podstawie nagranych materiałów.

## Uwagi

- Upewnij się, że wszystkie wymagania zostały poprawnie zainstalowane
- W razie problemów z FFmpeg, sprawdź ścieżkę i upewnij się, że jest poprawna

---
# Aplikacja do Sporządzania Notatek ze Spotkań
Aplikacja umożliwia nagrywanie spotkań, tworzenie z nich notatek oraz informowanie nieobecnych uczestników o ich przebiegu.
## Wymagania
Przed uruchomieniem aplikacji należy zainstalować wymagane zależności oraz skonfigurować środowisko. Szczegóły poniżej.
### Instalacja zależności
1. **Z katalogu projekt_2025/apka i projekt_2025/apka/app**, uruchom następujące polecenia w terminalu:
```bash
pip install -r requirements.txt
```
2. **Zainstaluj FFmpeg (Essentials Build):**
Przejdź do katalogu `/app` i wykonaj polecenie:
```bash
winget install "FFmpeg (Essentials Build)"
```
Po zakończeniu instalacji zamknij i ponownie otwórz terminal. Przejdź do katalogu `/app` i wpisz:
```bash
ffmpeg
```
Jeśli pojawią się informacje o rozszerzeniu FFmpeg, oznacza to, że instalacja przebiegła pomyślnie.
### Możliwy błąd z FFmpeg
W niektórych przypadkach ścieżka do FFmpeg może wymagać ręcznej modyfikacji. Jeśli napotkasz problemy z uruchomieniem, otwórz plik `recording.py` znajdujący się w folderze `backend` i zmodyfikuj linię 67:
Z:
```python
'ffmpeg'
```
Na:
```python
'ffmpeg/bin/ffmpeg'
```
## Uruchamianie aplikacji
1. Z katalogu proejkt_2025/apka/app uruchom aplikację poleceniem:
```bash
python -m main
```
2. Aplikacja powinna uruchomić się i być gotowa do użycia.
## Funkcjonalności aplikacji
- **Nagrywanie spotkań:** Możliwość rejestrowania audio.
- **Tworzenie notatek:** Generowanie notatek na podstawie nagranych materiałów.
## Uwagi
- Upewnij się, że wszystkie wymagania zostały poprawnie zainstalowane
- W razie problemów z FFmpeg, sprawdź ścieżkę i upewnij się, że jest poprawna
---
Binary file modified apka/app/__pycache__/main.cpython-310.pyc
Binary file not shown.
Binary file modified apka/app/__pycache__/main.cpython-311.pyc
Binary file not shown.
Binary file added apka/app/__pycache__/main.cpython-312.pyc
Binary file not shown.
34 changes: 32 additions & 2 deletions apka/app/backend/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,40 @@
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

UPLOAD_FOLDER = 'uploads'
# Inicjalizacja SQLAlchemy (jedna, wspólna instancja)
db = SQLAlchemy()

UPLOAD_FOLDER = 'uploads'

def create_app() -> Flask:
app = Flask(__name__, static_folder="../frontend/static", template_folder="../frontend/templates")
from .routes import main
app.secret_key = "secret_key"

# Upewnij się, że mamy folder "instance" (jeśli nie istnieje, to go twórz)
instance_folder = os.path.join(os.getcwd(), 'instance')
if not os.path.exists(instance_folder):
os.makedirs(instance_folder)

# Konfiguracja ścieżki do pliku bazy w folderze instance
database_path = os.path.join(instance_folder, 'database.db')
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{database_path}"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

# Inicjalizacja SQLAlchemy z aplikacją Flask
db.init_app(app)

with app.app_context():
# Importujemy modele PRZED wywołaniem create_all()
from .models import Email, Note

print("Sprawdzam i tworzę tabele w bazie (o ile ich brak)...")
db.create_all() # Teraz SQLAlchemy zna klasy Email, Note
print("Gotowe!")

# Rejestrowanie blueprintu
from .routes import main
app.register_blueprint(main)

return app
Binary file modified apka/app/backend/__pycache__/__init__.cpython-310.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified apka/app/backend/__pycache__/calendar_integration.cpython-310.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified apka/app/backend/__pycache__/note.cpython-310.pyc
Binary file not shown.
Binary file added apka/app/backend/__pycache__/note.cpython-311.pyc
Binary file not shown.
Binary file added apka/app/backend/__pycache__/note.cpython-312.pyc
Binary file not shown.
Binary file modified apka/app/backend/__pycache__/recording.cpython-310.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified apka/app/backend/__pycache__/routes.cpython-310.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file modified apka/app/backend/__pycache__/screenshot.cpython-310.pyc
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
69 changes: 0 additions & 69 deletions apka/app/backend/calendar_integration.py

This file was deleted.

1 change: 0 additions & 1 deletion apka/app/backend/credentials.json

This file was deleted.

1 change: 0 additions & 1 deletion apka/app/backend/credentials_2.json

This file was deleted.

1 change: 0 additions & 1 deletion apka/app/backend/credentialsstare.json

This file was deleted.

114 changes: 114 additions & 0 deletions apka/app/backend/google_calendar_integration.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# google_calendar_integration.py
import os
import requests
from dotenv import load_dotenv
from google_auth_oauthlib.flow import Flow
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from datetime import datetime, timezone
import pytz


load_dotenv()

GOOGLE_CLIENT_ID = "907999041253-2eqttdeuvd1inb1oh6a81vptdk1sh9ao.apps.googleusercontent.com"
GOOGLE_CLIENT_SECRET = "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"
GOOGLE_REDIRECT_URI = "http://localhost:5000/google-calendar/callback"

SCOPES = ["https://www.googleapis.com/auth/calendar.readonly"]

def get_google_authorize_url():
"""
Generuje link do logowania w Google.
"""
print("DEBUG REDIRECT URI =", GOOGLE_REDIRECT_URI)
flow = Flow.from_client_config(
{
"web": {
"client_id": GOOGLE_CLIENT_ID,
"client_secret": GOOGLE_CLIENT_SECRET,
"redirect_uris": [GOOGLE_REDIRECT_URI],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
},
scopes=SCOPES,
redirect_uri=GOOGLE_REDIRECT_URI
)
auth_url, _ = flow.authorization_url(
access_type="offline",
prompt="consent"
)
print(auth_url)
return auth_url

def exchange_code_for_token2(code):
"""
Wymienia 'code' na obiekt Credentials (zawierający access_token).
"""
flow = Flow.from_client_config(
{
"web": {
"client_id": GOOGLE_CLIENT_ID,
"client_secret": GOOGLE_CLIENT_SECRET,
"redirect_uris": [GOOGLE_REDIRECT_URI],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
}
},
scopes=SCOPES,
redirect_uri=GOOGLE_REDIRECT_URI,
)
flow.fetch_token(code=code)
creds = flow.credentials
print("credentials",creds)
return creds # obiekt Credentials

def get_google_events(credentials):
"""
Pobiera listę wydarzeń z kalendarza.
Zwraca tablicę obiektów [ {summary, start, end, attendees, ...}, ... ]
"""
service = build("calendar", "v3", credentials=credentials)
now = datetime.now(timezone.utc).isoformat()

# Wydarzenia z 'primary' kalendarza
events_result = service.events().list(
calendarId="primary",
maxResults=10,
singleEvents=True,
orderBy="startTime",
timeMin=now # example, usun lub param
).execute()
events = events_result.get("items", [])

for event in events:
start = event.get("start", {})
end = event.get("end", {})

event["start"] = format_event_datetime(start.get("dateTime") or start.get("date"))
event["end"] = format_event_datetime(end.get("dateTime") or end.get("date"))

return events

def get_google_event_details(credentials, event_id):
"""
Pobiera szczegóły jednego wydarzenia z ID = event_id.
"""
service = build("calendar", "v3", credentials=credentials)
event = service.events().get(calendarId="primary", eventId=event_id).execute()
return event


def format_event_datetime(dt_str):
""" Konwertuje datę z ISO 8601 na czytelny format DD.MM.YYYY, HH:MM """
if not dt_str:
return "Brak daty"

try:
dt = datetime.fromisoformat(dt_str.replace("Z", "+00:00")) # Obsługa UTC
dt = dt.astimezone(pytz.timezone("Europe/Warsaw")) # Konwersja do PL
return dt.strftime("%d.%m.%Y, %H:%M") # Format DD.MM.YYYY, HH:MM
except Exception as e:
print("Błąd konwersji daty:", e)
return dt_str # Zwraca oryginalną wartość w razie błędu
Loading