diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..cb10d21 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,6 @@ +searcher (1.0-1) unstable; urgency=medium + + * Initial release. + + -- Fatih Önder Thu, 12 Dec 2024 10:00:00 +0300 + diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..f5d273e --- /dev/null +++ b/debian/compat @@ -0,0 +1,2 @@ +12 + diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..4367644 --- /dev/null +++ b/debian/control @@ -0,0 +1,12 @@ +Source: searcher +Section: utils +Priority: optional +Maintainer: Fatih ÖNDER +Build-Depends: debhelper (>= 10), python3-all, dh-python, python3-pyqt5, python3-pillow, python3-pypdf2 +Standards-Version: 4.1.5 +Homepage: https://algyazilim.com + +Package: searcher +Architecture: all +Depends: python3, python3-pyqt5, python3-pillow, python3-pypdf2 +Description: Bu uygulama, Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..7ae6c85 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,8 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: searcher +Source: https://github.com/cektor/Searcher + +Files: * +Copyright:Fatih ÖNDER (CekToR) 2024 ALG Yazılım Inc. +License: GNU + diff --git a/debian/debhelper-build-stamp b/debian/debhelper-build-stamp new file mode 100644 index 0000000..c5a0beb --- /dev/null +++ b/debian/debhelper-build-stamp @@ -0,0 +1 @@ +searcher diff --git a/debian/files b/debian/files new file mode 100644 index 0000000..4efbefe --- /dev/null +++ b/debian/files @@ -0,0 +1,2 @@ +searcher_1.0-1_all.deb utils optional +searcher_1.0-1_amd64.buildinfo utils optional diff --git a/debian/format b/debian/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/debian/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/debian/install b/debian/install new file mode 100644 index 0000000..cbb8a6e --- /dev/null +++ b/debian/install @@ -0,0 +1,4 @@ +#!/bin/bash +searcher.py usr/bin/ +searcher.desktop usr/share/applications/ +debian/searcherlo.png /usr/share/icons/hicolor/48x48/apps/ diff --git a/debian/rules b/debian/rules new file mode 100644 index 0000000..1466958 --- /dev/null +++ b/debian/rules @@ -0,0 +1,5 @@ +#!/usr/bin/make -f + +%: + dh $@ --with python3 --buildsystem=pybuild + diff --git a/debian/searcher.desktop b/debian/searcher.desktop new file mode 100644 index 0000000..026ecb7 --- /dev/null +++ b/debian/searcher.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=Searcher +Comment=Advanced Search Manager +Exec=python3 /usr/bin/searcher.py +Icon=/usr/share/icons/hicolor/48x48/apps/searcherlo.png +Terminal=false +Type=Application +Categories=Utility + +Name[tr_TR]=Searcher + diff --git a/debian/searcher.py b/debian/searcher.py new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/debian/searcher.py @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/debian/searcher.substvars b/debian/searcher.substvars new file mode 100644 index 0000000..978fc8b --- /dev/null +++ b/debian/searcher.substvars @@ -0,0 +1,2 @@ +misc:Depends= +misc:Pre-Depends= diff --git a/debian/searcher.txt b/debian/searcher.txt new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/debian/searcher.txt @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/debian/searcher/DEBIAN/control b/debian/searcher/DEBIAN/control new file mode 100644 index 0000000..f19d370 --- /dev/null +++ b/debian/searcher/DEBIAN/control @@ -0,0 +1,10 @@ +Package: searcher +Version: 1.0-1 +Architecture: all +Maintainer: Fatih ÖNDER +Installed-Size: 46 +Depends: python3, python3-pyqt5, python3-pillow, python3-pypdf2 +Section: utils +Priority: optional +Homepage: https://algyazilim.com +Description: Bu uygulama, Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır. diff --git a/debian/searcher/DEBIAN/md5sums b/debian/searcher/DEBIAN/md5sums new file mode 100644 index 0000000..16371c2 --- /dev/null +++ b/debian/searcher/DEBIAN/md5sums @@ -0,0 +1,11 @@ +d8986ac7169ae209079d702e8d9c41c3 usr/bin/searcher +4c516738f30a3a61af673c70f93b3bd5 usr/bin/searcher.py +0cdb8a54fba5148469b796ccf8e72d12 usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/PKG-INFO +68b329da9893e34099c7d8ad5cb9c940 usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/dependency_links.txt +3f92ae2d81a145633c3e6a64e5bb8b95 usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/entry_points.txt +031e9e16ee833e3e355b520cff11368a usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/requires.txt +68b329da9893e34099c7d8ad5cb9c940 usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/top_level.txt +381bed03247d108250360a52cf9ec1ab usr/share/applications/searcher.desktop +1d2498373765737f88bc0f54f4b42c28 usr/share/doc/searcher/changelog.Debian.gz +74b0e5a663d2b50d91281dee73d9f193 usr/share/doc/searcher/copyright +e7fded7f1b92a0dcb87659a1fde9a95e usr/share/icons/hicolor/48x48/apps/searcherlo.png diff --git a/debian/searcher/usr/bin/searcher b/debian/searcher/usr/bin/searcher new file mode 100644 index 0000000..b76fb9f --- /dev/null +++ b/debian/searcher/usr/bin/searcher @@ -0,0 +1,33 @@ +#!/usr/bin/python3 +# EASY-INSTALL-ENTRY-SCRIPT: 'searcher==1.0','gui_scripts','searcher' +import re +import sys + +# for compatibility with easy_install; see #2198 +__requires__ = 'searcher==1.0' + +try: + from importlib.metadata import distribution +except ImportError: + try: + from importlib_metadata import distribution + except ImportError: + from pkg_resources import load_entry_point + + +def importlib_load_entry_point(spec, group, name): + dist_name, _, _ = spec.partition('==') + matches = ( + entry_point + for entry_point in distribution(dist_name).entry_points + if entry_point.group == group and entry_point.name == name + ) + return next(matches).load() + + +globals().setdefault('load_entry_point', importlib_load_entry_point) + + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(load_entry_point('searcher==1.0', 'gui_scripts', 'searcher')()) diff --git a/debian/searcher/usr/bin/searcher.py b/debian/searcher/usr/bin/searcher.py new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/debian/searcher/usr/bin/searcher.py @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/PKG-INFO b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/PKG-INFO new file mode 100644 index 0000000..92a1a32 --- /dev/null +++ b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/PKG-INFO @@ -0,0 +1,7 @@ +Metadata-Version: 2.1 +Name: searcher +Version: 1.0 +Summary: Searcher - Advanced Search Manager +Home-page: https://github.com/cektor/Searcher +Author: Fatih Önder +Author-email: fatih@algyazilim.com diff --git a/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/dependency_links.txt b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/entry_points.txt b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/entry_points.txt new file mode 100644 index 0000000..601562b --- /dev/null +++ b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[gui_scripts] +searcher = searcher:main diff --git a/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/requires.txt b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/requires.txt new file mode 100644 index 0000000..ef56e1a --- /dev/null +++ b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/requires.txt @@ -0,0 +1,3 @@ +Pillow>=8.0.0 +PyPDF2>=1.26.0 +PyQt5>=5.15.0 diff --git a/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/top_level.txt b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/top_level.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/debian/searcher/usr/lib/python3.11/dist-packages/searcher-1.0.egg-info/top_level.txt @@ -0,0 +1 @@ + diff --git a/debian/searcher/usr/share/applications/searcher.desktop b/debian/searcher/usr/share/applications/searcher.desktop new file mode 100644 index 0000000..026ecb7 --- /dev/null +++ b/debian/searcher/usr/share/applications/searcher.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=Searcher +Comment=Advanced Search Manager +Exec=python3 /usr/bin/searcher.py +Icon=/usr/share/icons/hicolor/48x48/apps/searcherlo.png +Terminal=false +Type=Application +Categories=Utility + +Name[tr_TR]=Searcher + diff --git a/debian/searcher/usr/share/doc/searcher/changelog.Debian.gz b/debian/searcher/usr/share/doc/searcher/changelog.Debian.gz new file mode 100644 index 0000000..d0f2df3 Binary files /dev/null and b/debian/searcher/usr/share/doc/searcher/changelog.Debian.gz differ diff --git a/debian/searcher/usr/share/doc/searcher/copyright b/debian/searcher/usr/share/doc/searcher/copyright new file mode 100644 index 0000000..7ae6c85 --- /dev/null +++ b/debian/searcher/usr/share/doc/searcher/copyright @@ -0,0 +1,8 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: searcher +Source: https://github.com/cektor/Searcher + +Files: * +Copyright:Fatih ÖNDER (CekToR) 2024 ALG Yazılım Inc. +License: GNU + diff --git a/debian/searcher/usr/share/icons/hicolor/48x48/apps/searcherlo.png b/debian/searcher/usr/share/icons/hicolor/48x48/apps/searcherlo.png new file mode 100644 index 0000000..ac7db77 Binary files /dev/null and b/debian/searcher/usr/share/icons/hicolor/48x48/apps/searcherlo.png differ diff --git a/debian/searcherlo.png b/debian/searcherlo.png new file mode 100644 index 0000000..ac7db77 Binary files /dev/null and b/debian/searcherlo.png differ diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..d3827e7 --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +1.0 diff --git a/dist/searcher b/dist/searcher new file mode 100644 index 0000000..13187f0 Binary files /dev/null and b/dist/searcher differ diff --git a/ico.ico b/ico.ico new file mode 100644 index 0000000..c1606c5 Binary files /dev/null and b/ico.ico differ diff --git a/searcher.desktop b/searcher.desktop new file mode 100644 index 0000000..026ecb7 --- /dev/null +++ b/searcher.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=Searcher +Comment=Advanced Search Manager +Exec=python3 /usr/bin/searcher.py +Icon=/usr/share/icons/hicolor/48x48/apps/searcherlo.png +Terminal=false +Type=Application +Categories=Utility + +Name[tr_TR]=Searcher + diff --git a/searcher.egg-info/PKG-INFO b/searcher.egg-info/PKG-INFO new file mode 100644 index 0000000..92a1a32 --- /dev/null +++ b/searcher.egg-info/PKG-INFO @@ -0,0 +1,7 @@ +Metadata-Version: 2.1 +Name: searcher +Version: 1.0 +Summary: Searcher - Advanced Search Manager +Home-page: https://github.com/cektor/Searcher +Author: Fatih Önder +Author-email: fatih@algyazilim.com diff --git a/searcher.egg-info/SOURCES.txt b/searcher.egg-info/SOURCES.txt new file mode 100644 index 0000000..7b90b26 --- /dev/null +++ b/searcher.egg-info/SOURCES.txt @@ -0,0 +1,12 @@ +searcher.desktop +searcherlo.png +setup.py +searcher/searcher.desktop +searcher/searcher.py +searcher/searcherlo.png +searcher.egg-info/PKG-INFO +searcher.egg-info/SOURCES.txt +searcher.egg-info/dependency_links.txt +searcher.egg-info/entry_points.txt +searcher.egg-info/requires.txt +searcher.egg-info/top_level.txt \ No newline at end of file diff --git a/searcher.egg-info/dependency_links.txt b/searcher.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/searcher.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/searcher.egg-info/entry_points.txt b/searcher.egg-info/entry_points.txt new file mode 100644 index 0000000..601562b --- /dev/null +++ b/searcher.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[gui_scripts] +searcher = searcher:main diff --git a/searcher.egg-info/requires.txt b/searcher.egg-info/requires.txt new file mode 100644 index 0000000..ef56e1a --- /dev/null +++ b/searcher.egg-info/requires.txt @@ -0,0 +1,3 @@ +Pillow>=8.0.0 +PyPDF2>=1.26.0 +PyQt5>=5.15.0 diff --git a/searcher.egg-info/top_level.txt b/searcher.egg-info/top_level.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/searcher.egg-info/top_level.txt @@ -0,0 +1 @@ + diff --git a/searcher.py b/searcher.py new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/searcher.py @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/searcher.spec b/searcher.spec new file mode 100644 index 0000000..541e3e7 --- /dev/null +++ b/searcher.spec @@ -0,0 +1,39 @@ +# -*- mode: python ; coding: utf-8 -*- + + +a = Analysis( + ['searcher.py'], + pathex=[], + binaries=[], + datas=[('searcherlo.png', '.')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name='searcher', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=['searcherlo.png'], +) diff --git a/searcher.txt b/searcher.txt new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/searcher.txt @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/searcher/searcher.desktop b/searcher/searcher.desktop new file mode 100644 index 0000000..026ecb7 --- /dev/null +++ b/searcher/searcher.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=Searcher +Comment=Advanced Search Manager +Exec=python3 /usr/bin/searcher.py +Icon=/usr/share/icons/hicolor/48x48/apps/searcherlo.png +Terminal=false +Type=Application +Categories=Utility + +Name[tr_TR]=Searcher + diff --git a/searcher/searcher.py b/searcher/searcher.py new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/searcher/searcher.py @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/searcher/searcher.txt b/searcher/searcher.txt new file mode 100644 index 0000000..7a48ca9 --- /dev/null +++ b/searcher/searcher.txt @@ -0,0 +1,298 @@ +import sys +import os +import subprocess +from PyQt5.QtWidgets import ( + QApplication, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, + QListWidget, QMessageBox, QHBoxLayout, QCheckBox, QComboBox, QDialog +) +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QPixmap, QIcon + +def get_logo_path(): + """Logo dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + elif os.path.exists("searcherlo.png"): + return "searcherlo.png" + return None + +def get_icon_path(): + """Simge dosyasının yolunu döndürür.""" + if hasattr(sys, "_MEIPASS"): + return os.path.join(sys._MEIPASS, "searcherlo.png") + elif os.path.exists("/usr/share/icons/hicolor/48x48/apps/searcherlo.png"): + return "/usr/share/icons/hicolor/48x48/apps/searcherlo.png" + return None + +LOGO_PATH = get_logo_path() +ICON_PATH = get_icon_path() + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("Hakkında") + self.setGeometry(300, 300, 400, 250) + layout = QVBoxLayout() + + # Logo + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + self.setFixedSize(500, 600) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # About text + about_text = QLabel(""" +

