Skip to content

Commit 2986298

Browse files
committed
rel 2024.1
1 parent 8ab62e1 commit 2986298

File tree

7 files changed

+115
-14
lines changed

7 files changed

+115
-14
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ downloads/
22
env*
33
requirements_optional.txt
44
tests/data
5+
sticker*.txt
6+
sorted
57

68
poetry.lock
79

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@
33
All major and minor version changes will be documented in this file. Details of
44
patch-level version changes can be found in [commit messages](../../commits/master).
55

6+
## 2024.1 - 2024/03/22
7+
8+
- Add '--file' arg for passing in a list of packs
9+
- Implement a custom `demojize` function similar to the `emoji.demojize` function.
10+
However, returns a string of unique keywords in alphabetical order seperated by "_"
11+
612
## 2024 - 2024/03/17
713

814
- add convert backends to give the user a choice of using their preferred tool

documentation/reference/tstickers/downloader.md

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@
1414
- [StickerDownloader().downloadSticker](#stickerdownloader()downloadsticker)
1515
- [StickerDownloader().getPack](#stickerdownloader()getpack)
1616
- [StickerDownloader().getSticker](#stickerdownloader()getsticker)
17+
- [demojize](#demojize)
1718

1819
## Sticker
1920

20-
[Show source in downloader.py:20](../../../tstickers/downloader.py#L20)
21+
[Show source in downloader.py:54](../../../tstickers/downloader.py#L54)
2122

2223
Sticker instance attributes.
2324

@@ -36,7 +37,7 @@ class Sticker:
3637

3738
### Sticker().emojiName
3839

39-
[Show source in downloader.py:38](../../../tstickers/downloader.py#L38)
40+
[Show source in downloader.py:72](../../../tstickers/downloader.py#L72)
4041

4142
Get the emoji as a string.
4243

@@ -50,7 +51,7 @@ def emojiName(self) -> str: ...
5051

5152
## StickerDownloader
5253

53-
[Show source in downloader.py:43](../../../tstickers/downloader.py#L43)
54+
[Show source in downloader.py:77](../../../tstickers/downloader.py#L77)
5455

5556
The StickerDownloader sets up the api and makes requests.
5657

@@ -68,7 +69,7 @@ class StickerDownloader:
6869

6970
### StickerDownloader().convertPack
7071

71-
[Show source in downloader.py:205](../../../tstickers/downloader.py#L205)
72+
[Show source in downloader.py:239](../../../tstickers/downloader.py#L239)
7273

7374
Convert the webp to gif and png; tgs to gif, webp (webp_animated) and png.
7475

@@ -101,7 +102,7 @@ def convertPack(
101102

102103
### StickerDownloader().doAPIReq
103104

104-
[Show source in downloader.py:64](../../../tstickers/downloader.py#L64)
105+
[Show source in downloader.py:98](../../../tstickers/downloader.py#L98)
105106

106107
Use the telegram api.
107108

@@ -129,7 +130,7 @@ def doAPIReq(self, function: str, params: dict[Any, Any]) -> dict[Any, Any] | No
129130

130131
### StickerDownloader().downloadPack
131132

132-
[Show source in downloader.py:167](../../../tstickers/downloader.py#L167)
133+
[Show source in downloader.py:201](../../../tstickers/downloader.py#L201)
133134

134135
Download a sticker pack.
135136

@@ -151,7 +152,7 @@ def downloadPack(self, pack: dict[str, Any]) -> bool: ...
151152

152153
### StickerDownloader().downloadSticker
153154

154-
[Show source in downloader.py:152](../../../tstickers/downloader.py#L152)
155+
[Show source in downloader.py:186](../../../tstickers/downloader.py#L186)
155156

156157
Download a sticker from the server.
157158

@@ -174,7 +175,7 @@ def downloadSticker(self, path: Path, link: str) -> int: ...
174175

175176
### StickerDownloader().getPack
176177

177-
[Show source in downloader.py:118](../../../tstickers/downloader.py#L118)
178+
[Show source in downloader.py:152](../../../tstickers/downloader.py#L152)
178179

179180
Get a list of File objects.
180181

@@ -196,7 +197,7 @@ def getPack(self, packName: str) -> dict[str, Any] | None: ...
196197

197198
### StickerDownloader().getSticker
198199

199-
[Show source in downloader.py:95](../../../tstickers/downloader.py#L95)
200+
[Show source in downloader.py:129](../../../tstickers/downloader.py#L129)
200201

201202
Get sticker info from the server.
202203

@@ -218,4 +219,29 @@ def getSticker(self, fileData: dict[Any, Any]) -> Sticker: ...
218219

219220
#### See also
220221

221-
- [Sticker](#sticker)
222+
- [Sticker](#sticker)
223+
224+
225+
226+
## demojize
227+
228+
[Show source in downloader.py:21](../../../tstickers/downloader.py#L21)
229+
230+
Similar to the emoji.demojize function.
231+
232+
However, returns a string of unique keywords in alphabetical order seperated by "_"
233+
234+
#### Arguments
235+
236+
- `emoji` *str* - emoji unicode char
237+
238+
#### Returns
239+
240+
Type: *str*
241+
returns a string of unique keywords in alphabetical order seperated by "_"
242+
243+
#### Signature
244+
245+
```python
246+
def demojize(emoji: str) -> str: ...
247+
```

move_webp_stickers.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import shutil
2+
from pathlib import Path
3+
4+
source_dir = Path("./downloads")
5+
6+
packnames = [
7+
name.name for name in source_dir.iterdir() if name.is_dir()
8+
]
9+
10+
for packname in packnames:
11+
source_path = source_dir / packname / "webp"
12+
dest_path = Path("./sorted") / packname
13+
14+
15+
print(packname)
16+
17+
if not dest_path.exists():
18+
dest_path.mkdir(parents=True)
19+
20+
for file_path in source_path.iterdir():
21+
shutil.copy(file_path, dest_path)

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "tstickers"
3-
version = "2024"
3+
version = "2024.1"
44
license = "mit"
55
description = "Download sticker packs from Telegram"
66
authors = ["FredHappyface"]

tstickers/cli.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ def cli() -> None: # pragma: no cover
2929
nargs="+",
3030
help="Pass in a pack url inline",
3131
)
32+
parser.add_argument(
33+
"-f",
34+
"--file",
35+
help="Path to file containing pack urls",
36+
)
3237
parser.add_argument(
3338
"--frameskip",
3439
default=1,
@@ -64,7 +69,14 @@ def cli() -> None: # pragma: no cover
6469
)
6570
sysexit(1)
6671
# Get the packs
67-
packs = functools.reduce(operator.iadd, args.pack or [[]], [])
72+
73+
packs = []
74+
if args.file:
75+
fp = Path(args.file)
76+
if fp.is_file():
77+
packs = fp.read_text("utf-8").strip().splitlines()
78+
79+
packs.extend(functools.reduce(operator.iadd, args.pack or [[]], []))
6880
if len(packs) == 0:
6981
while True:
7082
name = input("Enter sticker_set url (leave blank to stop): ").strip()

tstickers/downloader.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from __future__ import annotations
44

5+
import re
56
import time
67
import urllib.parse
78
from concurrent.futures import ThreadPoolExecutor, as_completed
@@ -10,13 +11,46 @@
1011
from sys import exit as sysexit
1112
from typing import Any
1213

13-
from emoji import demojize
14+
from emoji import EMOJI_DATA
1415
from loguru import logger
1516

1617
from tstickers import caching
1718
from tstickers.convert import Backend, assure_dir_exists, convertAnimated, convertStatic
1819

1920

21+
def demojize(emoji: str) -> str:
22+
"""Similar to the emoji.demojize function.
23+
24+
However, returns a string of unique keywords in alphabetical order seperated by "_"
25+
26+
:param str emoji: emoji unicode char
27+
:return str: returns a string of unique keywords in alphabetical order seperated by "_"
28+
"""
29+
30+
def c14n_part(part: str) -> str:
31+
return re.sub(r"_!@#$%^&*'", "_", part).replace("-", "_").lower()
32+
33+
def merge_parts(parts: set[str]) -> str:
34+
unique_set = set()
35+
for part in parts:
36+
unique_set.update(part.split("_"))
37+
38+
unique_set.discard("")
39+
unique_set.discard("with")
40+
41+
result_list = sorted(unique_set)
42+
return "_".join(result_list)
43+
44+
emoji_data = EMOJI_DATA.get(emoji)
45+
if emoji_data is None:
46+
return "unknown"
47+
48+
parts = {c14n_part(emoji_data.get("en", "").strip(":"))}
49+
parts.update(c14n_part(x.strip(":")) for x in emoji_data.get("alias", []))
50+
51+
return merge_parts(parts)
52+
53+
2054
class Sticker:
2155
"""Sticker instance attributes."""
2256

@@ -37,7 +71,7 @@ def __repr__(self) -> str:
3771

3872
def emojiName(self) -> str:
3973
"""Get the emoji as a string."""
40-
return demojize(self.emoji)[1:-1]
74+
return demojize(self.emoji)
4175

4276

4377
class StickerDownloader:

0 commit comments

Comments
 (0)