KtRssReader icon indicating copy to clipboard operation
KtRssReader copied to clipboard

How to custom data base on RssStandardChannel

Open 287138531 opened this issue 1 year ago • 17 comments

//// < i t e m> // <torznab:attr name="seeders" value="1" /> // <torznab:attr name="peers" value="1" /> // .... // other like RssStandardItem /////

287138531 avatar Aug 31 '23 08:08 287138531

and i use ksp 1.9.0-1.0.12 in android i need rebuild every time before i run app or tips Unresolved reference: XXXParser

and i just need XXXParser.parse("xml...") but seem err in use ksp by com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1

287138531 avatar Aug 31 '23 08:08 287138531

Hey, you have to define the custom parser by using annotations, see "Custom Data Parsers" for more information. And don't forget to add the necessary dependencies. Please also provide the error log, it's helpful to debug and understand your issue.

ivanisidrowu avatar Sep 01 '23 02:09 ivanisidrowu

1.i know custom parser by using annotations,but to many variable and the same,I just need to add some fields.
Whether methods can be added to support this feature? 2.I wonder if ksp isn't already available by
const val KtRssReader = "com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1" const val KtRssReaderAnnotation = "com.github.ivanisidrowu.KtRssReader:annotation:v2.2.1" const val KtRssReaderProcessor = "com.github.ivanisidrowu.KtRssReader:processor:v2.2.1" 3.when i use com.github.ivanisidrowu.KtRssReader:kotlin:v2.2.1 rebuild ineffectiveness image 4.when i use com.github.ivanisidrowu.KtRssReader:android:v2.2.1 it can use by rebuild ,but!!!!! when i edit my other code, and run ,also get err image

287138531 avatar Sep 01 '23 04:09 287138531

Would you mind providing XML and data classes code snippet that generates JacketRssChannelParser?

ivanisidrowu avatar Sep 01 '23 04:09 ivanisidrowu

如果你不介意,我們也可以用中文討論 🙏

ivanisidrowu avatar Sep 01 '23 04:09 ivanisidrowu

有qq?xml似乎贴不上来

287138531 avatar Sep 01 '23 04:09 287138531

@RssTag(name = "channel") data class JacketRssChannel( val title: String?, val description: String?, val link: String?, val language: String?, ) : Serializable

287138531 avatar Sep 01 '23 04:09 287138531

只是很简单的一个测试demo,反正如果只用kotlin这个依赖,是会报错的,非要用android那个依赖,重新编译,能行,但是一旦我改了别的代码, 尝试 run app 的时候,又要重新编译,否则也报错

287138531 avatar Sep 01 '23 04:09 287138531

@ivanisidrowu

嗨 Ivan 目前初步看起來我們在使用 ksp generate 新的 changed file 的時候,並不會保留舊的 generated files 所以導致舊的 generated files 會被移除

測試手法

  1. 在 sample app 加上 Reporter 提供的 JacketRssChannel
@RssTag(name = "channel")
data class JacketRssChannel(
    val title: String?,
    val description: String?,
    val link: String?,
    val language: String?,
) : Serializable
  1. Run ./gradlew kspDebugKotlin

  2. 查看ksp generated 路徑 sample/build/generated/ksp/debug/kotlin/tw/ktrssreader/generated 應該要有原本 sample 提供的 RssDataParser, RssItemParser, RssOrderDataParser, etc.

看起來要在 KspProcessor ParserGenerator 內的 writeTo() 方法來添加originatingKSFiles參數 keep 原本的 generated files. refs: https://github.com/google/ksp/issues/1231

e.g.

AndroidReaderParserGenerator(
                    rootClassName = classDeclaration.simpleName.asString(),
                    rootClassPackage = classDeclaration.packageName.asString(),
                    logger = logger
                ).generate().writeTo(
                    codeGenerator = codeGenerator,
                    aggregating = false,
                    originatingKSFiles = listOf(classDeclaration.containingFile!!)
                )

dev-weiqi avatar Sep 02 '23 05:09 dev-weiqi

@287138531

因為我們會使用 ksp 來對 JacketRssChannel 做操作, 若有對裡面的結構進行更動 可以試著先將以下路徑的資料夾移除 sample/build/generated/ksp/debug/kotlin/tw/ktrssreader/generated 接著執行 ./gradlew kspDebugKotlin 來重新編譯檔案,速度應該不會太慢 再請你試試這個workaround,確切問題我們會再討論修正,感謝你的回報🙏

dev-weiqi avatar Sep 02 '23 05:09 dev-weiqi

1.按照你上面的要求修改了AndroidReaderParserGenerator,经过测试,清除。。。/kotlin/tw/ktrssreader/generated 文件下所有内容,并执行./gradlew kspDebugKotlin,能生成正确的文件。 2。每次修改我的代码,都需要重新执行2的步骤,这和我最开始说的rebuild的解决方法并没有什么区别 3.其实我在安卓项目中使用,也只需要解析xml的功能,并不需要帮请求网络,以及flow部分的代码。希望单独引进kotlin部分也能实现,目前看你源码,安卓项目必须引入android依赖

287138531 avatar Sep 04 '23 02:09 287138531

还有这个问题,生成少了,分号 image

@RssTag(name = "channel")
data class JacketRssChannel(
    val title: String?,
    val description: String?,
    val link: String?,
    val language: String?,
    val category: String?,
    @RssTag(name = "item")
    val items: List<JacketRssItems>?
) : Serializable

@RssTag(name = "item")
data class JacketRssItems(
    val title: String?,
    val guid: String?,
    @RssTag(name = "jackettindexer")
    val jackettIndexerId: JackettIndexer?
) :Serializable

@RssTag(name = "jackettindexer")
data class JackettIndexer(
    @RssValue
    val value: String?,
    @RssAttribute(name = "id")
    val id: String?,
): Serializable

287138531 avatar Sep 04 '23 03:09 287138531

还有个问题,我反复看文档,和源码,也没搞懂,怎么解析下这种类型的面这个标签。。

      <torznab:attr name="category" value="8000" />
      <torznab:attr name="category" value="138096" />
      <torznab:attr name="genre" value="" />
      <torznab:attr name="seeders" value="1" />
      <torznab:attr name="peers" value="1" />
      <torznab:attr name="downloadvolumefactor" value="0" />
      <torznab:attr name="uploadvolumefactor" value="1" />

287138531 avatar Sep 04 '23 07:09 287138531

@dev-weiqi 好,謝謝幫忙回答 🙏

ivanisidrowu avatar Sep 04 '23 07:09 ivanisidrowu

@287138531 試試看用這個

@RssTag(name = "torznab:attr")
data class Torznab(
   @RssAttribute(name = "name")
   val name: String,
   @RssAttribute(name = "value")
   val value: Long,
)

ivanisidrowu avatar Sep 04 '23 07:09 ivanisidrowu

image image 基本上我都试过了,都是报错

287138531 avatar Sep 04 '23 08:09 287138531

感謝你的回報,我們會再討論和修正相關問題。🙇‍♂️

ivanisidrowu avatar Sep 04 '23 08:09 ivanisidrowu