Searcher

+

Gelişmiş Dosya Arama Uygulaması

+

Kullanıcıların bilgisayarlarındaki dosyaları hızlı ve etkili bir şekilde aramasını sağlar. Uygulama, belirli dosya adlarını veya içeriklerini aramak için genişletilmiş arama seçenekleri sunar. Kullanıcılar, arama sonuçlarını dosya adlarına veya içeriklerine göre filtreleyebilir ve sonuçları listeleyebilir. Ayrıca, dosya konumlarını açmak için dosya yöneticilerini kullanarak dosyaları kolayca açabilirler. Kullanıcı dostu arayüzü ve özelleştirilebilir arama seçenekleriyle, Searcher, kullanıcıların dosya yönetimlerini kolaylaştıran bir araçtır.

+

Geliştirici: ALG Yazılım Inc.©\n

+

www.algyazilim.com | info@algyazilim.com\n\n

+

Fatih ÖNDER (CekToR) | fatih@algyazilim.com\n

+

GitHub: https://github.com/cektor\n\n

+

Sürüm: 1.0

+

ALG Yazılım Pardus'a Göç'ü Destekler.\n\n

+

Telif Hakkı © 2024 GNU .

+ """) + about_text.setAlignment(Qt.AlignCenter) + about_text.setStyleSheet("color: white;") + about_text.setWordWrap(True) # Taşan metni alt satıra geçirir. + about_text.setOpenExternalLinks(True) + about_text.setTextInteractionFlags(Qt.TextSelectableByMouse) # Metin seçilebilir ve kopyalanabilir + + layout.addWidget(logo_label) + layout.addWidget(about_text) + + self.setLayout(layout) + self.setStyleSheet(""" + QDialog { + background-color: #121212; + color: white; + } + """) + +class FileSearchApp(QWidget): + def __init__(self): + super().__init__() + self.initUI() + + def initUI(self): + self.setWindowTitle("Searcher") + self.setGeometry(100, 100, 800, 600) + + # Pencere simgesi ayarla + if ICON_PATH and os.path.exists(ICON_PATH): + self.setWindowIcon(QIcon(ICON_PATH)) + + # Tema ve stil ayarları + self.setStyleSheet(""" + QWidget { + background-color: #121212; + color: #eeeeee; + } + QLineEdit { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton { + background-color: #282828; + border: 1px solid #444444; + border-radius: 5px; + padding: 8px; + color: #eeeeee; + font-size: 14px; + } + QPushButton:hover { + background-color: #3a3a3a; + } + QListWidget { + background-color: #1e1e1e; + border: 1px solid #333333; + border-radius: 5px; + padding: 5px; + color: #eeeeee; + font-size: 13px; + } + QLabel { + color: #eeeeee; + font-size: 14px; + } + """) + + # Logo label + logo_label = QLabel() + if LOGO_PATH and os.path.exists(LOGO_PATH): + logo_pixmap = QPixmap(LOGO_PATH) + scaled_logo = logo_pixmap.scaled(100, 100, Qt.KeepAspectRatio, Qt.SmoothTransformation) + logo_label.setPixmap(scaled_logo) + else: + logo_label.setText("Logo Bulunamadı") + logo_label.setAlignment(Qt.AlignCenter) + + # Ana bileşenler + self.label = QLabel("Aranacak kelimeyi veya dosya adını girin:") + self.input = QLineEdit() + self.search_button = QPushButton("Ara") + + # About button + about_button = QPushButton("Hakkında") + about_button.clicked.connect(self.show_about_dialog) + + self.result_list = QListWidget() + self.result_list.setEnabled(False) + + # Dosya formatları için ComboBox (Başlangıçta gizli) + self.format_label = QLabel("Dosya uzantısı seçin:") + self.format_label.setStyleSheet("color: #eeeeee;") + self.format_combo = QComboBox() + self.format_combo.addItems(["Dosya Uzantısı Seçin!", "txt", "doc", "docx", "rtf", "html", "htm", "xls", "xlsx", "csv", "ods", "json", "xml", "sql", "mdb", "accdb", "py", "js", "php", "java", "c", "cpp", "sh", "bat"]) + self.format_combo.setStyleSheet("color: #eeeeee; background-color: #1e1e1e;") + self.format_label.hide() + self.format_combo.hide() + + # Kök dizin arama için CheckBox + self.root_directory_checkbox = QCheckBox("Bağlı disklerde ara") + self.root_directory_checkbox.setStyleSheet("color: #eeeeee;") + + # Dosya içeriklerinde arama için CheckBox + self.content_search_checkbox = QCheckBox("Dosya içeriklerinde ara") + self.content_search_checkbox.setStyleSheet("color: #eeeeee;") + + # Sonuç sayısı etiketi + self.result_count_label = QLabel() + self.result_count_label.setAlignment(Qt.AlignCenter) + self.result_count_label.setStyleSheet("color: #66ff66; font-size: 16px;") + + # Layout oluşturma + input_layout = QHBoxLayout() + input_layout.addWidget(self.input) + input_layout.addWidget(self.search_button) + input_layout.addWidget(about_button) + + main_layout = QVBoxLayout() + main_layout.addWidget(logo_label) + main_layout.addWidget(self.label) + main_layout.addLayout(input_layout) + main_layout.addWidget(self.root_directory_checkbox) + main_layout.addWidget(self.content_search_checkbox) + main_layout.addWidget(self.format_label) + main_layout.addWidget(self.format_combo) + main_layout.addWidget(self.result_list) + main_layout.addWidget(self.result_count_label) + self.setLayout(main_layout) + + # Sinyaller ve slotlar + self.search_button.clicked.connect(self.search_file) + self.content_search_checkbox.stateChanged.connect(self.toggle_format_options) + self.result_list.itemClicked.connect(self.open_file_location) + about_button.clicked.connect(self.show_about_dialog) + + def show_about_dialog(self): + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def toggle_format_options(self): + if self.content_search_checkbox.isChecked(): + self.format_label.show() + self.format_combo.show() + else: + self.format_label.hide() + self.format_combo.hide() + + def search_file(self): + search_query = self.input.text().strip() + selected_format = self.format_combo.currentText() if self.content_search_checkbox.isChecked() else None + + if not search_query: + QMessageBox.warning(self, "Hata", "Lütfen aranacak kelimeyi veya dosya adını girin.") + return + + self.result_list.clear() + self.result_list.setEnabled(False) + self.result_count_label.clear() + self.label.setText("Arama yapılıyor, lütfen bekleyin...") + self.label.setStyleSheet("color: #ffcc00;") + QApplication.processEvents() + + try: + if self.root_directory_checkbox.isChecked(): + search_paths = ["/media", "/mnt"] # diskler ve bağlı cihazlar + else: + search_paths = [os.path.expanduser("~")] # Kullanıcı ev dizini + + search_path = ' '.join(search_paths) # Tüm dizinleri birleştir + + if selected_format == "Tüm Dosyalar" or not selected_format: + search_command = f"find {search_path} -type f 2>/dev/null" + else: + search_command = f"find {search_path} -type f -name '*.{selected_format}' 2>/dev/null" + + result = subprocess.check_output(search_command, shell=True, text=True) + file_paths = result.strip().split("\n") + + matching_files = [] + + if self.content_search_checkbox.isChecked(): + for file_path in file_paths: + try: + with open(file_path, "r", encoding="utf-8", errors="ignore") as file: + content = file.read() + if search_query in content: + matching_files.append(file_path) + except Exception: + continue + else: + for file_path in file_paths: + if search_query in os.path.basename(file_path): + matching_files.append(file_path) + + if matching_files: + for file in matching_files: + self.result_list.addItem(file) + self.result_list.setEnabled(True) + self.label.setText("Arama tamamlandı. Listeden seçim yapabilirsiniz.") + self.label.setStyleSheet("color: #66ff66;") + self.result_count_label.setText(f"Sonuç sayısı: {len(matching_files)}") + else: + self.label.setText("Hiçbir sonuç bulunamadı.") + self.label.setStyleSheet("color: #ff6666;") + except subprocess.CalledProcessError: + self.label.setText("Arama sırasında bir hata oluştu.") + self.label.setStyleSheet("color: #ff6666;") + except Exception as e: + self.label.setText(f"Bir hata oluştu: {e}") + self.label.setStyleSheet("color: #ff6666;") + + + def open_file_location(self, item): + file_path = item.text() + file_dir = os.path.dirname(file_path) + try: + if sys.platform.startswith('linux'): + subprocess.run(["xdg-open", file_dir]) + elif sys.platform.startswith('win32'): + os.startfile(file_dir) + elif sys.platform.startswith('darwin'): + subprocess.run(["open", file_dir]) + else: + QMessageBox.warning(self, "Hata", "Dosya yöneticisi açılamadı.") + except Exception as e: + QMessageBox.critical(self, "Hata", f"Dosya yolunu açarken bir hata oluştu: {e}") + +if __name__ == "__main__": + app = QApplication(sys.argv) + if ICON_PATH: + app.setWindowIcon(QIcon(ICON_PATH)) + window = FileSearchApp() + window.show() + sys.exit(app.exec_()) diff --git a/searcher/searcherlo.png b/searcher/searcherlo.png new file mode 100644 index 0000000..ac7db77 Binary files /dev/null and b/searcher/searcherlo.png differ diff --git a/searcher_svg.svg b/searcher_svg.svg new file mode 100644 index 0000000..fd810d5 --- /dev/null +++ b/searcher_svg.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/searcherlo.png b/searcherlo.png new file mode 100644 index 0000000..ac7db77 Binary files /dev/null and b/searcherlo.png differ diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..8533ac1 --- /dev/null +++ b/setup.py @@ -0,0 +1,28 @@ +from setuptools import setup, find_packages + +setup( + name="searcher", # Paket adı + version="1.0", # Paket sürümü + description="Searcher - Advanced Search Manager", # Paket açıklaması + author="Fatih Önder", # Paket sahibi adı + author_email="fatih@algyazilim.com", # Paket sahibi e-posta adresi + url="https://github.com/cektor/Searcher", # Paket deposu URL'si + packages=find_packages(), # Otomatik olarak tüm alt paketleri bulur + install_requires=[ + 'PyQt5>=5.15.0', # PyQt5 bağımlılığı (versiyon sınırı belirtilmiş) + 'Pillow>=8.0.0', # Pillow bağımlılığı (versiyon sınırı belirtilmiş) + 'PyPDF2>=1.26.0', # PyPDF2 bağımlılığı (versiyon sınırı belirtilmiş) + ], + package_data={ + 'searcher': ['*.png', '*.desktop'], # 'searcher' paketine dahil dosyalar + }, + data_files=[ + ('share/applications', ['searcher.desktop']), # Uygulama menüsüne .desktop dosyasını ekler + ('share/icons/hicolor/48x48/apps', ['searcherlo.png']), # Simgeyi uygun yere ekler + ], + entry_points={ + 'gui_scripts': [ + 'searcher=searcher:main', # `searcher` modülündeki `main` fonksiyonu çalıştırılır + ] + }, +)