1diff --git a/.build.yml b/.build.yml
2new file mode 100644
3index 0000000000000000000000000000000000000000..79061c07b418b51fca6e40280287bbd2a97c4f15
4--- /dev/null
5+++ b/.build.yml
6@@ -0,0 +1,24 @@
7+image: fedora/36
8+packages:
9+ - rsync
10+ - make
11+
12+secrets:
13+ - 008c4f67-b864-47f8-9790-cd32f2ae8516
14+
15+environment:
16+ deploy: builds@gabrielgio.me
17+
18+tasks:
19+ - deps: |
20+ cd jnfilter
21+ make install_deps
22+ - build: |
23+ cd jnfilter
24+ make
25+ - deploy: |
26+ cd jnfilter
27+ sshopts="ssh -o StrictHostKeyChecking=no"
28+ rsync --rsh="$sshopts" -rP dist/*.rpm $deploy:/var/www/artifacs.gabrielgio.me/jnfilter/
29+
30+
31diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
32deleted file mode 100644
33index 23dbe2b00365b80eac50f2e76b77ea70ac45796b..0000000000000000000000000000000000000000
34--- a/.gitlab-ci.yml
35+++ /dev/null
36@@ -1,14 +0,0 @@
37-pages:
38- image:
39- name: pandoc/alpine
40- entrypoint:
41- - ""
42- stage: build
43- script:
44- - mkdir public
45- - pandoc -s --include-in-header=docs/bamboo.min.css -s README.md -o public/index.html
46- artifacts:
47- paths:
48- - public
49- only:
50- - master
51diff --git a/Makefile b/Makefile
52new file mode 100644
53index 0000000000000000000000000000000000000000..ed3ae00513fdc9488283866254e4160dd8110dc4
54--- /dev/null
55+++ b/Makefile
56@@ -0,0 +1,15 @@
57+
58+rpm: rpm_dist
59+ rpmbuild -bb \
60+ ./build/bdist.linux-x86_64/rpm/SPECS/jnfilter.spec \
61+ --define "_topdir $(PWD)/build/bdist.linux-x86_64/rpm/"
62+
63+rpm_dist:
64+ python setup.py bdist_rpm
65+
66+clean:
67+ python setup.py clean --all
68+ rm -rf dist jnfilter.egg-info
69+
70+install_deps:
71+ dnf install -y rpmdevtools rpmlint python
72diff --git a/main.py b/jnfilter/main.py
73rename from main.py
74rename to jnfilter/main.py
75index 1f909b0b8e5a89fb1241094d1ad906469c8968fd..9795b8cd1f470689f01eafc7e8f1af3092295c9c 100644
76--- a/main.py
77+++ b/jnfilter/main.py
78@@ -1,11 +1,13 @@
79 import re
80+import httpx
81+import uvicorn
82+
83 from functools import reduce
84 from typing import List, Iterator
85 from xml.etree.ElementTree import ElementTree, fromstring, tostring, register_namespace
86-
87-import httpx
88 from fastapi import FastAPI
89 from starlette.responses import Response, PlainTextResponse
90+
91
92 app = FastAPI()
93
94@@ -87,3 +89,6 @@
95 @app.get("/series")
96 async def titles():
97 return [i[0] for i in RegexCollection.items()]
98+
99+def run():
100+ uvicorn.run(app=app, host="0.0.0.0", port=32000)
101diff --git a/requirements.txt b/requirements.txt
102deleted file mode 100644
103index 092f079d3dd2bf9c4e743c7681767edc87b415b5..0000000000000000000000000000000000000000
104--- a/requirements.txt
105+++ /dev/null
106@@ -1,3 +0,0 @@
107-httpx==0.21.1
108-fastapi==0.70.0
109-uvicorn==0.15.0
110diff --git a/setup.py b/setup.py
111new file mode 100644
112index 0000000000000000000000000000000000000000..96868e598f0a49eedf64aa4fa9bf060539da141f
113--- /dev/null
114+++ b/setup.py
115@@ -0,0 +1,23 @@
116+from setuptools import setup
117+
118+requirements = [
119+ 'httpx==0.21.1',
120+ 'fastapi==0.70.0',
121+ 'uvicorn==0.15.0'
122+]
123+
124+
125+setup(name='jnfilter',
126+ version='0.2.0',
127+ description='A FastAPI server to filter Nercast podcast feed',
128+ url='https://git.sr.ht/~gabrielgio/jnfilter',
129+ author='Gabriel Arakaki Giovanini',
130+ author_email='mail@gabrielgio.me',
131+ license='MIT',
132+ packages=['jnfilter'],
133+ entry_points="""
134+ [console_scripts]
135+ jnfilterd=jnfilter.main:run
136+ """,
137+ install_requires=requirements,
138+ zip_safe=False)
139diff --git a/test/dev-requirements.txt b/test/dev-requirements.txt
140new file mode 100644
141index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
142Binary files /dev/null and b/test/dev-requirements.txt differ
143diff --git a/test/test_main.py b/test/test_main.py
144new file mode 100644
145index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
146Binary files /dev/null and b/test/test_main.py differ