add_task.pyā¢3.52 kB
#!/usr/bin/env python3
"""
Quick script to add individual tasks to TickTick
Usage:
python add_task.py "Task title" --content "Task description" --priority 5
python add_task.py "Buy groceries" --project Health
python add_task.py "Call mom" --due "2025-11-20"
"""
import os
import argparse
from datetime import datetime, timedelta
from ticktick_rest_api import TickTickClient
from dotenv import load_dotenv
load_dotenv()
def main():
parser = argparse.ArgumentParser(description="Add a task to TickTick")
parser.add_argument("title", help="Task title")
parser.add_argument("--content", help="Task description/notes", default="")
parser.add_argument("--project", help="Project name (Marriage, Health, Milestones)", default=None)
parser.add_argument("--priority", type=int, choices=[0, 1, 3, 5], help="Priority: 0=None, 1=Low, 3=Medium, 5=High", default=0)
parser.add_argument("--due", help="Due date (YYYY-MM-DD or 'today', 'tomorrow')", default=None)
args = parser.parse_args()
# Initialize client
client_id = os.getenv('TICKTICK_CLIENT_ID')
client_secret = os.getenv('TICKTICK_CLIENT_SECRET')
redirect_uri = os.getenv('TICKTICK_REDIRECT_URI', 'http://127.0.0.1:8080')
if not client_id or not client_secret:
print("ā Error: TICKTICK_CLIENT_ID and TICKTICK_CLIENT_SECRET must be set in .env")
return
client = TickTickClient(client_id, client_secret, redirect_uri)
if not client.access_token:
print("No existing token found. Starting OAuth flow...\n")
client.authorize()
# Build task data
task_data = {
'title': args.title,
}
if args.content:
task_data['content'] = args.content
if args.priority:
task_data['priority'] = args.priority
# Handle project
if args.project:
projects = client.get_projects()
project = next((p for p in projects if p['name'].lower() == args.project.lower()), None)
if project:
task_data['projectId'] = project['id']
print(f"š Adding to project: {project['name']}")
else:
print(f"ā ļø Project '{args.project}' not found. Task will go to Inbox.")
print(f"Available projects: {', '.join([p['name'] for p in projects])}")
# Handle due date
if args.due:
if args.due.lower() == 'today':
due = datetime.now()
elif args.due.lower() == 'tomorrow':
due = datetime.now() + timedelta(days=1)
else:
try:
due = datetime.strptime(args.due, '%Y-%m-%d')
except ValueError:
print(f"ā Invalid date format: {args.due}. Use YYYY-MM-DD, 'today', or 'tomorrow'")
return
task_data['dueDate'] = due.strftime("%Y-%m-%dT23:59:59+0000")
task_data['isAllDay'] = True
# Create task
try:
task = client.create_task(**task_data)
print(f"\nā
Task created successfully!")
print(f" Title: {task['title']}")
print(f" ID: {task['id']}")
if args.priority:
priority_names = {0: 'None', 1: 'Low', 3: 'Medium', 5: 'High'}
print(f" Priority: {priority_names[args.priority]}")
if args.due:
print(f" Due: {args.due}")
print(f"\nš Check your TickTick app!")
except Exception as e:
print(f"ā Error creating task: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()